我有一个在特定时间触发的 BroadcastReceiver(通过 AlarmManager)。它以编程方式安排,具体取决于用户设置的首选项。
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() 之前就死了。
知道为什么吗?关于如何避免它的任何想法?