1、Service的概念及应用场景
service是一个没有用户界面的后台运行执行耗时操作的应用组件。
其他应用程序组件能够启动service,并且当用户切换到另外的应用场景
service将保持后台运行。另外,如果一个组件能够绑定到一个service,
那么就可以与之交互。例如:(IPC),一个service可能会处理网络操作,
或者比如播放音乐,操作文件IO,或者操作ContentProvider,所有这些耗时
操作均需要在service中执行。
2、Service的分类
类结构
java.lang.Object
android.content.Context
android.content.ContextWrapper
android.app.Service
……SubClass
直接子类:
IntentService:它作为Service的直接子类,主要用于处理异步耗时
操作,所有的工作都运行在一个子线程中(HandleThread),并且
具有执行完任务,自动onDestory()。
MediaRouteProvideService:它主要用于SD卡的卸载和挂载以及扫描。
服务范围:
本地服务:该服务主要运行于主进程上,如果主进程被kill,那么这个服务也挂了。
远程服务:该服务可以独立的开启一个进程,会占用一定资源,可以进行夸进程交互,AIDL。
运行类别:
前台服务:前台服务需要调用startForeground()来标记此服务属于前台服务。
后台服务:在后台运行服务。
3、Service的生命周期
Service is started by startService():
onCreate()
onStart()(onStartCommond)
(Service is Running)
(The Service is stopped(no callback))
onDestory()
(The Service is shutdown)
Service is started by bindService():
onCreate()
onBind()
(Client interacts with the service.)
onUnbind() → onRebind()
onDestory()
(The service is shutdown)
4、Service的注册
在AndroidManiFest.xml中的<application>标签中进行注册.
<service android:name = "package.AService">
5、Service的启动
1、context.startService();
2、context.bindService();
6、粘性服务于非粘性服务
1、START_STICKY:粘性服务,如果当前Service在执行完成onStartCommond方法并且返回该变量的值
时,服务进程被强行kill掉,那么系统会尝试重新启动该服务。
2、START_NOT_STICKY:非粘性服务,如果当前Service在执行完onStartCommond方法之后,返回该变量
的值后,被意外kill掉,那么系统并不会尝试重新启动该服务。
3、START_REDELIVER_INTENT:重传Intent,使用这个返回值,如果在执行完onStartCommond方法后,
程序被意外kill掉,那么会重新启动该服务,并将Intent的值传入。
4、START_STICKY_COMPATIBILITY:这个值是START_STICKY这个值的兼容模式。
注意事项:
service在与activity绑定的时候如果需要进行传递数据,需要自定义一个binder把需要传递的数据定义在里面,进行传递,并且service的onBind()方法必须返回那个自定义的binder的实例化,否则就不能把要传递的数据传递过去,如果返回值为空则不会执行serviceConnection里面的方法。
”