1. 程式人生 > >startService,bindServie混用之onDestroy不被呼叫的處理方法

startService,bindServie混用之onDestroy不被呼叫的處理方法

Android後臺服務保活:
本來單獨使用startService啟動的service,在“正在執行”的服務裡面點選“停止”按鈕之後,服務會呼叫onDestroy,然後在這個呼叫裡面傳送intent重啟服務,
    @Override
    public void onDestroy() {
        super.onDestroy();
        Intent intent = new Intent(getApplicationContext(),xxx.class);
        startService(intent);
    }
以上使用沒有問題。但是,當加入bindService和startService混用以後,在“正在執行”的服務裡面點選“停止”按鈕之後,服務的onDestroy並沒有被呼叫。造成,服務被殺死沒有辦法重啟,而保活失敗。

呼叫程式碼如下:

private void startService(int uid) {
    Intent intent = new Intent(this, Service.class);
    startService(intent);
    bindService();
}

private void bindService() {
    Intent intent2 = new Intent(this, Service.class);
    bindService(intent2, mServiceConnection, Context.BIND_AUTO_CREATE);
}
查找了幾片部落格,只是說,startService和bindService會出現這個onDestroy不被呼叫的情況,部落格說要呼叫unbindservice和stopservice服務結束的時候才會呼叫onDestroy
但是,我這裡的使用場合是,在“正在執行”的服務裡面點選“停止”按鈕之後,需要觸發onDestroy。

在同時用startService和bindservice的情況下修改bindservice的第三個引數。發現只要不是BIND_AUTO_CREATE,在“正在執行”的服務裡面點選“停止”按鈕之後,都會呼叫onDestroy。

找到了解決方案:但是除了BIND_AUTO_CREATE還有很多選項,具體該選擇哪個呢:以下列出每個選項說明:

自動建立服務只要繫結純在。
    public static final int BIND_AUTO_CREATE = 0x0001;

    包含對unbind呼叫不匹配的除錯幫助
    public static final int BIND_DEBUG_UNBIND = 0x0002;

    不允許此繫結將目標服務的程序提升到前臺排程優先順序
    public static final int BIND_NOT_FOREGROUND = 0x0004;

    表示繫結到此服務的客戶端應用程式認為該服務比應用程式本身更重要。
     當設定時,平臺將嘗試使記憶體殺手殺死應用程式,然後殺死它繫結到的服務
     ,儘管這不能保證是這種情況
    public static final int BIND_ABOVE_CLIENT = 0x0008;

    允許承載繫結服務的程序通過其正常的記憶體管理。 它將更像是一個正在執行的服務,
    允許系統(暫時)清除過程,如果記憶體低或一些其他的想法可能有,
    並更積極的使它成為候選人被殺死(並重新啟動)如果 執行很長時間。
    public static final int BIND_ALLOW_OOM_MANAGEMENT = 0x0010;

    不影響目標服務的主機程序的排程或記憶體管理優先順序。 
    允許在後臺LRU列表上管理服務的程序,就像在後臺的常規應用程式程序一樣
    public static final int BIND_WAIVE_PRIORITY = 0x0020;


    這個服務比客戶端重要,當客戶端是前臺程序的時候,服務會被提到前臺程序的級別。
    一般一個程序只能被提高到可見程序的級別,即便客戶端是個前臺程序。
    public static final int BIND_IMPORTANT = 0x0040;


    如果是通過Activity來繫結的服務,允許服務的重要級別隨著Activity是否可見而改變
    public static final int BIND_ADJUST_WITH_ACTIVITY = 0x0080;