Service 生命周期
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() 时)。