1

我有一个在特定时间触发的 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() 之前就死了。

知道为什么吗?关于如何避免它的任何想法?

4

1 回答 1

5

广播接收器总是在使用后立即被销毁。我不确定它是否在以前的 Android 版本中发生了变化,但你永远不应该假设广播接收器的实例会保留。它们的目的是立即处理事件,像这样的延迟处理应该使用 AlarmManager 或在服务中发生。

于 2013-02-24T08:49:52.900 回答