android - 使用 AlarmManager 手动更新小部件

标签 android widget android-intent alarmmanager android-pendingintent

如 Android 开发指南中所述,如果您希望小部件更频繁地更新,您应该使用 AlarmManager 设置不唤醒设备的警报。

原则上:不要使用 AppWidgetProvider 类提供的标准机制及其在 xml 文件中使用 android:updatePeriodMillis 轻松设置。

我很抱歉问,但指南只是说“使用 AlarmManager,使用 RTCELAPSED_REALTIME,......”但是我究竟如何发送一个 Intent 到只是更新我的小部件丢失了!!!

任何人都可以说明我需要的代码来形成模仿默认行为的 PendingIntent 吗?我不知道如何获取小部件 ID,我应该使用哪个操作等等......遗憾的是开发指南在这一点上停止了解释! 哪个 Action 需要额外的东西?

如果有人对我为什么要更新频率超过 30 分钟感兴趣:我的小部件会显示下一类公共(public)汽车何时从车站出发。每 20 分钟有一类公共(public)汽车,所以我有两个选择:每分钟更新一次小部件,显示下一类公共(public)汽车的出发时间(这就是我想要的!!)或者,不太好,说明下一类公共(public)汽车的出发时间所以我必须至少每 20 分钟更新一次!

现在:当设备处于 sleep 状态时,当然,这永远不会唤醒它——所以我对开发指南中这一部分的理解是,这是实现它的正确方法;有人认为我错了吗? 哦,还有一件事我想知道:如果设备在应该更新小部件时处于 sleep 状态,并且由于设备处于 sleep 状态而没有发出警报,它会在唤醒时立即更新吗???

感谢您的帮助!

PS:我真的很想知道为什么小部件提供程序的 xml 定义不允许通过 bool 开关简单地声明“不要唤醒设备”……这首先会让生活变得更加轻松!无论如何需要什么样的小部件来唤醒设备??? ;-)

这是我到目前为止的进展,但它不起作用 - 没有任何反应:

private void startAlarm(Context pContext) {
    Log.d(TAG, "startAlarm");
    AlarmManager am = (AlarmManager) pContext.getSystemService(Context.ALARM_SERVICE);

    Intent intent = new Intent("android.appwidget.action.APPWIDGET_UPDATE");
    intent.setClass(pContext, getClass());
    PendingIntent pi = PendingIntent.getBroadcast(pContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

    am.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, pi);
}

最佳答案

Could anybody please state the code I need to form the PendingIntent that mimics the default behaviour?

我不会,因为据我所知,不可能精确地“模仿默认行为”。只需拥有 AlarmManager闹钟使用PendingIntent向您的 AppWidgetProvider 发送自定义操作您在 onReceive() 中处理的, 或调用 startService()IntentService 上您正在使用应用程序小部件背后的真正智慧。

I don't have a clue how to get the widget ids

您从实际 onUpdate() 中保存了小部件 ID调用,例如当应用程序小部件首次出现在屏幕上时。当您的闹钟响起时,更新您所有的应用小部件。

update the widget every minute, displaying the departure time of the next bus (that's what I want!!)

请允许这是用户可配置的。

Oh, another thing I would like to find out: if the device is asleep when the widget should be updated and my alarm is not issued due to the sleeping device, will it be updated IMMEDIATELY when it wakes up???

据我所知,是的,但我没有使用过不属于 _WAKEUP 的警报多样性。

关于android - 使用 AlarmManager 手动更新小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4984681/

相关文章:

android - 在 Android 中启动新 Activity 后调用 finish() 是个好主意吗?

c++ - GTK 小部件对话框不关闭

android - 将数组列表从一个 Activity 传递到另一个 Activity

Android/Cordova 与 google-play-services 构建依赖关系错误(多个库的包名称为 'com.google.android.gms' )

java - ASyncTask 导致 getDatabaseLocked

java - 单击按钮时显示/隐藏 ImageView

android - Webview 在 android 中不工作

python - 减少 menu.add_command() 困惑/重复行

wordpress - Woocommerce/Wordpress - 将用户登录重定向到主页

android - 为什么启动紧急拨号器的 Intent 没有常量?