在前面章节已经学习了Android中最常见的组件Activity,Activity在一段程序里最多只可以被激活一次,而且激活之后所执行的时间也是有一定限制的。想象一下,如果想在听歌的时候还想继续和朋友聊天,这时多种工作同时进行的时候就需要用到Android中的另外一个组件——Service组件。
相对于Activity,Service同属于Android中的四大组件之一。但是Activity具有用户界面程序,而Service则是生命周期较长,但不具备用户界面的程序,这是两者之间最大的区别。
1.本地Service
本地服务(Localservice)是依附在主要进程的服务。使得节约了资源问题,此外,因为是位于同一个进程,所以不需要IPC和AIDL,但是它的缺点也是十分明显:程序结束后服务直接终止。
无论如何,服务都不可自己运行,需要通过调用startService()或bindService()方法启动服务。这两个方法都可以启动Service,但是它们也同样有所区别。
1)使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出,服务仍然运行。
采用startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。
如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。
采用startService()方法启动的服务,主要用于启动一个服务执行后台任务,不进行通信,停止服务使用stopService。
2)使用bindService()方法启用服务,调用者与服务绑定在一起,调用者一旦退出,服务也就终止。(www.xing528.com)
onBind()只有采用bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
采用bindService()方法,启动服务时只能调用onUnbind()方法解除调用者与服务解除,该方法启动的服务要进行通信,停止服务使用unbindService。
2.Service的生命周期
Service和Activity的生命周期是类似的,都是从它们创建的时候开始到最终销毁。Service相对于Activity整个过程则简单许多。Service有着多种启动方式,但是无论是哪种启动方式,当Service第一次被创建都会调用onCreate()方法,然后当Service被启动时调用onStart(),当停止Service时则执行onDestroy()方法,但是如果需要再一次启动Service时不需要再次执行onCreate()方法,而是直接执行onStart()方法。
当Service被Activity调用方法Context.startService启动后,该Service都在后台运行,不会自动关闭,不管对应程序的Activity是否在运行,直到被调用stopService,或自身的stopSelf方法或者系统关闭。不过当Service被某个Activity调用Context.bindService方法绑定启动,onCreate方法只会调用一次,onStart方法不会被调用。当连接建立之后,Service将会一直运行,除非调用Context.unbindService断开连接或者之前调用bindService的Context不存在(如Activity被finish的时候),系统将会自动停止Service,对应onDestroy将被调用。当一个Service被终止(①调用stopService;②调用stopSelf;③不再有绑定。)的连接(没有被启动)时,onDestroy方法将会被调用,这时应当做一些清除工作,如停止在Service中创建并运行的线程。
3.进程中的Service
Android系统中的各应用程序都运行在各自的进程中,进程之间通常是无法进行内存共享,所以就需要用一些方法使不同数据之间进行数据交换,AIDL(android interface define language)Android接口定义语言,提供了跨进程调用Service的功能。
AIDL用于约束两个进程之间的通信规则,它使得两个进程之间形成了一种通信协议并通过这个协议使进程之间通信进行了规范,当两个进程之间进行通信时,它们之间的通信信息首先会被转化成AIDL的协议信息,然后发送给对方,接收到信息后,再将这种AIDL信息转化成相应的对象,并且这种交流还是双向的。
建立AIDL文件和Java接口定义类似,此处不再阐述,只需注意以下几点:①定义接口的源代码必须.aidl,结尾接口名和文件名一样;②接口和方法前不可加修饰符;③AIDL文件中所有非Java参数必须加标记;④使用Java的基本类型时不用加IMPORT声明。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。