android - BroadcastReceiver 中的 postDelayed

标签 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()。

看来我的 BroadcastReceiver 进程在调用 run() 之前就快死了。

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

最佳答案

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

关于android - BroadcastReceiver 中的 postDelayed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15049981/

相关文章:

java - 使用Google Drive存储Android应用程序数据

android - 选择列表首选项时执行操作

java - 无法设置作为从服务器到 CustomListView 适配器的响应而出现的数据

android - 如何在 Android Things 中预览 Raspberry 中的相机?

安卓游戏开发。

java - 警报对话框 : a string is not converting to bold text

android - 如何在 Android Things 上通过 USB 驱动程序启用以太网?

android - 使用 Room Persistence 库插入一对多关系

android - 编译 ffmpeg 仅用于将图像转换为视频(带声音)

android - 谷歌地图上没有显示几个位置