天天看點

android Service 學習記錄 随筆Service兩種啟動模式的生命周期:一些小知識:如何保證Service不被殺死IntentService: 使用執行個體service使用擴充,比較魔幻的部分

Service兩種啟動模式的生命周期:

startService & bindService

android Service 學習記錄 随筆Service兩種啟動模式的生命周期:一些小知識:如何保證Service不被殺死IntentService: 使用執行個體service使用擴充,比較魔幻的部分

一些小知識:

1.如果個Service被startService 方法多次啟動,那麼onCreate方法隻會調用一次,onStart将會被調用多次(對應調用startService的次數),并且系統隻會建立Service的一個執行個體。

2.不管調用 bindService 調用幾次,onCreate方法都隻會調用一次,同時onStart方法始終不會被調用。

3.如果一個Service又被啟動又被綁定,調用unbindService将不會停止Service,而必須調用 stopService 或 Service的 stopSelf 來停止服務。

如何保證Service不被殺死

1.onStartCommand方式中,傳回START_STICKY

START_NOT_STICKY:當Service運作的程序被Android系統強制殺掉之後,不會重新建立該Service。

START_STICKY:Service運作的程序被Android系統強制殺掉之後,Android系統會将該Service依然設定為started狀态(即運作狀态),但是不再儲存onStartCommand方法傳入的intent對象,然後Android系統會嘗試再次重新建立該Service,并執行onStartCommand回調方法。

START_REDELIVER_INTENT:Service運作的程序被Android系統強制殺掉之後,與傳回START_STICKY的情況類似,Android系統會将再次重新建立該Service,并執行onStartCommand回調方法,但是不同的是,Android系統會再次将Service在被殺掉之前最後一次傳入onStartCommand方法中的Intent再次保留下來并再次傳入到重新建立後的Service的onStartCommand方法中。

2.提高Service的優先級

在AndroidManifest.xml檔案中對于intent-filter可以通過android:priority = "1000"這個屬性設定最高優先級,1000是最高值,如果數字越小則優先級越低,同時适用于廣播。

3.提升Service程序的優先級

當系統程序空間緊張時,會依照優先級自動進行程序的回收。Android将程序分為6個等級,按照優先級由高到低依次為:

  1. 前台程序foreground_app
  2. 可視程序visible_app
  3. 次要服務程序secondary_server
  4. 背景程序hiddena_app
  5. 内容供應節點content_provider
  6. 空程序empty_app

可以使用startForeground将service放到前台狀态,這樣低記憶體時,被殺死的機率會低一些。

4.在onDestroy方法裡重新開機Service

當service走到onDestroy()時,發送一個自定義廣播,當收到廣播時,重新啟動service。

5.系統廣播監聽Service狀态

6.将APK安裝到/system/app,變身為系統級應用

IntentService:

IntentService 是繼承于 Service 并處理異步請求的一個類,在 IntentService 内有一個工作線程來處理耗時操作,啟動 IntentService 的方式和啟動傳統 Service 一樣,同時,當任務執行完後,IntentService 會自動停止,而不需要我們去手動控制。

另外,可以啟動 IntentService 多次,而每一個耗時操作會以工作隊列的方式在IntentService 的 onHandleIntent 回調方法中執行,并且,每次隻會執行一個工作線程,執行完第一個再執行第二個,以此類推。

源碼:

// IntentService源碼中的 onCreate() 方法
@Override
public void onCreate() {
    super.onCreate();
    // HandlerThread繼承自Thread,内部封裝了 Looper
    //通過執行個體化andlerThread建立線程并啟動
    //是以使用IntentService時不需要額外建立線程
    HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
    thread.start();

    //獲得工作線程的 Looper,并維護自己的工作隊列
    mServiceLooper = thread.getLooper();
    //将上述獲得Looper與建立的mServiceHandler進行綁定
    //建立的Handler是屬于工作線程的。
    mServiceHandler = new ServiceHandler(mServiceLooper);
}

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

//IntentService的handleMessage方法把接收的消息交給onHandleIntent()處理
//onHandleIntent()是一個抽象方法,使用時需要重寫的方法
    @Override
    public void handleMessage(Message msg) {
        // onHandleIntent 方法在工作線程中執行,執行完調用 stopSelf() 結束服務。
        onHandleIntent((Intent)msg.obj);
      //onHandleIntent 處理完成後 IntentService會調用 stopSelf() 自動停止。
        stopSelf(msg.arg1);
    }
}

onHandleIntent()是一個抽象方法,使用時需要重寫的方法
@WorkerThread
protected abstract void onHandleIntent(Intent intent);
           

 使用執行個體

service使用擴充,比較魔幻的部分

。。。