我的方式真的有效嗎?
不需要。這就是爲什麼它不支持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
都試圖完成他們的工作)。
據我所知,setExact()不是一個重複的警報,所以我怎麼安排一個重複鬧鐘,讓我們說,與setExact()30秒? –
@MarkTyers:引用我的回答:「你可以使用'setExact()'手動」在30秒的時間間隔內完成你自己的重複事件,其中你在報警事件上做的工作包括安排下一次報警。你表示你的警報觸發了一個接收器(希望是一個'WakefulBroadcastReceiver')。讓接收器啓動'IntentService'並調用'setExact()'來安排下一個事件。或者,一旦工作完成,讓IntentService調用setExact()來安排下一個事件,以避免排隊工作。 – CommonsWare
所以基本上我必須在Button按鈕上爲'BroadcastReceiver'設置一個'setExact()',並在'BroadcastReceiver'中的代碼末尾設置另一個'setExact()'?我該如何阻止它? –