我有一个在特定时间触发的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()。
在调用run()之前,似乎我的BroadcastReceiver进程正在死亡。
知道为什么吗?关于如何避免它的任何想法?
答案 0 :(得分:5)
BroadcastReceivers总是在使用后立即销毁。我不确定它是否在某些先前版本的Android中发生了变化,但您绝不应该假设广播接收器的实例会保留。它们的目的是立即处理事件,使用AlarmManager或在服务中进行延迟处理。