美文网首页安卓学习Android开发
一张图学习安卓IntentService

一张图学习安卓IntentService

作者: 小怪兽大作战 | 来源:发表于2019-03-04 16:53 被阅读2次

    什么是IntentService

    IntentService是一个特殊的service,内部有一个HandlerThread、ServiceHandler。通过使用startService(intent)可以是该IntentService执行执行的任务。因为IntentService是一种service,比单独的线程优先级更高,不容易被系统杀死。
    IntentService是一个抽象类,使用它必须实现它。它有一个抽象方法onHandlerIntent(Intent),用于根据intent中的参数执行相应的任务。

    IntentService的使用

    首先实现IntentService,在onHandlerIntent中进行后台计算。


    image.png

    然后创建Intent,在Intent中方法指令,启动IntentService。

    Intent service =new Intent(MainActivity.this,LocalIntentService.class);
    Intent.putExtra("task_action","com.tinymonster.action.TASK1");
    startService(service);
    

    下面看一下IntentService中的几个关键组件

    HandlerThread

    HandlerThread继承了Thread,并且在内部自动创建了Looper。我们创建HandlerThread后,使用其内部的Looper创建一个Handler,就可以使用Handler在HandlerThread内部执行后台任务。用法如下


    image.png

    IntentService的内部原理

    IntentService的onCreate方法中会创建一个HandlerThread,然后会创建ServiceHandler。当调用startService(intent)的时候,OnStart(intent)方法会像HandlerThread发送消息,HandlerThread接收消息后调用onHandlerIntent(intent)处理消息。最后OnStart调用stopSelf()停止自身。

    IntentService.onCreate

        public void onCreate() {
            super.onCreate();
            HandlerThread thread = new HandlerThread("IntentService");  //创建一个ThreadHandler
            thread.start();
    
            mServiceLooper = thread.getLooper();                                        //获取ThreadHandler内部的Looper
            mServiceHandler = new ServiceHandler(mServiceLooper);       //创建ServiceHandler
        }
    

    IntentService.ServiceHandler

    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);
            }
    }
    
    public void onStart(Intent intent, int startId) {
            Message msg = mServiceHandler.obtainMessage();
            msg.arg1 = startId;
            msg.obj = intent;
            mServiceHandler.sendMessage(msg);      //向ServiceHandler 发送消息
    }
    

    总结

    image.png

    1.IntentService.onCreate方法创建HandlerThread,HandlerThread内部又会创建Looper。根据Looper创建一个ServiceHandler
    2.使用startService(intent)启动IntentService。
    3.IntentService的onStart方法将消息发送给ServiceHandler。等待完成任务后执行stopSelf。
    4.ServiceHandler调用抽象方法onHandlerIntent处理消息。

    相关文章

      网友评论

        本文标题:一张图学习安卓IntentService

        本文链接:https://www.haomeiwen.com/subject/bkmiuqtx.html