Android - 服务

 一、Service:

  1)Service 是一个可以在后台执行长时间运行操作而不使用用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)

  2)Service 在其托管进程的主线程中运行,如果服务执行任何CPU密集型工作或阻止性操作(例如MP3播放或联网),则应在服务内创建新线程来完成工作。

  3)Android的后台是指,运行完全不依赖UI,即使Activiy被销毁或者程序被关闭,只要进程还在,Service就可以继续运行。

  Local Service: Service运行在主进程的主线程上

  Remote Service: Service运行在独立进程的主线程上

 

二、Service生命周期(从创建到销毁)可以遵循两条不同路径:

  - 启动服务:该服务在其他组件调用startService()时创建,然后无限期运行,必须通过调用stopSelf()来自行停止运行,或者其他组件调用stopService()来停止服务,服务停止后,系统会将其销毁

    onCreate 只会在Service第一次创建时候调用

    第一次ctx.startService():onCreate->onStartCommand

    第二次ctx.startService():onStartCommand

    停止服务:ctx.stopService() 或者 Service自身调用stopSelt()

  - 绑定服务:该服务在其他组件(客户端)调用bindService()时创建,然后客户端通过IBinder接口与服务进行通信,客户端可以通过unBinderService()关闭连接,多个客户端可以绑定到相同服务,当所有绑定全部取消后,系统会将其销毁

    bindService(intent,serviceConnection,flag:BIND_AUTO_CREATE) 绑定是异步的, 要接收IBinder, 客户端必须创建一个ServiceConnection实例

    ServiceConnection
      - onServiceConnected():系统会调用该方法以传递服务onBind()方法返回的IBinder.

      - onServiceDisconnected():系统会在与服务的连接意外中断时(例如当服务崩溃或被终止时)调用该方法. 当客户端取消绑定时,系统"绝对不会"调用该方法.

    ctx.bindService(): onCreate->onBind

    [注] 通常情况下,切勿在Activity的onResume()与onPause()期间绑定与解除绑定,因为每一次生命周期转换都会发生这些回调

    解除绑定:ctx.unBindService(), 一个service可被多个组件绑定(组件获取到相同的Binder实例), 当多个绑定都解除后系统将销毁Service

    [注] onUnBind():所有客户端解除绑定才会被调用

    [注] 客户端解除绑定后,再次试图解除绑定将引发异常

  - 可以绑定到已经使用startService()启动的服务,这种情况下,必须显式停止服务,即使所有客户端均取消绑定,客户端未全部取消绑定前调用stopService()或stopSelf(),并不会真正停止服务,等到所有客户端均取消绑定时,系统会将其销毁;

 

  图1:服务生命周期左图显示了使用 startService() 所创建的服务的生命周期,右图显示了使用 bindService() 所创建的服务的生命周期。

                      

 

  图2:允许绑定的已启动服务的生命周期

                

 

三、绑定服务:
  1)要提供服务绑定,必须实现onBind回调方法,该方法返回的IBinder对象定义了客户端用来与服务进行交互的编程接口。

      不过,只有第一个客户端绑定时,系统才会调用服务的onBind()方法来检索IBinder。系统随后无需再次调用onBind(),便可将同一IBinder传递给其他绑定客户端。

  2)三种方法定义服务的IBinder接口:

    - 扩展Binder类:如果服务是供自有应用专用,并且在与客户端相同的进程中运行,采用这种方法;

    - 使用Messenger:这是执行进程间通信(IPC)的最简单方法,Messenger会在单一线程中创建包含所有请求的队列,这样就不必对服务进行线程安全设计;

    - 使用AIDL:跨进程多线程场景下使用,服务同时处理多个请求,服务必须具备多线程处理能力,采用线程安全设计;

 

 

参考文章:

  服务:https://developer.android.com/guide/components/services.html

  绑定服务:https://developer.android.com/guide/components/bound-services.html

  Android Service完全解析(郭霖):http://blog.csdn.net/guolin_blog/article/details/9797169

  Android Binder设计与实现:http://blog.csdn.net/universus/article/details/6211589#comments

 

posted @   chenyizh  阅读(214)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示