我有一個在特定時間觸發的BroadcastReceiver(通過AlarmManager)。它以編程方式安排,取決於用戶設置的偏好。postRelayed在BroadcastReceiver
的廣播接收器做(簡體和僞代碼):
public void onReceive(Context context, Intent intent) {
handler = new Handler();
wifiManager.setWifiEnabled(true);
// Wait a few seconds to activate wifi and get IP
handler.postDelayed(new Runnable() {
void run() {
doTheJob();
}
}, 30000);
}
public void doTheJob() {
doSomethingAndTheOther(); // this starts service: context.startService(i);
wifiManager.setWifiEnabled(false);
}
我已經用了好幾年的HTC Desire這段代碼沒有問題。此外,沒有用戶抱怨它無法正常工作。
不過,我最近買了一臺Galaxy S3,並沒有像預期的那樣工作。當我在未來幾分鐘內設置鬧鐘(使用告訴的首選項)時,它會按預期工作:BroadcastReceiver喚醒,wifi打開,等待等待,工作完成並關閉WiFi。
但是,如果我在夜間設置鬧鐘(例如,3:00:00),則不會觸發鬧鐘,打開wifi ......並且沒有其他任何事情。這項工作既沒有完成,也沒有顯示最終沒有關閉wifi。我創建了日誌並調用了postDelayed(),但Runnable.run()永遠不會被調用。
看起來,我的BroadcastReceiver進程在run()被調用之前即將死亡。
任何想法爲什麼?任何關於如何避免它的想法?
你在onReceive()中創建處理程序嗎? – sandrstar 2013-02-24 08:51:27
@sandrstar:是的,我喜歡。我編輯了僞碼來記錄這一點。 – 2013-02-24 16:24:50