簡體   English   中英

Android - 服務,IntentService,JobIntentService - 如果應用程序被殺,它們將被停止

[英]Android - Service, IntentService, JobIntentService - they are stoped if app killed

我在StackOverflow和Web中已經閱讀了很多相同的問題但是無法配置類似“永不停止服務”的東西或者甚至在從任務中刪除應用程序(強制被殺)時也可以運行。 我只是想知道像Viber或WhatsUp這樣的服務是如何工作的,因為當我們強制殺死那些應用程序時,當有人寫信給我們時我們仍然能夠接收消息(所以服務仍在運行)。 我知道前台服務,但它不是解決方案,因為用戶不想看到通知。 所以我在這里嘗試過。 :此代碼在運行內部服務以檢測實時更改,並且只是希望在應用程序的每個條件中保持活動:前景,背景,刪除等...

firestoreDb!!.collection("example").document("example").collection("real_time_request")
                    .addSnapshotListener { documentSnapshot: QuerySnapshot?, _: FirebaseFirestoreException? ->

                    }

我正在使用這樣的服務,以便在用戶集合中發生更改時從Firestore數據庫獲取實時數據。

我嘗試服務的方式是:

FirestoreListeners : IntentService("Firestore Listeners")
FirestoreListeners : Service
FirestoreListeners : JobIntentService

當應用程序處於前台或后台時,上面的所有內容都正常工作,但是在應用程序強制關閉(從任務中刪除)后服務將被終止

我試圖在清單中進行此更改:

android:stopWithTask="false"
android:directBootAware="true"
android:process=":remote"

在應用層次中:

android:persistent="true"

在IntentService onHandleIntent中:

setIntentRedelivery(true)

在服務onStartCommand:

return START_STICKY

如果系統銷毀或殺死它,試圖重新啟動服務:

override fun onTaskRemoved(rootIntent: Intent) {
        val restartServiceIntent = Intent(applicationContext, this::class.java)
        restartServiceIntent.setPackage(packageName)
        val restartServicePendingIntent = PendingIntent.getService(applicationContext, 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT)
        val alarmService = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePendingIntent)
        Log.e("Service Firestore ", "Task Removed")
        super.onTaskRemoved(rootIntent)
    }

但沒有任何作用。 實現這一目標的最佳解決方案是什么? 所以目的是讓某些東西在后台運行並監聽Firestore Changes(或其他東西),即使在應用程序被殺或從Viber等任務中刪除之后......也許他們正在使用沒有通知圖標的前台服務? 但我不認為Android允許我們制作這種前台服務(沒有通知)

我已經閱讀了一些關於WorkManager文章,Google也說:

注意:WorkManager適用於需要保證系統即使應用程序退出也會運行它們的任務,例如將應用程序數據上傳到服務器。 如果應用程序進程消失,它不適用於可以安全終止的進程內后台工作; 對於這種情況,我們建議使用ThreadPools。

但無法弄清楚它是如何正常工作或如何用於我的目的

謝謝

當應用程序未運行/前台時,您可以使用FCM推送通知喚醒設備。當應用程序收到推送通知時,您可以啟動服務以執行所需任務。 當應用程序處於后台時,您可能無法啟動服務,因為您可能需要將服務作為前台服務運行。

WorkManager現在是做一些工作背景的最佳解決方案。 因為現在Android操作系統對它允許在后台運行很長一段時間的限制更為嚴格。 從官方文檔... WorkManager選擇適當的方式來安排后台任務 - 根據設備API級別和包含的依賴項,WorkManager可能使用JobScheduler,Firebase JobDispatcher或AlarmManager。

Android開發者網站是開始學習WorkManager的好地方https://developer.android.com/topic/libraries/architecture/workmanager/basics

對於將在其間延遲運行的定期任務,您可以創建PeriodicWorkRequest並將其排入WorkManager實例。 https://developer.android.com/topic/libraries/architecture/workmanager/basics#recurring

另一種較舊的方法是使用AlarmManager。 這樣,您就不必一直在后台運行服務。 您可以設置重復警報,當它觸發時,您可以啟動服務並執行所需操作。

在Android Doze模式文檔中,他們指定使用FirebaseJobDispatcher,即使在Doze模式下也能使用。 但這只會在每15分鍾一次。 您可以使用Android架構組件中的WorkManager,它可以在相應支持的API級別上適當地使用FirebaseJobDispatcher,AlarmManager和JobScheduler

您已經提到您熟悉一個應用程序,它可以滿足您的需求。 使用https://play.google.com/store/apps/details?id=sk.styk.martin.apkanalyzer (或類似應用)檢查應用的清單文件,或重構應用。 問候。

暫無
暫無

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

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