這必須定期(每1-5mins約)發生,但最重要的是它必須發生的時間,從來沒有停止,免受操作系統關閉過程下來回收內存,並且在應用程序本身沒有運行。
這不是嚴格可行的,在各種各樣的方面。
讓我們帶他們一塊在一個時間:
這必須定期(每隔大約1-5mins)發生
你可能無法得到的地點,時期,更別說每1-5分鐘。用戶可能已禁用所有位置提供程序。用戶可能使設備處於飛行模式。用戶可能位於大型建築物(阻擋GPS),連接不暢(使網絡供應商不可靠)。
從未停止
用戶總能經由設置管理服務屏幕或任務的殺手幹掉你。如果他們這樣做,特別是在Android 3.1+上,您的應用將永遠不會以任何理由再次運行,直到用戶啓動您的活動(例如,通過啓動器)。當然,用戶也可以卸載你的應用程序。
免受操作系統關閉過程到回收內存
你不能保證在此。你可以減少機率,但就是這樣。
現在,讓我們看看你的各種解決方案:
使用服務來收集位置的事件和處理它們。
從這句短語(和隨後的句子),你的意思是一個永恆的服務,一個旨在運行24x7。根據定義,這意味着你的應用程序正在運行,這違反了你的規則之一。假設你放鬆這一規則,這種解決方案大規模增加的可能性,用戶將擺脫你的服務,並增加了Android將擺脫你的服務的可能性。您可以通過使用startForeground()
來最小化後者。
報警。我收集這些可以在內存短缺時關閉。
不是我所知道的。但是,如果用戶擺脫了你,你的警報將被刪除。
這似乎是一個醜陋的解決方案,地點將按計劃進行反正
沒有到達,他們不會。 requestLocationUpdates()
上的時間參數並不意味着「地點將按照時間表到達」。
通過廣播意圖傳送的位置意味着我可以在廣播接收器中處理位置事件。
不,你不能。您已經指出您的部分工作將是將這些數據發送到服務器。您無法在主應用程序線程中可靠地執行此操作,因爲它可能需要很長時間。 A getService()
PendingIntent
,指向IntentService
會更可靠。
將這些位置警報繼續下去?
否參見下文。
除了設備關機或應用程序關閉以外的任何事情會導致它們停止嗎?
用戶可以擺脫你的應用程序(卸載,任務殺手,管理服務)。用戶可以禁用位置提供程序。用戶可以進入無法確定位置的區域。等等
此外,該設備可能會睡着了,AFAIK。在登記的更新請求期間,系統可能會保留WakeLock
。系統甚至可能會在內部使用AlarmManager
來安排在您提供的時間內喚醒自己,因此它不必保持設備不間斷喚醒。但是,您需要徹底測試。
什麼是最耐用的方法?
如果我上一段中的問題由操作系統處理,您的第三個選項可能是最強大的。在您的IntentService()
中使用startForeground()
,並在退出onHandleIntent()
之前致電stopForeground()
- 即使由AlarmManager
開始的短期服務可能因內存不足而死亡,這讓我大吃一驚。
這就是說,你想要的行爲似乎可能會消耗更多的電池壽命比用戶可能想要的。請允許用戶控制投票時間,包括「從不投票,我會手動更新」選項。