2

我試圖在後臺連續運行我的服務。我知道這會耗盡大量電池,但對我來說仍然是一個用例。Android服務:重新啓動一次從電話的任務堆棧中清除或刪除(全部清除)任務

案例1:使用startService(intent)方法啓動BackgroundService。 案例2:開始使用bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);

在這兩種情況下,BoundService,我的服務onStartCommand代碼就像下面,

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      while(count < 10000){ 
       try { 
        Thread.sleep(500); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       count++; 

      } 

     } 
    }).start(); 
    // TODO: flag not start itself when stopped 
    // TODO: use START_STICKY to keep running 
    return START_STICKY; 
} 

情景時,我的服務不會死意味着它將繼續運行:

情況1:如果我按HOME按鈕。 情況2:如果我按回來並從應用程序中退出。

情景時,我的服務一定會被殺死:

案例1:如果我從手機的任務堆棧我的申請。 情況2:我去設置並停止服務。

我希望我的服務能夠在上述任何情況下都會被殺掉。

我已經提到,從計算器許多問題要做到這樣,

@Override 
    public void onDestroy() { 
     super.onDestroy(); 

     startService(new Intent(this, BackgroundService.class)); 
    } 

    @Override 
    public void onTaskRemoved(Intent rootIntent) { 
     super.onTaskRemoved(rootIntent); 

     startService(new Intent(this, BackgroundService.class)); 

    } 

但可以肯定的onDestroy()不是那種方法,都會被調用的時間。我在我的日誌中檢查過它。

+0

請接受你自己的答案。這將從未回答的問題列表中刪除問題。謝謝! –

+0

你能解釋清楚嗎?你爲什麼接受我的答案而不是你自己的答案?我很好奇。 –

+1

@DavidWasser,你的回答幫助我從不同的角度思考。我爲中國製造商如小米,華爲等在「自動啓動」中保留了我的應用程序。因此,您應該得到這一點。 – Custadian

回答

3

如果用戶在您的應用上執行「強制停止」,您的Service將會被殺死,您無法做任何事情來阻止它。您也無法自動重新啓動Service,因爲用戶已告知Android它不希望您的應用再運行。用戶必須手動重啓您的應用程序。

如果您從「最近的任務列表」中刪除您的應用程序,Android將終止託管您的應用程序的操作系統進程。假設你的Service也在這個OS進程中運行,它也將被終止。在這種情況下,假設您已從onStartCommand()返回START_STICKY,Android會在新的OS進程中重新啓動Service

某些設備(小米,華爲,其他一些中國手機,某些LG和聯想設備)必須將您的應用手動添加到「受保護應用」列表或「允許在後臺運行的應用」 「以便Android自動重啓您的Service。在這些設備上,即使您已從onStartCommand()返回START_STICKY,Android也不會自動重新啓動您的Service

又見Situations when a Service's onDestroy() method doesn't get called?

+0

我同意這個解釋。但在Playstore中,有幾個AppLocking應用程序可以通過跟蹤Android應用程序堆棧的頂級應用程序來鎖定應用程序。他們正在運行後臺服務並檢查堆棧的最頂層應用程序。這些應用程序如何處理這個問題。在小米,三星的設備;我檢查了Applock應用程序的服務被殺,但幾秒鐘後又重新開始。 – Custadian

+0

這些應用程序是否可以安裝爲「設備管理器」? –

+0

這些是沒有設備管理員權限的應用程序:| – Custadian

0

我使用下面的代碼段用於重複報警與RTC,

Context ctx = getApplicationContext(); 
     Calendar cal = Calendar.getInstance(); 
     AlarmManager am = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE); 
     long interval = 100 * 5; 
     Intent serviceIntent = new Intent(ctx, BackgroundService.class); 
     PendingIntent servicePendingIntent = 
       PendingIntent.getService(ctx, 
         BackgroundService.SERVICE_ID, 
         serviceIntent, 
         PendingIntent.FLAG_UPDATE_CURRENT); 
     am.setRepeating(
       AlarmManager.RTC, 
       cal.getTimeInMillis(), 
       interval, 
       servicePendingIntent 
     ); 

隨着PendingIntent.FLAG_UPDATE_CURRENT,它更新當前服務本身還有其他的標誌也將取消現有的服務並開始一個新的。

BackgroundService.SERVICE_ID,創建了一個靜態服務。

這個Android開發者官方文檔幫助我,

Alarms (based on the AlarmManager class) give you a way to perform time-based operations outside the lifetime of your application. 

https://developer.android.com/training/scheduling/alarms.html#set