您的位置:首页 > 移动开发 > Android开发

android 四大组件之service学习总结(一)

2014-03-25 22:34 459 查看

1.官方API:



2.概述:

service是Android四大组件之一,其余的是activity、BroadcastReceiver、Content Provider。service是一个能够在后台执行长时操作的应用程序组件,它不提供用户界面。应用程序能够通过service来启动后台操作,不同应用程序也能够通过service来实现进程间通信(IPC)。

一个service被启动后,实际上还是运行在主线程中,即UI线程。若用户要执行比较耗时的操作,建议新建一个线程来处理;否则可以到UI线程阻塞,影响用户体验。


3.service种类:

service的种类有四种他们分别是Started Service、 Bound Service、Intent Service、AIDL。但是一般常见的只有前两种。

3.1、Started Service

按照字面意思是被启动的服务。它常用在执行进程的某个后台操作,例如网络请求、下载文件等。

要提供被启动的服务:首先,要创建一个继承于Service的类。然后,其它的应用程序可以通过startService()来启动该服务;若要停止服务,可以在应用程序中执行stopService(),也可以在服务中执行stopSelf()来停止服务。

当服务一旦启动,它就能够无限期的在后台运行,即使启动它的组件(这里指的是启动它的activity)被销毁。但是当杀掉该进程后服务将终止。通常,一个被启动的服务执行一个单一操作,并且不给调用者返回结果。若需要返回结果,可以通过广播(BroadcastReceiver)来实现。

3.2、Bound Service

字面意思是被绑定的服务。它也常被用在执行进程的某个后台操作,例如网络请求、下载文件等。

要提供被绑定的服务:首先,要创建一个继承于Service的类。然后,其它的应用程序可以通过bindService()来绑定该服务,绑定服务后,就可以调用服务提供的功能;若要解除服务,可以在应用程序中执行unbindService()。

拓展:

“Started Service”和“Bound Service”的主要区别:

(01) 启动/停止方式不同

若要启动“Started Service”,需要调用startService();要停止该服务,要调用stopService()或stopSelf()。

若要绑定“Bound Service”,则调用bindService();若要解除绑定,则要调用unbindService()。

(02) 实现接口不同

“Started Service”中,一般要实现service的onStartCommand()接口。因为startService()会调用onStartCommand()接口,我们一般在onStartCommand()中执行一些服务提供的功能,若启动一个线程用于下载。

“Bound Service”中,一般要实现service的onBind()接口。 onBind()函数要返回一个IBinder对象,客户端调用bindService()绑定该服务时被调用。这个绑定是异步的,bindService()方法会立即返回,并且不给客户端返回IBinder对象。要接收IBinder对象,客户端必须创建一个实现ServiceConnection类,并创建ServiceConnection的实例;然后在,bindService()方法中调用ServiceConnection的实例。

(03) 活跃生命周期不同

这里“活跃生命周期”(active lifetime)不同于“完整生命周期”(entire lifetime)。它们的完整生命周期都是起始于onCreat(),结束于onDestroy()。但“活跃生命周期”指的是服务仍然是活动状态。

“Started Service”的活跃生命周期开始于startService(),停止于stopService()或stopSelf()。一个“Started Service”可以被多次启动,每次启动都会调用service的onStartCommand()接口;但是,一旦stopService()或stopSelf()被调用,它的活跃生命周期即结束!

“Bound Service”的活跃生命周期开始于bindService(),停止于最后一个客户端调用unbindService()。意思是,“Bound Service”可以被多个客户端绑定,即多个客户端可以调用bindService()来绑定相同的服务。当第一个绑定服务的客户端调用bindService()时,“Bound Service”的活跃生命周期即开始了;当所有的客户端全部解除绑定时,它的活跃生命周期即结束了。



补充:一个service可以同时提供“Started Service”和“Bound Service”。要能提供开始的服务,需实现onStartCommand()接口;要能提供绑定的服务,需实现onBind()。同时实现两种接口,即能提供两种服务。

3.3、Intent Service

它的特性是对服务的请求逐个处理,而不能同时处理多个请求。

要提供IntentService:首先,要创建一个继承于Service的类。然后,其它的应用程序可以通过startService()来启动该服务;若要停止服务,可以在应用程序中执行stopService(),也可以在服务中执行stopSelf()来停止服务,另外,IntentService中的请求被处理完毕,它也会自动停止。

由于“IntentService”和“Started Service”的启动和停止方式一致,我们这里介绍一下它们的主要区别:

(01) 实现原理不同

IntentService内部有一个工作队列,逐个对任务进行处理。因为不必担心多线程的问题。

“Started Service”支持单线程或多线程,但必须我们自己在服务中实现。

(02) 实现的API不同

IntentService必须实现onHandleIntent()接口,在onHandlerIntent()中启动IntentService的Intent进行处理。

“Started Service”要实现onStartCommand()接口,服务所需提供的功能,一般在该接口中处理。

(03) 生命周期不同

IntentService中所有的启动请求都被处理之后会自动终止这个服务,因此你不需要自己去调用stopSelf()方法。

“Started Service”的生命周期开始于startService(),停止于stopService()或stopSelf()。

3.4、AIDL

AIDL(Android Interface Definition Language),是用来来完成进程间通信(IPC)。

一般在服务需要接受不同应用多线程的请求时才需要使用AIDL;如果是同一个应用内的请求使用Binder实现即可;如果只是应用间通信而不是多线程处理的话使用Messenger,当然这两种情况也可以使用AIDL。本地进程和远程进程使用AIDL有所不同,本地进程内调用时会都在调用的线程内执行,远程进程使用是通过Service进程内一个由系统维护的线程池发出调用,所以可能是未知线程同时调用,需要注意线程安全问题。

4.生命周期



5.要实现的方法

onStartCommand():当其它程序调用startService()时,系统会自动调用该函数。且一旦执行了该函数,服务就被启动了。此时,启动的服务是“Started Service”。

onBind():当其它程序调用bindService()时,系统会自动调用该函数。一旦执行了该函数,服务就被启动了。此时,启动的服务是“Bounder Service”。若要提供绑定功能,则必须实现该函数,并且要返回IBinder对象;若不想提供绑定功能,则可以直接返回null。

onUnbind():当其它程序调用unbindService(),系统会自动调用该函数。

onCreate():服务被创建时,系统会自动调用该函数。一般在该函数中进行初始化工作,例如:新建线程。

onDestroy():在服务被销毁时,系统会自动调用该函数。一般在该函数中进行清除工作,例如,终止并回收线程。

6.manifest注册

很简单,在<application>中加入

<serviceandroid:name=".ExampleService"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: