第八章Service详解_第1页
第八章Service详解_第2页
第八章Service详解_第3页
第八章Service详解_第4页
第八章Service详解_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第八章第八章Service详解详解 倚动软件工厂实验室倚动软件工厂实验室 主要内容主要内容ServiceService简介简介Service是android 系统的四大组件之一,是与Activity最相似的组件,它们都是从Context派生出来的,但它不能自己运行,只能在后台运行,可与其它组件进行交互,相当于一个没有图形界面的Activit组件。它需要通过某一个它需要通过某一个Activity或者其他或者其他Context对对象来调用象来调用。用途:实现后台运行和跨进程访问。通过启动一个服务,可以在不显示界面的情况下在后台运行指定的任务,这样可以不影响用户做其他事情,如后台播放音乐,下载资源等

2、。 Service类常用方法类常用方法 与开发其它Android组件类似,开发Service组件需要先开发一个Service子类,该类需继承系统提供的Service类,与Activity类似,Service也定义了一系列生命周期方法: abstract IBinder onBind(Intent intent):该方法是一个抽象方法,所有Service的子类必须实现该方法。该方法将返回一个IBinder对象,应用程序可通过该对象与Service组件通信;void onCreate():当Service第一次被创建时,将立即回调该方法;Service类常用方法类常用方法void onDestro

3、y():当Service被关闭之前,将回调该方法;void onStartCommand(Intent intent, int flags,int startId):该方法的早期版本是void onStart(Intent intent, int startId),每次客户端调用startService(Intent intent)方法启动该Service时都会回调该方法;boolean onUnbind(Intent intent):当该Service上绑定的所有客户端都断开连接时将会回调该方法。Service开发步骤开发步骤u 开发开发Service组件需要先开发一个组件需要先开发一个Se

4、rvice子类,然后在子类,然后在AndroidManifest.xml文件中配置该文件中配置该Service,配置时可通过,配置时可通过元素指定它可被哪些元素指定它可被哪些Intent启动。启动。u 在AndroidManifest.xml文件中配置Service: 注意事项注意事项u Action中的值一定要与程序中创建的Intent的Action的值一致,程序是根据Action的值来查找相应的Service从而启动它。u 在为Service注册后,我们便可以通过startService()或BindService()方法来启动该Service。通过stopService()来停止Serv

5、ice,unbindService()来解除与Service的绑定。Service启动方法启动方法Android系统中,启动Service有两种方式:u通过Context的startService()启动Service,访问者与Service之间没有关联,该Service将一直在后台执行,即使调用startService的进程结束了,Service仍然还存在,直到有进程调用stopService,或者Service结束自己(stopSelf()。这种情况下,Service与访问者之间无法进行通信、数据交换。u通过Context的 bindService()方法启动,Service就和调用bin

6、dService的组件绑定在一起,也就是说当调用bindService的组件销毁了,那么它绑定的Service也要跟着被结束。Service启动方法启动方法注意注意:(1)一个服务可以与多个组件绑定,只有当所有的组件都与之解除绑定,该服务才会被销毁。(2)以上两种启动Service的方法可以混合使用,只要Service同时实现了onStartedCommand() 和onBind()方法,那么只有调用stopService(),并调用unbindService()方法后,该Service才会被销毁。bindServicebindService方法方法 Context(调用服务组件)的bindS

7、ervice()方法的完整方法签名为:bindService(Intent service,ServiceConnection conn, int flags),该方法的三个参数解释如下: service:该参数表示与服务类相关联的Intent对象,用于指定所要启动的Service; flags:指定绑定时是否自动创建Service(如果Service还未创建)。该参数可指定0(不自动创建)或BIND_AUTO_CREATE(自动创建)。bindServicebindService方法方法 conn:该参数是一个ServiceConnection对象,该对象用于监听访问者与Service之间的

8、连接情况。当访问者与Service之间连接成功时,将回调该ServiceConnection对象的onServiceConnected(ComponentName name,IBinder service)方法;当访问者与Service之间断开连接时将回调该ServiceConnection对象的onServiceDisconnected(ComponentName name)方法。onBindonBind方法方法(Service)(Service)u 当开发Service类时,该Service类必须提供一个onBind()方法,在绑定本地Service的情况下,onBind()方法所返回的I

9、Binder接口将会传给ServiceConnection对象里onServiceConnected(ComponentName name,IBinder service)方法的service参数,这样访问者就可以通过IBinder接口与Service进行通信,对Service中的数据进行操作。u 实际开发时通常会采用继承Binder类类(IBinder接口的实现类)的方式实现自己的IBinder接口。案例案例(FirstService)1、通过、通过Context的的startService()方法启动和停止()方法启动和停止Service2、通过、通过Context的的bindServic

10、e()方法绑定和解除绑定()方法绑定和解除绑定3、两种方式混合使用、两种方式混合使用ServiceService详解详解两种方式混合使用时,方法的执行顺序是怎么样的?两种方式混合使用时,方法的执行顺序是怎么样的?问题与讨论问题与讨论1、先启动后绑定、先启动后绑定2、先绑定后启动、先绑定后启动案例总结案例总结ServiceService的生命周期的生命周期u 每当Service被创建时会回调onCreate方法,每次Service被启动时都会回调onStartCommand方法,多次启动一个已有的Service组件将不会再回调onCreate方法,但每次启动时都会回调onStartCommand

11、方法。u 绑定服务的执行过程: 执行单击事件方法根据Intent找到相应的Service类,并初始化该类调用Service的onCreate方法调用该类的onBind方法调用Activity的onServiceConnected方法。u 多次单击绑定服务按钮,并不会重复执行绑定方法。一旦解绑,调用unBind()方法,然后自动销毁。AIDLAIDL简介简介u AIDL是一种接口定义语言,用于约束两个进程间通信规则,供编译器生成代码,实现Android设备上的两个进程间通信(IPC)。u进程之间的通信信息,首先会被转换成AIDL协议消息,然后发送给对方,对方收到AIDL协议消息后再转换成相应的对

12、象。u由于进程之间的通信信息需要双向转换,所以android采用代理类在背后实现了信息的双向转换,代理类由android编译器生成,对开发人员来说是透明的。AIDL:Android Interface Definition LAIDLAIDL简介简介u 客户端访问Service时,Android并不是直接返回Service对象给客户端,Service只是将一个回调对象(IBinder对象)通过onBind()方法回调给客户端。u 与绑定本地Service不同的是,本地Service的onBind()方法会直接把IBinder对象本身传给客户端的ServiceConnection的onServi

13、ceConnected方法的第二个参数。但远程Service的onBind()方法只是将IBinder对象的代理传给客户端的ServiceConnection的onServiceConnected方法的第二个参数。当客户端获取了远程的Service的IBinder对象的代理之后,接下来可通过该IBinder对象去回调远程Service的属性或方法。AIDLAIDL简介简介 AIDL定义接口的源代码必须以.aidl结尾; AIDL接口中用到数据类型,除了基本类型、String、List、Map、CharSequence之外,其他类型全部都需要导包,即使它们在同一个包中也需要导包。 定义好AIDL

14、接口之后(如Song.aidl),ADT工具会自动在gen目录下生成相应的包,并生成一个Song.java接口,在该接口里包含一个Stub内部类,该内部类实现了IBinder、Song两个接口,这个Stub类将会作为远程Service的回调类。它内部能实现一些功能。 开发客户端的第一步就是将Service端的AIDL接口文件复制到客户端应用中,复制到客户端后ADT工具会为AIDL接口生成相应的Java接口类。AIDL使用时需注意:使用时需注意:客户端访问客户端访问AIDLServiceAIDLService 1、创建、创建ServiceConnection对象;对象; 2、以、以Service

15、Connection对象作为参数,调用对象作为参数,调用Context的的bindService()方法绑定远程方法绑定远程Service。 3、将返回的、将返回的IBinder对象的代理类转换成对象的代理类转换成IBinder对象,对象,从而调用从而调用Service中的相应方法。中的相应方法。 客户端绑定远程Service与绑定本地Service的区别不大,同样只需要三步:案例案例 通过一个按钮来获取远程通过一个按钮来获取远程ServiceService的状态,并显示在的状态,并显示在两个文本框中。两个文本框中。 【示例代码:示例代码:codes/08/ADILClientcodes/08

16、/ADILClient】案例案例 假设A应用需要与B应用进行通信,调用B应用中的getColor()、getWeight()方法,B应用以Service方式向A应用提供服务。(我们可以把A应用看成是客户端,B应用看成是服务端,分别命名为AIDLClient 、AIDLServer)。整个过程需要以下四步: 1、在Server端编写AIDL文件package .android;interface SongString getName();String getAuthor();案例案例u 编写Aidl文件时,需要注意注意: 1.接口名和aidl文件名相同; 2.接口和方法前不用加访问权限修饰符pu

17、blic,private等,也不能用final,static; 3.Aidl默认支持的类型包话java基本类型(int、long、boolean等)和(String、List、Map、CharSequence),使用这些类型时不需要import声明。对于List和Map中的元素类型必须是Aidl支持的类型。如果使用自定义类型作为参数或返回值,自定义类型必须实现Parcelable接口。 4.自定义类型和AIDL生成的其它接口类型在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中。 5.在aidl文件中所有非Java基本类型参数必须加上in、out、inout标记,以指

18、明参数是输入参数、输出参数还是输入输出参数。 6.Java原始类型默认的标记为in,不能为其它标记。案例案例u 当完成aidl文件创建后,eclipse会自动在项目的gen目录中同步生成Song.java接口文件。接口文件中生成一个Stub的抽象类,里面包括aidl定义的方法,还包括一些其它辅助性的方法。u 对于远程服务调用,远程服务返回给客户端的对象为代理对象,客户端在onServiceConnected(ComponentName name, IBinder service)方法引用该对象时不能直接强转成接口类型的实例,而应该使用asInterface(IBinder iBinder)进行

19、类型转换。案例案例 2、在ADILServer应用中实现aidl文件生成的接口(本例是Song),但并非直接实现接口,而是通过继承接口的Stub来实现(Stub抽象类内部实现了aidl接口),并且实现接口中的方法。public class SongBinder extends Stubpublic String getName() throws RemoteException return name;public String getAuthor() throws RemoteException return author;案例案例 3、把AIDLService应用中aidl文件所在package连同aidl文件一起拷贝到客户端AIDLClient应用,eclipse会自动在A应用的gen目录中为aidl文件同步生成ICat.java接口文件,接下来就可以在AIDLClient应用中实现与AIDLService应用通信。AIDLClie

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论