Android初級開發筆記 - IntentService

@[toc]android

1、定義及做用

IntentService 是繼承於Service,用於處理異步請求,實現多線程的一個類。bash

2、使用及原理

如何使用:多線程

步驟1:定義IntentService的子類:傳入線程名稱、複寫onHandleIntent()方法app

package com.example.administrator.test;

import android.app.IntentService;
import android.content.Intent;
import android.util.Log;

public class myIntentService extends IntentService {

    public myIntentService() {
        //構造函數參數=工做線程的名字
        super("myIntentService");
    }

    /*複寫onHandleIntent()方法*/
    //實現耗時任務的操做
    @Override
    protected void onHandleIntent(Intent intent) {
        //不一樣的事務用不一樣的ntent標記
        String taskName = intent.getExtras().getString("taskName");
        switch (taskName) {
            case "task1":
                Log.i("myIntentService", "do task1");
                break;
            case "task2":
                Log.i("myIntentService", "do task2");
                break;
            default:
                break;
        }
    }


    @Override
    public void onCreate() {
        Log.i("myIntentService", "onCreate");
        super.onCreate();
    }

    /*複寫onStartCommand()方法*/
    //默認實現將請求的Intent添加到工做隊列裏
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("myIntentService", "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Log.i("myIntentService", "onDestroy");
        super.onDestroy();
    }
}
複製代碼

步驟2:在Manifest.xml中註冊服務異步

<service android:name=".myIntentService"/>
複製代碼

步驟3:在Activity中開啓Service服務ide

package com.example.administrator.test;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

        //同一服務只會開啓一個工做線程
        //在onHandleIntent函數裏依次處理intent請求。

        Intent i = new Intent("cn.scu.finch");
        Bundle bundle = new Bundle();
        bundle.putString("taskName", "task1");
        i.putExtras(bundle);
        startService(i);

        Intent i2 = new Intent("cn.scu.finch");
        Bundle bundle2 = new Bundle();
        bundle2.putString("taskName", "task2");
        i2.putExtras(bundle2);
        startService(i2);

        startService(i);  //屢次啓動
    }
}
複製代碼

爲什麼能成: 由於IntentService本質 = Handler + HandlerThread:函數

(1)經過HandlerThread 單獨開啓1個工做線程oop

(2)該線程繼承了Thread,封裝了Looperui

(3)建立1個內部 Handler :ServiceHandlerspa

(4)綁定 ServiceHandler 與 Looper

(5)經過 onStartCommand() 傳遞服務intent 到ServiceHandler 、依次插入Intent到工做隊列中 & 逐個發送給 onHandleIntent()

(6)經過onHandleIntent() 依次處理全部Intent對象所對應的任務

4、對比Service以及後臺線程

  • IntentService與Service的區別
    • Service:不能直接進行耗時操做(會ANR),若是有耗時操做就必須開啓一個單獨的線程來處理。IntentService不用再單獨開線程,由於其內部已經開了工做線程進行處理。而且在處理完成後會自動中止服務。欸~這裏就體現好處了,service須要調用stopSelf()或者stopService()中止服務,那麼就會出現有時候忘記中止的狀況,可是使用IntentService就不用擔憂會出現這個問題
    • Service須要主動調用stopSelft()來結束服務,而IntentService不須要(在全部intent被處理完後,系統會自動關閉服務)
  • IntentService與線程的區別
    • IntentService:能處理想要順序執行的耗時操做,反之,沒法處理同時進行的耗時操做
    • 後臺線程:優先級沒有IntentService高,畢竟人家IntentService是繼承Service,在資源緊張的狀況下,相對來講後臺線程比較容易被消滅掉

5、使用場景

  • 線程任務須要按順序、在後臺執行的使用場景 最多見的場景:離線下載
  • 因爲全部的任務都在同一個Thread looper裏面來作,因此不符合多個數據同時請求的場景。

內推信息

  • 咱們正在招募小夥伴,有興趣的小夥伴能夠把簡歷發到 app@talkmoney.cn,備註:來自簡書社區
  • 詳情能夠戳這裏--> 廣州蘆葦信息科技
相關文章
相關標籤/搜索