Android - AppWidgets、AlarmManager 和 AsyncTask

Posted

技术标签:

【中文标题】Android - AppWidgets、AlarmManager 和 AsyncTask【英文标题】:Android - AppWidgets, AlarmManager and AsyncTask 【发布时间】:2010-12-24 06:19:48 【问题描述】:

我在使用AlarmManager 生成的广播更新应用小部件时运气不佳。这是我的工作:

AppWidgetProvider#onEnabled上初始化AlarmManager

AlarmManager alarms = (AlarmManager) context.getSystemService(
        Context.ALARM_SERVICE);
    alarms.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
    SystemClock.elapsedRealtime(), 60000, pendingIntent);

我还定义了广播接收器,它只监听AlarmManager 触发的更新。当更新被触发时,代码运行AsyncTask 进行网络调用。当AsyncTask 完成时(onPostExecute),它使用先前获得的AppWidgetManager 实例来更新小部件。 这一切实际上运行良好,直到在日志中我看到消息 "Process com.foo.myapp (pid 12345) has died" 之后,AlarmManager 再也不会触发另一个更新。

我是否需要进行某种检查以重新启动警报?例如,当用户访问小部件的父应用程序时?如果我的应用在请求过程中死机,如何确保我可以完成长时间运行的任务并返回到小部件?

【问题讨论】:

【参考方案1】:

当更新被触发时,代码运行 进行网络调用的 AsyncTask。

如果这是在BroadcastReceiver 内,那将不起作用。您不能安全地从 BroadcastReceiver 派生线程,AsyncTask 有效地派生线程以异步执行其任务。

相反,您应该将长期运行的工作委托给 service started from the alarm BroadcastReceiver

【讨论】:

好吧,我买了 - 我不明白:为什么我的警报在应用程序被杀死后永远不会重新触发?还是因为 BroadcastReceiver 与应用程序一起死了?但是,即使我运行服务,如果应用程序以同样的方式被杀死,会发生什么?我想我在这里缺少一些基础知识 另外 - 在启动服务并获得锁之后,我应该为我的长时间运行的任务生成一个线程还是将其作为服务的一部分运行? 我不知道为什么 AlarmManager 永远不会再次触发,但我建议修复已知问题(在 BroadcastReceiver 中分叉一个线程)并希望清除未知问题(叶状体化警报)。 IntentService 会自动在后台线程中运行 onHandleIntent(),因此如果您使用 IntentService,则无需 fork 自己的。 谢谢马克 - 今天早上试了一下,但是哦,天哪,为什么要这么复杂?! 顺便说一句 - 作为旁注。 Mark 在 Advanced android 第 13 章中对此有很好的概述(我最后一次睡前阅读)

以上是关于Android - AppWidgets、AlarmManager 和 AsyncTask的主要内容,如果未能解决你的问题,请参考以下文章

Android:多个 AppWidgets - 一个清单条目

Flutter:是不是有可能创建 App Widgets (Android) 和 Today Extensions (iOS)? [复制]

Android:在创建时配置 Appwidget 大小

在接收器中听到啥动作用于闹钟 android

如何使用 AlarmClock 在 android 中设置闹钟的日期

应用程序在android中可以拥有的小部件数量