我有一个在特定时间(通过AlarmManager)触发的BroadcastReceiver。它是通过编程方式安排的,具体取决于用户设置的首选项。
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 ...等。既没有完成工作,也没有明显关闭无线网络。我已经创建了日志,并调用了postDelayed(),但从未调用过Runnable.run()。
在调用run()之前,我的BroadcastReceiver进程似乎快死了。
知道为什么吗?关于如何避免的任何想法?
最佳答案
使用后始终会立即销毁BroadcastReceiver。我不确定在某些早期版本的Android中是否已更改,但您永远不应假定广播接收器的实例会存在。它们的目的是立即处理事件,而延迟处理应使用AlarmManager或在服务中进行。