我有一个在特定时间触发的 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() 之前就快死了。
知道为什么吗?关于如何避免它的任何想法?
最佳答案
BroadcastReceivers 总是在使用后立即销毁。我不确定它是否在以前的 Android 版本中发生了变化,但你永远不应该假设广播接收器的实例会保留下来。它们的目的是立即处理事件,延迟处理应该使用 AlarmManager 或在服务中进行。
关于android - BroadcastReceiver 中的 postDelayed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15049981/