Service
简述:
Service是四大应用组件(application component )之一,主要实现一个长时间运行且不需要与用户交互的程序,或者提供功能给其他应用来使用。和其他组件一样,每个Service需要在 AndroidManifest.xml中有对应的 < service > 标签声明。 Service 可以使用 Context.startService() 或 Context.bindService()启动。
Service在所属进程的主线程中运行。 这意味着如果你的Service打算运行占CPU或者可能产生阻塞的运算,它需要创建它的子线程来进行运算。IntentService类是可以已经实现的有自己子线程的Service类。
例子:
在一个MP3播放器的应用中,可能会有多个Activity让用户可以选择歌曲并播放歌曲,用户会认为不论在哪个活动下音乐都应该持续播放。在这个例子中,MP3播放器的活动会使用 Context.startService() 来启动一个service,从而可以在后台保持音乐的播放,直到这个 service 运行结束。
另外,还可以通过 Context.bindService() 方法,使Activity连接到一个服务上(如果服务还没有运行则将启动它)。当连接到一个服务之后,我们可以通过Service提供的接口与之进行通讯。如MP3播放器中,我们还需要进行暂停等操作。
正常使用,通过直接方法调用:
- 告诉系统在后台处理某些任务(注意默认还是在主线程下完成的)
定义在Context类中启动和停止服务的函数:
Context.startService(startIntent)
Context.stopService(stopIntent); - 应用公开出自己功能给其他应用的特性
Context.bindService() 可以与Service进行通信,指挥服务。
特殊使用:
使用AIDL提供远程接口,以实现跨进程调用Service。
生命周期
和Activity相似,Service 也有生命周期函数。
- 使用Context.startService()方法启动:
Context.startService()->onCreate()-> onSartCommand() ->启动
Context.stopService() or stopSelf() ->onDestroy() ->停止
如果Service已经运行,则只调用onSartCommand()
- 使用Context.bindService()方法启动:
Context.bindService()->onCreate()->onBind()->启动
onUnbind() -> onDestroy() –>停止
使用者会接受到从onBind(Intent)方法返回的IBinder对象,从而使用者可以回调Service中的方法。
活动和服务进行通信 :
在Service中创建Binder的子类,在其中实现需要的功能。
通过onBind()方法 将其实例返回。
在Acitivity中绑定服务,使用ServiceConnection的实例,重写onServiceConnected() onServiceDisconnected()方法,绑定时会调用其方法。
前台服务:
会一直有一个正在运行的图标在系统的状态栏显示。
在Service中调用startForeground();方法,并传入Notification对象。
IntentService
简述:
IntentService类也许是最常用的Service类了。它是专门用来处理异步请求的。
用户通过startService(Intent)函数发送请求(也就是Intent对象),IntentService随之启动,并在worker thread中处理每一条请求,完成所有请求后自动停止。
正常使用:
继承IntentService类,实现onHandleIntent(Intent)方法,在方法中实现对请求的处理。
工作流程:
接收到首个命令时, IntentService即完成启动,并触发一个后台线程,然后将命令放入队列。
随后, IntentService继续按顺序执行每一条命令,并同时为每一条命令在后台线程上调用onHandleIntent(Intent)方法。新进命令总是放置在队列尾部。最后,执行完队列中全部命令后,服务也随即停止并被销毁。
实际应用中,可以使用Service、AlarmManager、PendingIntent结合实现在后台长期执行定时任务的服务。