0

我是Android新手,所以我想確保以下解決方案是正確的。在Android中安排後臺工作

問題: 我想每隔10分鐘通過web服務將設備的本地數據庫與服務器上的數據庫同步。我已經有了一個可以返回新/更新記錄的Web服務調用。我想知道的是安排此任務的最佳方式是什麼。即使應用程序未運行,我也希望數據庫同步。我的解決方案(這是正確的路線嗎?): 我將有一個BroadcastReceiver偵聽android.intent.action.BOOT_COMPLETED,它的onReceive我將創建一個AlarmManager,它將消息發送到MyReceiver(通過每10分鐘一個PendingIntent)。另外,在我的應用程序的啓動過程中,我會做同樣的事情(創建一個通過PendingIntent向MyReceiver發送消息的警報) - 由於兩個警報都向MyReceiver發送消息,並且使用PendingIntent.FLAG_UPDATE_CURRENT初始化其相應的PendingIntents,所以新警報將覆蓋舊的? (這是我想要做的,如果出於某種原因,設備啓動後報警會被取消,應用程序啓動時應該重新啓動)。

在MyReceiver的onReceive()我將創建一個MyIntentService(此實例將使Web服務調用並更新本地數據庫)。

這是一個很好的解決方案嗎?有什麼建議麼?如果存在

感謝

回答

1

以這種方式使用FLAG_UPDATE_CURRENT將覆蓋現有的PendingIntent。我並不積極,但我相信只要你進入onReceive,PendingIntent就會被消耗掉,所以它不再被覆蓋。無論在哪種情況下,這聽起來像是你正在尋找的功能,是的,這是解決這類問題的好方法。我唯一的建議是,如果10分鐘的時間間隔不是絕對關鍵的,那麼在你的AlarmManager中使用INTERVAL_時間表(例如INTERVAL_FIFTEEN_MINUTES)來幫助節省電池壽命;基本上,它允許所有按時間間隔運行的應用程序一起「批量」工作,並且不太頻繁地喚醒設備。

2

解決方案很好......實際上,當設備關閉並重新啓動時,所有的AlarmManager實例都會被清除。

簡單的方法是... 首先創建應用程序啓動時的AlarmManager。 第二次接收BOOT_COMPLETED BroadcastReceiver。

它足夠了,PendingIntent.FLAG_UPDATE_CURRENT將確保一次只有一個激活的警報。

通過這種方式,您的應用程序啓動時就會註冊警報。如果它已通過BOOT_COMPLETED註冊,則不會有任何問題。當您關閉設備時,激活的鬧鐘將停用,但BroadcastReceiver到BOOT_COMPLETED將在下次開機時處理註冊新鬧鐘。

如果您決定回答您的問題,請將其標記爲「已接受」。這會提高你的和我的聲望得分。

此外,您還需要查看使用網絡的時間間隔,這可能會非常耗費設備和用戶的資源。一種策略可能是在用戶啓動應用程序時有更長的時間間隔並檢查更新(這可能不便於用戶使用,但可以節省很多系統資源和電池電量)。嘗試根據您的需求找到一些更好的政策。