[英]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。 它應該保持服務。
您可能還想查看前台服務:
喲必須創建持久的服務。 請參閱本手冊 。
換句話說 - 不要調用bindService
,調用startService
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.