簡體   English   中英

如果刪除了服務啟動的活動,則不會調用onTaskRemoved

[英]onTaskRemoved not getting called if the activity started by the service is removed

我正在使用oreo 8.1.0。 我正面臨一個奇怪的問題,我在stackoverflow上找不到解決方案,因此我正在寫這個問題。 我知道一個解決方案,通過前台服務,我可以實現它,但我沒有在我的應用程序上下文中找到用戶友好的通知。

我將用兩種情況描述我的問題。

案例1:當用戶通過單擊圖標打開我的應用程序並將其從最近的應用程序中刪除時,服務會自動重新啟動。 這可以。

案例2:我的應用程序已關閉,不在最近的應用程序中。 當用戶復制文本時,我的服務會啟動我的應用程序的某個活動,但是當他從最近的應用程序中刪除它時,我的服務將永久停止。

所以我的問題在於第二種情況,我不希望我的服務被殺死。 即使它被殺死我想讓它重新啟動。

我嘗試了stackoverflow上提到的所有方法,比如使用START_STICKY和onTaskRemoved,但我無法使其工作。

甚至我試圖在用戶點擊最近的應用程序按鈕並以編程方式從最近的應用程序中刪除它時殺死我的活動,但這也無效。 雖然這會在第二種情況下重新啟動服務,當用戶使用后退按鈕殺死我的應用程序時。

這部分代碼來自用戶復制某些文本時打開的活動。

@Override
public void finish() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        super.finishAndRemoveTask();
    } else {
        super.finish();
    }

}

這部分代碼來自啟動活動的服務。

@Override
public void onTaskRemoved(Intent rootIntent){
    Log.d("testing 12","onTaskRemoved");
    Intent restartServiceTask = new Intent(getApplicationContext(),CBWatcherService.class);
    restartServiceTask.setPackage(getPackageName());
    PendingIntent restartPendingIntent =PendingIntent.getService(getApplicationContext(), 1,restartServiceTask, PendingIntent.FLAG_ONE_SHOT);
    AlarmManager myAlarmService = (AlarmManager) getApplicationContext().getSystemService(this.ALARM_SERVICE);
    myAlarmService.set(
            AlarmManager.ELAPSED_REALTIME,
            SystemClock.elapsedRealtime() + 1000,
            restartPendingIntent);

    super.onTaskRemoved(rootIntent);
}

@Override
public int onStartCommand(Intent intent,int flag,int startId){
    super.onStartCommand(intent, flag, startId);
    return START_STICKY;

}

編輯1
我只是需要服務才能保持活力。這些東西不會妨礙我的應用案例中的用戶體驗
1.當調用onPause以便服務不會被殺死時,以自己的方式自行殺死活動是可以接受的
2.顯示幾秒鍾的通知是可以接受的
3.可以重新啟動服務

從Android Oreo開始,存在一種限制后台服務執行的范例轉換。 這是一個經常被批評影響電池壽命,性能和安全性的因素。 正如上面的評論中所述,還有其他方法,如JobScheduler。

可以非常復雜地將服務重構為JobScheduler模式。 我建議您考慮從Android支持v4庫將IntentService更改為JobintentService 它在Oreo和更高版本的目標上使用JobScheduler,但在舊設備上恢復為舊的IntentService設計。 您只需要在Service實現中用onHandleWork替換onHandleIntent的覆蓋。

android:permission="android.permission.BIND_JOB_SERVICE"

到AndroidManifest.xml中的服務聲明。 添加它也很有用

 <uses-permission android:name=”android.permission.WAKE_LOCK” />

但是,說完這一切,通過閱讀你的問題,在我看來,你的基本抱怨是需要通知的前台服務的裝飾性問題。 在我看來,您的解決方案要么只是簡單地使用Context.startForegroundService,要么確保您的服務受到約束。 無論哪種方式,用戶都可以看到服務正在運行。 你會發現試圖破壞Android設計決策是一項艱難的任務; 更好地擁抱它 - 他們希望你從現在開始顯示這些通知。

無論如何,即使您無法完全避免這些通知圖標,更新您的代碼也可以使用較新的Android目標。

這就是問題每當我的服務用於啟動活動時,我的服務過去常常在活動開始后被銷毀。

為什么onTaskRemoved不起作用?
我正在做的事情不起作用,因為我的服務曾經被破壞,因此聽不到onTaskRemoved它是不活躍的。

我怎么解決了?
這個問題的解決方案是檢查活動(由服務啟動)以檢查服務是否存活。 在我的情況下,服務被摧毀。 因此,如果服務不活動,我需要再次啟動服務。
它甚至適合OREO設計模式,因為我們可以在應用程序處於前台時啟動后台服務,即使活動被破壞,服務也將保持活動狀態。

在奧利奧雖然有時服務被破壞但這是一個不同的問題。

更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM