Service简介
- 四大组件之一,与Activity不同之处,没有UI界面,是在后台运行的组件。
- 适合执行一些长期在后台运行和没有用户交互的任务。默认是在主线程运行,若要执行耗时操作(网络请求、磁盘IO操作等等),需放在开启子线程进行。
Service工作状态
- 启动状态:主要用于执行后台计算
- startService:启动服务
- stopService:停止服务
- 绑定状态:主要用于其他组件(Activity、Fragment)和Service的交互
- bindService:绑定服务
- unbindService:解绑服务
两者的区别:
- 生命周期执行不同
- startService:onCreate -> onStartCommand -> onDestroy
- bindService: onCreate -> onBind -> onUnBind -> onDestroy
- 使用场景有所不同
- startService:一般用于功能单一、无需交互的场景,启动服务后,会长期在后台运行,即使启动所在的组件销毁了,服务也不会停止,需调用stopService才能停止服务,
- bindService:一般用于组件与Service需要交互的场景,可以通过实现IBinder接口实例来获取Service对象,再通过Service对象获取需要的数据;该方式启动Service,会随之组件Context销毁而停止服务。
生命周期
左图显示了使用 startService() 所创建的服务的生命周期,右图显示了使用 bindService() 所创建的服务的生命周期。
public class MyService extends Service {
public static final String TAG = "MyService";
/**
* service初次启动调用,在service没有销毁的情况下,再次触发startService()或者
* bindService()是不会多次调用此函数。
*/
@Override
public void onCreate() {
Log.i(TAG,"onCreate()");
super.onCreate();
}
/**
* service初次创建与在service没有销毁的两种情况下,再次触发startService()
* 会调用此函数。
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG,"onStartCommand() -- "+Thread.currentThread());
return super.onStartCommand(intent, flags, startId);
}
/**
* 初次绑定service调用此函数,在没有销毁情况下,多次绑定是不会调用的。
*/
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG,"onBind()");
return mBinder;
}
/**
* 解绑调用函数
*/
@Override
public boolean onUnbind(Intent intent) {
Log.i(TAG,"onUnbind()");
return super.onUnbind(intent);
}
/**
* 销毁
*/
@Override
public void onDestroy() {
Log.i(TAG,"onDestroy()");
super.onDetroy();
}
}
1、startService启动服务到销毁整个生命周期如下:
onStartCommand方法是在主线程执行的不能做耗时操作,若要做耗时操作必须创建一个子线程,onStartCommand被调用后,服务才会进入运行状态。
在服务启动后,如果再次触发startService方法,是不会调用onCreate,会直接调用onStartCommand方法。
2、bindService绑定服务到解绑的整个生命周期如下:
在绑定服务,如果再次触发bindService方法,不会进行重绑定操作,任何周期方法都不会被调用,
如果在组件中已经解绑服务了,再次触发unbindService方法,会报java.lang.IllegalArgumentException: Service not registered错误。
3、同时使用startService和bindService启动绑定服务的生命周期:
如果要销毁服务,必须同时调用stopService和unbindService方法才能关闭服务。
Android基础 - Service实例深入理解