Service
文章目录
Service的作用
Service最大的优点在于:对于Service产生的长周期的Thread能被其他组件控制,Service更多的是用于启动 长周期 Thread,以便于更好的控制长周期Thread。这是由于没有组件的进程是空进程,很容易被回收。
Service的三种形式
- Started: 由startService()方法调用,终结此种Service需要调用stopSelf()与stopService()方法。必须实现onStartCommand()方法。
- Bound:这种Service与Caller相当于Server与Client的关系,一个Service被多绑定,但是当所有Caller调用unbindService()时候会自我终结。需要实现onBind()方法,其会调用onBind()与onUnbind()
- Started&Bound:为了Bound类型的Service避免其终结,通常利用startService()启动Service然后再用bindService()对其绑定。终结此类Service需要使用stopService()与unbindService()相互结合
Start Service
- 继承IntentService(首选),能开工作线程同步执行请求
- 实现onHandleIntent()方法,这个方法会再IntentService的工作线程中队列地执行
- 继承Service ,当有严格的异步要求时选择实现Service
- 实现onStartCommond()方法所有组件的on回调都是在主线程上,所以,onStartCommond也不例外,所以为了防止卡主线程,一般在Service的onStartCommond中用户应该调用其他线程来执行代码。
Bind Service
从返回类型看
- 返回自己定义的Binder实现类,这种适合进程内通信,通常Binder实现类会返回整个Service或者封装特定的方法
- 返回Messenger.getBinder(),这种适合进程间通信,并且这种方式能同步执行客户端请求,实用非常简单
- 两个构造器Messenger(handler),Messenger(binder),两个重要方法 getBinder(),send()
- 在client发给server的Message的replyTo加载Client端定义的Messenger,实现双端通信
- AIDL写法,可以实现进程间异步的请求,非特别要求异步推荐实用Messenger
Service与进程优先级
Service可以在进程优先级中的foreground,visiable, service
- foreground:
- bind 可交互Activity
- 在执行回调的过程中
- startForeground
- visiable:
- bind 可见的Activity
- service :
- 非以上情况但还没destroy
Service Binder的线程进程关系
- onBind方法执行在Service进程的主进程中
- 执行Binder回调的进程线程分下面两种情况
- 如果client跟Service是同一个进程,那么执行binder回调 的线程等同client
- 如果client跟Service不在同一个进程,那么Service的进程会从线程池中拿出一个线程名BinderN来执行client的binder操作。这个过程对于Client默认是阻塞的,如果要求不阻塞,需要再aidl中添加oneway标志。具体看AIDL