文章目录
  1. 1. Service的作用
  2. 2. Service的三种形式
  3. 3. Start Service
  4. 4. Bind Service
  5. 5. Service与进程优先级
  6. 6. Service Binder的线程进程关系
  7. 7. 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

Service生命周期

Service生命周期

Service bind生命周期

IntentService生命周期

文章目录
  1. 1. Service的作用
  2. 2. Service的三种形式
  3. 3. Start Service
  4. 4. Bind Service
  5. 5. Service与进程优先级
  6. 6. Service Binder的线程进程关系
  7. 7. Service生命周期