多线程:IntentService(使用 & 源码分析)+思维导图

先喝杯咖啡放松一下!
在这里插入图片描述

概述

在这里插入图片描述

IntentService 使用

  1. Step 1: 定义IntentService类,重写onHandleIntent
  2. Step 2: 清单文件注册
  3. Step 3: 开启服务
Step 1
class SIntentService : IntentService("SIntentService") {

    override fun onCreate() {
        Log.e("SIntentService", "onCreate___")
        super.onCreate()
    }

    override fun onStart(intent: Intent?, startId: Int) {
        Log.e("SIntentService", "onStart___")
        super.onStart(intent, startId)
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.e("SIntentService", "onStartCommand___")
        return super.onStartCommand(intent, flags, startId)

    }

    override fun onHandleIntent(intent: Intent?) {
        Log.e("SIntentService", "onHandleIntent___"+intent?.getExtras()?.getString("task"))
        // 根据 Intent的不同,进行不同的事务处理
        val string = intent?.getExtras()?.getString("task")
        when (string) {
            "task_1" -> Log.e("SIntentService", "task_1______");
            "task_2" -> Log.e("SIntentService", "task_2______");
        }

    }

    override fun onDestroy() {
        Log.e("SIntentService", "onDestroy___")
        super.onDestroy()
    }

}
Step 2
 <service android:name=".SIntentService"></service>
Step 3
   var i = Intent(mCtx, SIntentService::class.java);
   var bundle = Bundle();
   bundle.putString("task", "task_1");
   i.putExtras(bundle);
   startService(i)

   var i2 = Intent(mCtx, SIntentService::class.java);
   var bundle2 = Bundle();
   bundle2.putString("task", "task_2");
   i2.putExtras(bundle2);
   startService(i2)

Log日志:
在这里插入图片描述
通过Log可以看出,多次开启starService(),任务会被onStartCommand()插入工作队列,任务按顺序执行完毕,Service会自动销毁。

源码分析

源码思维导图:

思维导图里,已经画好了,IntentService对应的函数里做了哪些工作。
在这里插入图片描述
有关HandlerThread详情可参考:多线程:HandlerThread+思维导图

具体分析
  • onCreate() 源码

主要作用: 初始化一个Thread和Handler

  @Override
    public void onCreate() {
        super.onCreate();
     // step 1  开启一个Thread实例(HandlerThread是继承Thread的)
     HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
     thread.start();
     // step 2  通过Thread获取当前的Looper对象
     mServiceLooper = thread.getLooper();
     // step 3  Lopper与Handler绑定(ServiceHandler继承 Handler)
     mServiceHandler = new ServiceHandler(mServiceLooper);
    }

  • onStartCommand 源码

主要作用:将Intent插入工作队列

 @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        // 将Intent传入onStart (多次开启时,就是这里将Intent插入队列的)
        onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }
  • onStart 源码

主要作用:将Intent发送给Handler,交由handleMessage去处理

    @Override
    public void onStart(@Nullable Intent intent, int startId) {
    //step 1  获取Message对象
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
    // step 2 利用在onCreate()函数里,初始化的Handler对象,发送消息,
    // Intent交由handleMessage处理
        mServiceHandler.sendMessage(msg);
    }

ServiceHandler


    private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
        //step 1 将Intent请求,下发至onHandleIntent,用客户端去处理
            onHandleIntent((Intent)msg.obj);
            // step 2 停止服务
            stopSelf(msg.arg1);
        }
    }
  • onHandleIntent 源码

主要作用:需要重写,处理对应的Intent请求


  @WorkerThread
    protected abstract void onHandleIntent(@Nullable Intent intent);
  • onDestroy 源码

主要作用:退出消息队列

 @Override
    public void onDestroy() {
        mServiceLooper.quit();
    }

整个IntentService源码分析到这里级结束了,如有什么不正确的,请指出!

如果对看官有所帮助,请麻烦手指点个赞吧!Thanks

在这里插入图片描述
点不点!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值