Service 生命周期

2017-05-24  本文已影响261人  zac4j

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

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

这两种状态并非完全独立,实际上是 可以共存 的。例如可以使用 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 生命周期的两个部分:

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

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

上一篇下一篇

猜你喜欢

热点阅读