Android 广播接收机中的后延迟

Android 广播接收机中的后延迟,android,Android,我有一个在特定时间触发的广播接收器(通过AlarmManager)。它是根据用户设置的首选项按程序安排的 BroadcastReceiver执行以下操作(简化和伪代码): 我已经在HTC Desire中使用此代码好几年了,没有任何问题。此外,没有用户抱怨它不工作 然而,我最近买了一个GalaxyS3,它并没有像预期的那样工作。当我在未来几分钟内设置闹钟(使用告知的首选项)时,它会按预期工作:广播接收器被唤醒,wifi被打开,等待被等待,工作完成,wifi被关闭 但是如果我在晚上设置闹钟(例如,3

我有一个在特定时间触发的广播接收器(通过AlarmManager)。它是根据用户设置的首选项按程序安排的

BroadcastReceiver执行以下操作(简化和伪代码):

我已经在HTC Desire中使用此代码好几年了,没有任何问题。此外,没有用户抱怨它不工作

然而,我最近买了一个GalaxyS3,它并没有像预期的那样工作。当我在未来几分钟内设置闹钟(使用告知的首选项)时,它会按预期工作:广播接收器被唤醒,wifi被打开,等待被等待,工作完成,wifi被关闭

但是如果我在晚上设置闹钟(例如,3:00:00),它不会:闹钟被触发,wifi被打开。。。没有别的了。这项工作既没有完成,也显然没有在最后关闭wifi。我创建了日志并调用了postdayed(),但从未调用Runnable.run()

在调用run()之前,我的BroadcastReceiver进程似乎已死亡


知道为什么吗?有什么办法可以避免吗?

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

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

是否在onReceive()中创建处理程序?@Sandstar:是的,我创建。我编辑了伪代码来说明这一点。是否在onReceive()中创建处理程序?@sandrstar:是的,我创建了。我编辑了伪代码来说明这一点。嗯。。。说得好。。。doSomethingAndTheOther()启动一个服务来完成这项艰巨的任务(添加了注释)。但是,您是否建议在服务内部执行postDelayed()?这意味着要进行严重的重构,但这是有道理的。postDelayed将在处理程序的消息队列中放置一个事件。处理程序归接收方所有,没有其他引用。因此,当它的单一所有者被销毁时,它将被销毁,其中的消息将在那时消失。使用这种方法的第一次测试已经成功。我会在更多的测试后检查它是否被接受。嗯。。。说得好。。。doSomethingAndTheOther()启动一个服务来完成这项艰巨的任务(添加了注释)。但是,您是否建议在服务内部执行postDelayed()?这意味着要进行严重的重构,但这是有道理的。postDelayed将在处理程序的消息队列中放置一个事件。处理程序归接收方所有,没有其他引用。因此,当它的单一所有者被销毁时,它将被销毁,其中的消息将在那时消失。使用这种方法的第一次测试已经成功。我会检查它是否被接受后,一些更多的测试。
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);
}