postDelayed在BroadcastReceiver中

时间:2013-02-24 08:26:14

标签: android

我有一个在特定时间触发的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进程正在死亡。

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

1 个答案:

答案 0 :(得分:5)

BroadcastReceivers总是在使用后立即销毁。我不确定它是否在某些先前版本的Android中发生了变化,但您绝不应该假设广播接收器的实例会保留。它们的目的是立即处理事件,使用AlarmManager或在服务中进行延迟处理。