簡體   English   中英

長期運行的Android'服務'

[英]Long running Android 'service'

我有一個Android應用程序,其中的活動會激活在后台運行的長時間運行的操作。 完成后,這些操作與活動交互。 我正在開發一個處理Activity / Long-Running-Task耦合的組件,負責處理被破壞和重新創建的活動。

現在該組件被實現為Android服務。 這些活動調用bindService並使用生成的IBinder來啟動和跟蹤任務。 我決定不使用startService,因為我更喜歡通過Java接口提供更豐富的API。

現在問題。 活動A啟動,綁定到服務並調用serviceApi.runTask(...)。 然后銷毀活動A(例如,因為用戶翻轉電話)並重新創建為活動A'。 然后'再次綁定到服務,宣布它的存在,一切都應該運行良好。

除了我的服務被破壞。 當活動A被銷毀時,它將從服務中解除綁定。 Android看到沒有更多的客戶端,並殺死了服務。 創建活動A'時,將再次創建服務,並且我將丟失舊服務所具有的所有內容。

我能看到的唯一解決方案是使用單例進行服務。 然后它並不一定是Android服務,只是每個人都可以訪問的實例。 這在Android中不受歡迎嗎? 是否有更好的設計適合這個問題?


編輯:即使我調用startService然后綁定它,只要應用程序正在運行,就不能保證服務實例會存在。 如果資源不足,Android可以殺死粘性服務。 殺死服務會導致應用程序出現故障,我無法做到這一點。

即使我調用startService然后綁定它,只要應用程序正在運行,就不能保證服務實例會存在。

正確。

如果資源不足,Android可以殺死粘性服務。

也正確。 所有“粘性”意味着Android可能會重啟服務。

殺死服務會導致應用程序出現故障,我無法做到這一點。

創建一個保證永遠運行的服務是不可能的。 對於初學者來說,用戶可以隨時擺脫您的服務,因為用戶厭惡那些擁有永無止境的無意義服務的開發人員。 只有極少數情況下才需要編寫永久性服務; 否則,這只是草率的編程。

我能看到的唯一解決方案是使用單例進行服務。 然后它並不一定是Android服務,只是每個人都可以訪問的實例。 這在Android中不受歡迎嗎?

當進程終止時,單身人士(也就是靜態數據成員)將會消失。 該過程最終將終止,特別是如果沒有活動服務且您的任何活動都不在前台。

調用startService並在onStartCommand中返回START_STICKY。 它應該保持服務。

您可能還想查看前台服務:

http://developer.android.com/reference/android/app/Service.html#startForeground(int,android.app.Notification

喲必須創建持久的服務。 請參閱本手冊

換句話說 - 不要調用bindService ,調用startService

暫無
暫無

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

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