Service探索

一、生命周期

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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值