1. service是应用程序的组成部分,可以和用户之间没有交互并且可以在后台长期运行.通常用来执行一些长时间的操作,如handle net work,play music,perform file I/O。还可以通过绑定服务来完成进程间的通信。
2. service启动的两种方式:
1) Started:应用程序的其他部分,如activity可以通过调用startActivity来启动。Note:服务和activity是毫无依赖关系的两个不同的部分,只要service已经启动,哪怕启动该service的activity被销毁了,service依然在后台继续执行。
2) Bound:应用程序的其他部分如A,通过调用bindService()绑定服务。绑定服务提供的是允许A和服务进行交互的接口,A可以向service发送请求,获得结果。Note:服务和A之间有依赖关系,service的生命周期和A相关。多个A可以在同一时刻Bind同一个service,当所有的A unbind 这个service之后,该service就被销毁。
差别:1.started一般不返回结果,而Bound可以返回结果。
2.Started的service的生命周期和Activity无关,而Bound则有关。
3. Started过程:
context.startService() -> onCreate() ->onStart() -> service Running
context.stopService() -> onDestory() -> Service Stop
Bound过程:
context.bindService() -> onCreate() ->onBind() -> Service running
onUnbind() -> onDestroy() -> Service stop
onStart()可多次调用,onBind()只能调用一次。
4. Service不是一个单独的进程或线程,而是运行在应用程序所在的主线程。它不能创建自己的线程。Note:当需要在service中执行一些很耗CPU和时间的操作,就应该开一个线程来处理。好处:1.可以降低ANR风险,2.可以让用户有好的试用体验。
5. 重要的回调函数
1) onStartCommand():当一个组件如Activity调用StartService()来启动Service的时候,系统调用该方法。Note:一旦重写该方法,就需要自己来停止或销毁该Service。
2) onBind():当一个组件如Activity想去绑定一个服务的时候就回执行该方法。Note:一旦重写该方法,就需返回Ibind接口,客户端通过该接口和服务进行交互。
3) onCreate():当Service是第一次生成的时候,调用该方法。若该Service已存在,就不再调用该方法。它在onStartCommand()和onBind()方法执行。
4) onDestory():当Service完成任务,不再用,被销毁的时候调用该方法。Note:在该方法中,需要释放不再用的资源(进程,注册的监听,Receiver等)
5) onRebind():当Service在内存中已经存在,调用bindService()方法再次与Service取得通信,将调用该方法。
6. 默认的,应用程序的所有组件都运行在同一个进程里面。可通过配置文件AndroidManifest中,android:process来指定组件运行在哪一个进程。可以指定一些组件运行在同一个进程中,也可以指定不同的应用程序的组件运行在同一个进程中。
7. 进程销毁:当系统资源比较紧张的时候,为了释放资源,系统会强行杀死某些进程,运行在该进程中的组件也会被销毁。进程销毁的规则:实质上是比较这些进程对用户的重要程度(进程里组件的运行状态)。当承载的组件再也不会在手机屏幕上可见,该进程会先被销毁。当资源允许的时候,系统会重新启动被杀死的Service。
Note:进程销毁的层次(后->先):
1) 前台进程(先->后)
1>运行着onReceive()的BroadcastReceiver
2>生命周期为onCreate(),onStart(),onDestory()的Service
3>运行在前台的Service(called startForeground())
4>和正在同用户交互的Activity进行绑定的Service
5>正在和用户交互的Activity.
2) 可见进程
1> 没运行在前台,但仍然可以,如一个Activity生成了一个Dialog,该Activity便不再前台却仍然可见(调用了onPause()方法)。
2> 绑定上述Activity的Service
3) 服务进程
4) 后台进程:承载的Activity调用了onStop()方法
5) 空进程
8. 主线程(UI线程)的两条规则:
1) 不能阻塞主线程
2) 不能从其他的线程来修改UI线程中的组件,
解决方法:
1>不好维护
Activity.runsOnUiThread(Runnable);
View.post(Runnable);
View.postDelayed(Runnable,long)
2>使用AsyncTask
9. Service默认的是不能被其他应用程序Start or Bound,可以通过修改配置文件,android:exported = “true”来使Service可以被其他应用程序绑定。Exported的默认值依赖于Service是否实质了intent filters。设置Android:process可以指定Service运行在哪个进程中。默认的是运行在主线程中。
10. 无论一个Service被Start多少次,一旦调用了Context.stopService()或stopSelf(),Service将会被停止。但调用stopSelf()可以保证事物已经完成。
11. IntentService:一个基类Service,默认创建一个工作线程,并创建一个事物队列(intents),事物队列中所有的intents轮流使用工作线程。当所有的事物完成,IntentService自动停止,不需要调用stopSelf().Note:当需要异步处理任务时,可以使用IntentSerive。
12. Service可以同时处理多个同样的事物,因为它为每一个请求启动一个线程来执行。这和IntentService不一样。
13. 通过ID来停止相对应ID的服务,而不会影响服务相同,ID不同的服务。Note:当服务完成的时候,停止服务非常重要,将会及时的释放手机内存。
14. 多个客户端可以同时绑定一个服务,当客户端完成同服务的交互时,客户端将会解除绑定。当没有一个客户端绑定该服务的时候,系统将会销毁该服务。