2017-03-17 97 views
1

在這裏,我想問一個基本問題,我無法找到答案,而我做代碼。Android:Singleton實例與服務

據我所知,在應用程序onCreate()中創建一個單例實例比android服務具有更小的脆弱性。在我的應用程序中,我想傾聽位置更新,該位置更新應該不太可能被破壞。如果我保持服務,它可能會在低內存中被殺死,但仍然可以在後臺運行應用程序,以保持實例。所以我想用單例實例而不是服務。

這是一個正確的方法嗎?

+0

單被立即殺死了你的活動被摧毀後,我寧願留在服務 – mayosk

+0

@mayosk會這樣呢?即使我創造了單一實例,我也不認爲它會被殺死。但無論如何,我想創建它的應用程序onCreate()只。 – sd33din90

+0

做一個測試,在你的單身人士創建方法中,每分鐘都會記錄一些東西,嘗試一下你的應用程序是否可見,然後去應用程序並檢查 – mayosk

回答

0

如果你問我的意見,我不會推薦。因爲兩者在後臺吸取用戶的電池。

我會做的是 - 只在主要活動的前景獲取位置更新。同時開始使用Google Play服務FusedLocationProvider,而不是實現Android默認的一個。

當你的應用程序變爲背景時刪除位置更新。所有的指導方針都在android開發人員網站上。

https://developer.android.com/training/location/receive-location-updates.html

+0

但是在我的應用程序中,即使應用程序在後臺,我也想要聽位置更新。我知道電池是主要問題,但對我的應用程序來說可以忽略不計。 – sd33din90

0

最好的做法是在Application類創建Singleton實例。

因此,它將可用,而ServiceActivity存在。

也可以使用Foreground Service,如果檢測到低內存,它不會被終止。

此外,您還可以處理Application類中的低內存事件或Service中的onDestroy,並將數據序列化爲SharedPreferences。 START_STICKY服務將盡快重新啓動。

0

我認爲你的問題在於維護組件24到365,以便管理位置。

您可以通過管理onStartCommand中的返回標誌來維護您的服務以防止它被重新啓動。 START_STICKY等。

讀出更多的位置: https://developer.android.com/reference/android/app/Service.html#START_STICKY

+0

如果應用程序在低內存中運行,粘滯服務也會被破壞,但應用程序仍有可能運行。 – sd33din90

+0

它將由Android重新啓動..您還可以使用重新傳送意圖獲取數據... – Ishant

0

根據您的描述,我建議採取前景服務。跟蹤用戶的位置使用了很多batterie。因此,您的用戶應始終注意您的應用程序仍在運行的事實。

你也在阻止系統以這種方式殺死你的應用程序。

前臺服務是用戶主動意識到 ,是不是系統殺死時內存不足的候選者的服務 Source

3

的Android可以(而且會)終止後臺在低資源情況下進行處理,有時也僅僅是因爲它想要(特別是在低端設備上以節省電池和內存資源)。它通過來完成這一操作,從而阻止託管您的應用程序的操作系統進程。在這種情況下,您的應用將不再在後臺運行,因此您在Application.onCreate()中創建的任何單身也將消失。

Android完全不瞭解你的單身,因此沒有理由恢復它。

但是,如果你創建一個ServiceService返回START_STICKYonStartCommand(),這告訴Android你Service要保持運行所有的時間(如果可能)。在這種情況下,如果Android殺死承載您的Service的操作系統進程(由於資源限制或僅僅因爲它想),Android會自動重新啓動您的Service(因爲Android知道您的Service並知道它想運行所有時間)。這是做到這一點的正確方法。

注意:有一些設備(特別是像小米,華爲,LG,聯想等中國設備)不會自動重啓STICKY服務。這些設備維護允許在後臺運行的「受保護的應用程序」或「特權應用程序」的列表,並且Android只會爲列表中的應用程序重新啓動STICKY服務。您需要讓用戶手動將您的應用添加到此列表。無法以編程方式將您的應用程序添加到這些設備上的此列表。

https://stackoverflow.com/a/42120277/769265https://stackoverflow.com/a/41369032/769265