前言
Service组件作为Android的四大组件之一,是仅次于Activity的最常用组件,所有有必要对Service做一些学习和认识。
Service Lifecycle
我们今天学习的是Service Lifecycle,对其进行详细描述之前,我们先看一个Service Lifecycle图解,从直观上对其进行认识。
Service基本框架
通过一个Service实例,看一下一个Service基本框架
public class ServiceBaseInstance extends Service {
private final int startMode = START_STICKY;
private LocalBinder binder = new LocalBinder();
public class LocalBinder extends Binder {
ServiceBaseInstance getService() {
return ServiceBaseInstance.this;
}
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
return startMode;
}
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
生命周期
从上图中可以看出,启动一个服务有两个程序流程,一个是使用StartService(Intent)——context.startService() ->onCreate()- >onStart()->Service running-->context.stopService() | ->onDestroy() ;另一个是使用bindService(Intent,ServiceConnection,int)来绑定一个服务——context.bindService()->onCreate()->onBind()->Service running-->onUnbind() -> onDestroy() ;
- 被启动的服务的生命周期:如果一个Service被Activity调用Context.startService(Intent)方法启动的,那么Service中的onCreate()方法只会被调用一次,onStartCommand()或onStart()(Android 2.0以前的版本)会被调用多次,其中调用次数等于startServic(Intent)方法调用的次数,此后Service将一直在后台中运行,而不管Activity是否在运行,直到被调用stopService(),其自身调用stopSelf()方法。假如系统资源不足时,系统也有可能将服务结束。
- 被绑定服务的生命周期:如果一个Service被Activity调用Context.bindService()方法绑定启动,如果这个服务没有被创建,则服务的onCreate()方法会被调用且其只会被调用一次,当建立连接的时候,会调用onBinder(),其只会被执行一次,当显示调用Context.unbindService()断开连接或者之前调用bindService()方法的实例不存在了(可能是被调用finish()方法或者系统资源不足被系统回收),系统将自动调用onDestroy()方法停止Service的运行。
特别提醒
1.如果一个服务是使用startService()方法被启动的,你不能与其进行通信,除非你使用bindService(),它将一直在后台中运行,其直自身显示调用stopSelf()方法或者调用stopService()方法停止服务,当然还包括系统资源不足时,系统主动停止其运行。
2.我们使用bindService()方法绑定一个服务后,应当在某处使用unbindService()方法来接触绑定(尽管Activity被finish()后,绑定自动解除)。
3.即使用startService()又用bindService()时,只有stopService()和unbindService()都被调用之后服务才会停止,当然也有一些特殊情况,即stopSelf()和stopService()一样,unbindService()与bindService()的Context不存在了是对应的。
4.如果你的手机允许屏幕旋转,因为屏幕旋转时Activity会被创建,所以bindService()的Context不存在了。