美文网首页
Service 生命周期

Service 生命周期

作者: zac4j | 来源:发表于2017-05-24 00:13 被阅读261次

    Service 的生命周期比 Activity 的要简单很多。但关注其如何创建销毁反而更加重要,因为服务可以在用户没有意识到的情况下在后台运行。

    Service 的生命周期可以遵循两条不同的途径:

    • 启动服务
      该服务在其他组件中调用 startService() 时创建,然后无限运行,必须通过 stopSelf() 来自行停止运行。此外,其他组件也可以通过调用 stopService() 来停止服务。服务停止后,系统会将其销毁。
    • 绑定服务
      该服务在另一个组件(客户端)调用 bindService() 时创建。然后客户端通过 IBinder 接口与 Service 进行进行通信。客户端可以通过调用 unbindService() 来关闭连接。多个客户端可以绑定到相同服务,而且当所有绑定全部取消后,系统会销毁该服务。(不必调用 stopService() 来停止服务)

    这两种状态并非完全独立,实际上是 可以共存 的。例如可以使用 Intent 调用 startService() 启动后台音乐服务。随后,可能用户需要加入控制播放器获取有关播放歌曲信息时,Activity 可以通过调用 bindService() 绑定到该服务。这种情况下,除非所有客户端都取消绑定,否则 stopService()stopSelf() 不会停止该服务。

    实现 Service 生命周期回调

    与 Activity 类似,Service 也拥有生命周期回调方法,可以通过实现这些方法来监控Service 状态的变化:

    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    import android.support.annotation.Nullable;
    
    /**
     * Created by Zac on 2017/5/23.
     */
    
    public class MyService extends Service {
    
      private int mStartMode; // 表示服务被 kill 之后的行为
      private IBinder mBinder; // 表示绑定该服务的客户端
      private boolean mAllowReind; // 表示是否允许重新绑定
    
    
      @Override public void onCreate() {
        // 服务被创建
        super.onCreate();
      }
    
      @Nullable @Override public IBinder onBind(Intent intent) {
        // 客户端通过 bindService() 方法绑定服务
        return mBinder;
      }
    
      @Override public int onStartCommand(Intent intent, int flags, int startId) {
        // 组件调用 startService() 方法启动服务
        return mStartMode;
      }
    
      @Override public boolean onUnbind(Intent intent) {
        // 所有绑定的客户端都已调用 unbindService() 方法解绑
        return mAllowReind;
      }
    
      @Override public void onRebind(Intent intent) {
        // 客户端在onUnbind() 方法回调之后,调用 bindService() 方法绑定服务
        super.onRebind(intent);
      }
    
      @Override public void onDestroy() {
        // 服务不再被使用并被销毁
        super.onDestroy();
      }
    }
    
    service_lifecycle.png

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

    通过这些方法,我们可以监控 Service 生命周期的两个部分:

    • Service 的 整个生命周期 从调用 onCreate() 开始,到 onDestroy() 返回时结束。与 Activity 类似,Service 也在 onCreate() 中完成初始设置,并在 onDestroy() 中释放所有剩余资源。例如,音乐播放器可以在 onCreate() 中创建播放音乐的线程,然后在 onDestroy() 中停止该线程。无论 Service 是通过 startService() 还是 bindService() 方法创建,都会调用 onCreate() 和 onDestroy() 方法。
    • Service 的 有效生命周期 从调用 onStartCommand()onBind() 方法开始。每种方法均有 Intent 对象,该对象分别来自 startService()bindService()
      对于启动服务,有效生命周期和整个生命周期同时结束。对于绑定服务,有效生命周期在 onUnbind() 返回时结束。

    尽管启动服务是通过 stopSelf()stopService() 来停止,但该服务没有相应的回调(没有 onStop() 回调)。因此,除非是绑定服务,否则在服务停止时,系统会将其在 onDestroy() 中销毁。

    上图说明了服务的典型回调方法。尽管该图分开介绍通过 startService() 创建的服务和通过 bindService() 创建的服务,但是不管启动方式如何,任何服务均有可能允许客户端与其绑定。因此,最初使用 onStartCommand()(客户端调用 startService() )启动的服务仍有可能接收 onBind() 的调用(客户端调用 bindService() 时)。

    相关文章

      网友评论

          本文标题:Service 生命周期

          本文链接:https://www.haomeiwen.com/subject/jrzgxxtx.html