一、生命周期
1.bindService:
onCreate() -> onBind() -> onUnBind() -> onDestroy()
如果服务以及开启,多次调用bindService时onCreate和onBind不会多次执行。
2.startService():
onCreate() -> onStartCommand() -> onDestroy()
如果服务以及开启,多次调用startService时onCreate不会多次执行,但是onStart和onStartCommand会多次执行。
onStartCommand的返回值:
- START_NOT_STICKY:服务被异常kill之后,不会重启服务
- START_STICKY:服务被异常kill之后,重启服务,但是intent值为null
- START_REDELIVER_INTEN:服务被异常kill之后,重启服务,并且重传intent
3.销毁:
- 只调用了bindService那只需要调用unBindService就会执行onDestroy
- 只调用了startService那只需要调用stopService就会执行onDestroy
- 同时调用bindService和startService那就需要同时调用unBindService和stopService才会执行onDestroy
二、IntentService
IntentService是继承自 Service 并处理异步请求的一个类,它默认开启了一个工作线程HandlerThread,只需要重写onHandleIntent方法处理耗时逻辑,当耗时操作完成会自动停止不需要手动结束。
使用:
- 新建一个MyIntentService类继承IntentService,重写onHandleIntent方法,在onHandleIntent中处理耗时逻辑
- 在activity中新建intent,startActivity传入intent启动这个服务
- 在AndroidManifest.xml中注册这个MyIntentService
PS:
1.如果多次调用Activity.startService(Intent intent),则会将intent存入一个消息队列中,按顺序一个一个执行,全部执行完后才终止自身。
2.一般是通过startService启动intentService,而不用bind,因为bind会使得IntentService跳过了onStartCommand方法,会导致任务分发出问题。
三、IntentService原理
1.IntentService继承Service
2.在onCreate中创建一个HandlerThread对象,并启动线程,然后创建ServiceHandler对象。ServiceHandler继承Handler,用来处理消息,在handleMessage中调用onHandleIntent处理消息。
public void onCreate() {
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
3.onStartCommand会调用onStart,onStart中会用handler发送消息。
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
public void onStart(@Nullable Intent intent, int startId) {
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
//在onStart中发送的消息
mServiceHandler.sendMessage(msg);
}
//mServiceHandler接收消息然后让onHandleIntent处理
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
}
4.onBind方法返回的是null,所以启动intentService要用startService。
@Override
@Nullable
public IBinder onBind(Intent intent) {
return null;
}