我有一个在特定时间(通过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或在服务中进行。

07-24 09:47
查看更多