2016-06-11 50 views
2

所以我需要在很短的頻率(30秒)內將座標從當前位置發送到服務器。目前我正在使用AlarmManager setRepeating(),但Android 5.0+允許最多1分鐘的間隔時間來節省電量。在Android 5.0+中使用重複警報短時間間隔的正確方法是什麼?

我的問題是:

我的方式真的很有效嗎?我需要在後臺運行此重複鬧鐘,即使設備關閉。目前我正在執行pendingintent,這導致broadcastreceiver轉而執行到asynctasks,一個用於服務器認證,一個用於發佈座標。

回答

1

我的方式真的有效嗎?

不需要。這就是爲什麼它不支持Android 5.1+開箱即用,這就是爲什麼Android 6.0引入打盹模式的原因。

我需要在後臺運行此重複警報,即使設備關閉。

我假設通過「設備關閉」您確實是指「屏幕關閉」。如果設備斷電,您的代碼將無法運行。

您可以使用setExact()以30秒的間隔「手動」執行您自己的重複事件,其中您對警報事件所做的工作包括安排下一次警報。當設備處於打盹模式時,這也會在Android 6.0+設備上失敗。在Android 6.0+上獲得每30秒行爲的唯一方法是讓用戶在「設置」中將您的應用添加到電池優化白名單。

目前我正在執行pendingintent,它導致broadcastreceiver反過來執行到asynctasks,一個用於服務器認證,一個用於發佈座標。

首先,這不太可靠。由於Android認爲您的工作已完成,您的流程可以在onReceive()返回時立即終止。

其次,AsyncTask通常沒有像廣播這樣的後臺操作。 AsyncTask背後的全部要點是,當後臺工作結束時,您可以在主應用程序線程上工作,並且沒有理由在後臺的主應用程序線程上工作。由於這個以及上述原因,請使用單個IntentService來替換兩個AsyncTasks

第三,在任何給定的警報事件中,由於網絡擁塞,服務器問題等原因,您將無法在30秒內完成您的工作。您需要確保處理此事適當的,這樣你就不會排隊等待各種請求(或者,在你現在的實施中,分叉許多並行的AsyncTasks都試圖完成他們的工作)。

+0

據我所知,setExact()不是一個重複的警報,所以我怎麼安排一個重複鬧鐘,讓我們說,與setExact()30秒? –

+0

@MarkTyers:引用我的回答:「你可以使用'setExact()'手動」在30秒的時間間隔內完成你自己的重複事件,其中你在報警事件上做的工作包括安排下一次報警。你表示你的警報觸發了一個接收器(希望是一個'WakefulBroadcastReceiver')。讓接收器啓動'IntentService'並調用'setExact()'來安排下一個事件。或者,一旦工作完成,讓IntentService調用setExact()來安排下一個事件,以避免排隊工作。 – CommonsWare

+0

所以基本上我必須在Button按鈕上爲'BroadcastReceiver'設置一個'setExact()',並在'BroadcastReceiver'中的代碼末尾設置另一個'setExact()'?我該如何阻止它? –

相關問題