Android中Service的理解与使用
Android四大大组件
Activity:带界面的。
BroadcastReceiver:广播接收者,不带界面,当对应的广播事件发出来的时候,它就可以收到。
ContentProvider:内容提供者,主要用于暴露数据给其他的应用程序去使用。
Service:服务可以在后台运行的,不带界面的。
1.Service服务
1.1.服务的写法:
第一步:写个类去继承服务Service
第二步:重写服务的oncreate,ondestroy方法,OnCreate:服务对象创建的时候会执行Ondestroy: 服务对象销毁的时候会执行。
第三步:服务需要到清单文件中注册. <serviceandroid:name="cn.itcast.servicequickstart.QuickStartService"></service>
2.为什么需要服务:需要去翻看文档,Java的doc的文档,一般都是程序自动生成的,在看的时候,一般都去到文档的目录下找一个叫做index.html的文档。这个是一个常识。
Android系统会让一个应用程序的进程活的尽可能的长,但是也会去回收老的进程以便于新的或者更加重要的进程可以顺畅的跑起来。
为了能够决定哪些进程先被杀死,哪些后被杀死,android系统中将进程按照优先级做了划分,优先级最低最先被干掉.然后以此类推,从而去回收系统的资源。
进程按照优先级分为5种:
第一种:前台进程,一个应用程序有组件正在运行着,获得了焦点,可以响应用户的点击触摸事件。
第二种:可视进程,一个应用程序有组件正在运行着,但是失去了焦点,只是还看得见。
第三种:服务进程,如果一个应用程序中一个service在后台长期运行着,那么就可以称之为服务进程。
第四种:后台进程,一个应用程序中没有service在后台运行,只有activity其他的组件在切换到了后台,那么就是属于后台进程。
第五种:空进程,一个应用程序中没有任何组件在运行着,那么就是属于空进程。
3.开启服务的生命周期:服务创建的时候会调用oncreate的方法然后服务就一直在后台运行着,开启服务的时候会调用startService,那么服务的onstartCommand会执行,多次开启服务,并不会多次创建服务,服务只能被创建一次,多次开启只会重复调用onstartCommand,服务销毁的之后会调用ondestroy方法。
开启服务,服务后会一直在后台运行着,与开启服务的组件activity没有关系了。
4.本地服务中的方法调用:本地服务的调用一般用的不多,大家可以将远程服务调用的代码好好写写。
5.远程服务调用:
5.1.第一部分--支付宝:编写支付宝的应用程序.需要有个服务.服务与早上写的类似.A)publicclassAlipayServiceextendsServiceB)自动的会覆盖onBind的方法C)编写一个私有的内部类,去继承一个由aidl文件生成的接口的Stub内部类。打开生成的.java类,发现里面有一个内部类Stub,继承了Binder,实现了IAlilpayNeixian的接口。AIDL)让编写的私有的内部类(内线)去继承Stub类//内线类去调用pay的方法,从而完成支付
privateclassAlipayNeixianextendsIAlipayNeixian.Stub{
@Override
publicbooleancallPay(Stringaccount,doublemoney){ returnpay(account,money);} } )
在onBind方法中return内线的实例对象
@Override
publicIBinderonBind(Intentintent){
System.out.println("onBind服务被绑定了...");
returnnewAlipayNeixian();
}
编写服务中最终要被调用到的方法pay方法
publicbooleanpay(Stringaccount,doublemoney){
System.out.println(account+"帐号,支付了"+money);
returntrue;}
到清单文件中,配置AlipayService,由于一会需要让美团可以去激活这个服务,所以需要配置隐式意图。
<!--配置隐式意图-><serviceandroid:name="cn.itcast.alipay.AlipayService">
<intent-filter><actionandroid:name="cn.itcast.ALIPAY"/></intent-filter></service>
5.2.第二部分---美团:由于aidl用于规定两个不同应用程序之间通信的一个规则,所以这里需要将支付宝中的那个aidl文件直接copy过来.注意,需要带包名copyA)编写布局文件B)编写布局文件中按钮点击的逻辑.C)调用服务中的方法编写具体的逻辑绑定服务.
publicvoidbind(Viewv){//Intentintent=newIntent(this,AlipayS)Intentintent=newIntent();intent.setAction("cn.itcast.ALIPAY");mConn=newMyServiceConnection();//绑定服务bindService(intent,mConn,BIND_AUTO_CREATE);}
//Connecetion内部类的逻辑privateclassMyServiceConnectionimplementsServiceConnection{@OverridepublicvoidonServiceConnected(ComponentNamename,IBinderservice){//之前是强转,现在就不用了.mNeixian=IAlipayNeixian.Stub.asInterface(service);}@OverridepublicvoidonServiceDisconnected(ComponentNamename){}}6.关于aidl技术:Aidl---androidintefacedefinitionlanguage---安卓接口定义语言.主要用于规定进程间通信的规则.在编写aidl文件的时候,注意写法与写接口很类似.首先写接口,写完后把public这样的访问修饰符干掉.其余照搬过来.扩展名记得要改成.aidl,这些写好了之后,刷新,会自动的生成.java类在gen的目录下.例如:如果aidl文件的方法中的接收的参数,还有返回值是8种基本数据类型或者String类型的数据,那么可以直接写.但是如果接收的参数或者返回值的类型是复杂的类型(对象类型的数据),这个时候对应的对象数据类型的类必须要去实现Parceable的接口或者Serializable的接口.关于aidl文件更多的内容,请参考官方文档.7.绑定服务的生命周期(了解):8.混合开启服务(了解):开启服务服务可以一直在后台运行,但是不能直接调用服务中的方法绑定服务服务不可以一直在后台运行,但是可以调用服务中的方法.既可以长期的在后台运行,又可以调用服务中的方法,那么就会自然而然想到混合开启.混合开启请严格按照如下的顺序去编程====多媒体编程====多媒体:多种媒体的一个集合...图形,声音,视频,传感器,照相机,动画....9.图形处理相关:9.1.显示普通的小图片://让图片显示到ImageView中Bitmapbitmap=BitmapFactory.decodeFile("/mnt/sdcard/bb.jpg");mIv_pic.setImageBitmap(bitmap);9.2.显示大图片(重要):大图片,由于占用的内存空间比较大,很多时候需要进行缩放处理.缩放处理,需要找到合适的缩放比1.需要知道图片的宽高信息,
//Extendedinformation接口ExifInterfaceinfo=newExifInterface("/mnt/sdcard/big.jpg");intp_w_picpathWidth=info.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH,0);intp_w_picpathHeight=info.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH,0);System.out.println("p_w_picpathWidth:"+p_w_picpathWidth+",p_w_picpathHeight:"+p_w_picpathHeight);2.需要知道手机屏幕的宽高信息.
intscreenWidth=getWindowManager().getDefaultDisplay().getWidth();intscreenHeight=getWindowManager().getDefaultDisplay().getHeight();System.out.println("screenWidth:"+screenWidth+",screenHeight:"+screenHeight);//3.基于图片的宽高和屏幕的宽高找到合适的缩放的比
intscale1=p_w_picpathWidth/screenWidth;//5intscale2=p_w_picpathHeight/screenHeight;//7//拿到缩放比intscale=0;if(scale1>=scale2){scale=scale1;}else{scale=scale2;}Optionsopts=newOptions();opts.inSampleSize=scale;//4,宽高都变为原来的1/4,那么就变成了1/16Bitmapbitmap=BitmapFactory.decodeFile("/mnt/sdcard/big.jpg",opts);10.常规的图片的处理:图片可以缩放,旋转,平移,倒影,镜面10.1.核心的代码:
//显示处理后的图//参考了现实生活中画画临摹的过程来实现的.//这个bitmap目前是一个空白的bitmap,什么都没有,//只是有了宽高,以及配置信息.BitmapcreateBitmap=Bitmap.createBitmap(orginalBitmap.getWidth(),orginalBitmap.getHeight(),orginalBitmap.getConfig());//画布---CanvasCanvascanvas=newCanvas(createBitmap);Matrixmatrix=newMatrix();//矩阵Paintpaint=newPaint();//画笔canvas.drawBitmap(orginalBitmap,matrix,paint);//显示处理后的图mIv_processed.setImageBitmap(createBitmap);10.2.处理:l缩放://宽高各变为原来的60%//matrix.setScale(0.6f,0.6f);l平移:matrix.setTranslate(100,0);//向x轴正方向平移100像素l旋转:matrix.setRotate(40);//旋转40度//围绕着图片的中心旋转90度matrix.setRotate(90,createBitmap.getWidth()/2,createBitmap.getHeight()/2);l镜面:在x轴的值变为负值之后,再进行平移.matrix.setScale(-1,1);matrix.postTranslate(createBitmap.getWidth(),0);l倒影:matrix.setScale(1,-1);matrix.postTranslate(0,createBitmap.getHeight());具体的参考代码作业:1.服务的5种优先级.2.服务开启后会一直在后台运行..3.美图调用支付宝4.图形显示大图片.获得图片的宽高.屏幕的宽高.5.效果...
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。