IntentService使用及原理

IntentService是Service的子類,由于Service里面不能做耗時(shí)的操作,所以Google提供了IntentService,在IntentService內(nèi)維護(hù)了一個(gè)工作線程來(lái)處理耗時(shí)操作,當(dāng)任務(wù)執(zhí)行完后,IntentService會(huì)自動(dòng)停止。另外,可以啟動(dòng)IntentService多次,而每一個(gè)耗時(shí)操作會(huì)以工作隊(duì)列的方式在IntentService的onHandleIntent回調(diào)方法中執(zhí)行,并且,每次只會(huì)執(zhí)行一個(gè)工作線程,執(zhí)行完第一個(gè)再執(zhí)行第二個(gè),以此類推。
看代碼更好理解

public class MyService extends IntentService {
    //這里必須有一個(gè)空參數(shù)的構(gòu)造實(shí)現(xiàn)父類的構(gòu)造,否則會(huì)報(bào)異常
    //java.lang.InstantiationException: java.lang.Class<***.MyService> has no zero argument constructor
    public MyService() {
        super("");
    }
    
    @Override
    public void onCreate() {
        System.out.println("onCreate");
        super.onCreate();
    }

    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        System.out.println("onStartCommand");
        return super.onStartCommand(intent, flags, startId);

    }

    @Override
    public void onStart(@Nullable Intent intent, int startId) {
        System.out.println("onStart");
        super.onStart(intent, startId);
    }

    @Override
    public void onDestroy() {
        System.out.println("onDestroy");
        super.onDestroy();
    }

    //這個(gè)是IntentService的核心方法,它是通過(guò)串行來(lái)處理任務(wù)的,也就是一個(gè)一個(gè)來(lái)處理
    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        System.out.println("工作線程是: "+Thread.currentThread().getName());
        String task = intent.getStringExtra("task");
        System.out.println("任務(wù)是 :"+task);
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

然后看看Activity里面怎么使用這個(gè)Service

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Intent intent = new Intent(this,MyService.class);
        intent.putExtra("task","播放音樂(lè)");
        startService(intent);
        intent.putExtra("task","播放視頻");
        startService(intent);
        intent.putExtra("task","播放圖片");
        startService(intent);
    }
}

看下結(jié)果:

14:49:31.465 18974-18974/com.dgtech.sss.intentservicedemo I/System.out: onCreate
14:49:31.467 18974-18974/com.dgtech.sss.intentservicedemo I/System.out: onStartCommand
14:49:31.467 18974-18974/com.dgtech.sss.intentservicedemo I/System.out: onStart
14:49:31.467 18974-18974/com.dgtech.sss.intentservicedemo I/System.out: onStartCommand
14:49:31.467 18974-18974/com.dgtech.sss.intentservicedemo I/System.out: onStart
14:49:31.467 18974-18974/com.dgtech.sss.intentservicedemo I/System.out: onStartCommand
14:49:31.467 18974-18974/com.dgtech.sss.intentservicedemo I/System.out: onStart
14:49:31.467 18974-19008/com.dgtech.sss.intentservicedemo I/System.out: 工作線程是:IntentService[]
14:49:31.467 18974-19008/com.dgtech.sss.intentservicedemo I/System.out: 任務(wù)是 :播放音樂(lè)
14:49:33.468 18974-19008/com.dgtech.sss.intentservicedemo I/System.out: 工作線程是: IntentService[]
14:49:33.468 18974-19008/com.dgtech.sss.intentservicedemo I/System.out: 任務(wù)是 :播放視頻
14:49:35.472 18974-19008/com.dgtech.sss.intentservicedemo I/System.out: 工作線程是: IntentService[]
14:49:35.472 18974-19008/com.dgtech.sss.intentservicedemo I/System.out: 任務(wù)是 :播放圖片
14:49:37.477 18974-18974/com.dgtech.sss.intentservicedemo I/System.out: onDestroy

從結(jié)果中可以看出我們startService()執(zhí)行了三次, onCreate()方法只執(zhí)行了一次,說(shuō)明只有一個(gè)Service實(shí)例, onStartCommand()和onStart()也執(zhí)行了三次,關(guān)鍵是onHandleIntent()也執(zhí)行了三次,而且這三次是串行的,也就是執(zhí)行完一個(gè)再執(zhí)行下一個(gè),當(dāng)最后一個(gè)任務(wù)執(zhí)行完, onDestroy()便自動(dòng)執(zhí)行了

下面我們創(chuàng)建兩個(gè)intent來(lái)試試

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent(this,MyService.class);
        intent.putExtra("task","播放音樂(lè)");
        startService(intent);

        Intent intent2 = new Intent(this,MyService.class);
        intent2.putExtra("task","播放音樂(lè)2");
        startService(intent2);
    }
}

結(jié)果:

14:50:49.568 20321-20321/com.dgtech.sss.intentservicedemo I/System.out: onCreate
14:50:49.569 20321-20321/com.dgtech.sss.intentservicedemo I/System.out: onStartCommand
14:50:49.569 20321-20321/com.dgtech.sss.intentservicedemo I/System.out: onStart
14:50:49.570 20321-20321/com.dgtech.sss.intentservicedemo I/System.out: onStartCommand
14:50:49.570 20321-20321/com.dgtech.sss.intentservicedemo I/System.out: onStart
14:50:49.570 20321-20354/com.dgtech.sss.intentservicedemo I/System.out: 工作線程是: IntentService[]
14:50:49.570 20321-20354/com.dgtech.sss.intentservicedemo I/System.out: 任務(wù)是 :播放音樂(lè)
14:50:51.571 20321-20354/com.dgtech.sss.intentservicedemo I/System.out: 工作線程是: IntentService[]
14:50:51.572 20321-20354/com.dgtech.sss.intentservicedemo I/System.out: 任務(wù)是 :播放音樂(lè)2
14:50:53.574 20321-20321/com.dgtech.sss.intentservicedemo I/System.out: onDestroy

再一次印證了我們的結(jié)論

下面看一下IntentService的源碼,很簡(jiǎn)單
從onCreate()入手

  @Override
    public void onCreate() {

        super.onCreate();
        //HandlerThread就是一個(gè)帶有handler的thread,這里就是創(chuàng)建了一個(gè)線程,注意這個(gè)線程的名字
        //上面的日志打印中"工作線程是: IntentService[]"
        //因?yàn)槲覀冊(cè)谧远x的MyService里面,構(gòu)造方法寫的是super(""),如果寫的不是空串,
        //上面的日志打印就應(yīng)該是"工作線程是: IntentService[我們定義的名稱]"
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();
        //獲取這個(gè)線程的looper
        mServiceLooper = thread.getLooper();
        //創(chuàng)建了一個(gè)handler
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }
private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            //處理邏輯是我們?cè)贛yService里面重寫的這個(gè)方法
            onHandleIntent((Intent)msg.obj);
            //從這里可以看出,我們執(zhí)行完任務(wù)后,service就銷毀了
            stopSelf(msg.arg1);
        }
    }

再來(lái)看看onStart()

@Override
    public void onStart(@Nullable Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }

如果你了解handler的原理,這個(gè)源碼太簡(jiǎn)單了
如果不了解handler,建議看看我寫的
http://www.itdecent.cn/p/d4415033349d

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容