【问题标题】:Using AlarmManager to update widgets manually使用 AlarmManager 手动更新小部件
【发布时间】:2011-02-13 14:29:12
【问题描述】:

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

原则上:不要使用AppWidgetProvider 类提供的标准机制,并且可以通过xml 文件中的android:updatePeriodMillis 轻松设置。

我很抱歉问,但指南只是声明“使用 AlarmManager,使用 RTCELAPSED_REALTIME,...”但是我如何发送一个更新我的小部件的意图丢失了!!!

谁能说明我需要的代码来形成模仿默认行为的PendingIntent?我不知道如何获取小部件 ID,我应该使用哪个操作等等......遗憾的是,开发指南此时停止解释! 需要什么作为附加操作?

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

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

感谢您的帮助!!

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

这是我到现在为止的距离,但它不起作用 - 什么也没有发生:

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);
}

【问题讨论】:

    标签: android widget android-intent alarmmanager android-pendingintent


    【解决方案1】:

    谁能说明我需要形成模仿默认行为的 PendingIntent 的代码?

    我不会,因为 AFAIK 不可能精确地“模仿默认行为”。只需让AlarmManager 警报使用PendingIntent 即可向您在onReceive() 中处理的AppWidgetProvider 发送自定义操作,或者在IntentService 上调用startService()应用小部件。

    我不知道如何获取小部件 ID

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

    每分钟更新一次小部件,显示下一班车的发车时间(这就是我想要的!!)

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

    哦,还有一件事我想知道:如果设备在应该更新小部件时处于睡眠状态,并且由于设备处于睡眠状态而没有发出警报,它会在唤醒时立即更新吗???

    AFAIK,是的,但我没有使用不属于 _WAKEUP 种类的警报。

    【讨论】:

    • 最大的问题是我并没有真正达到“记住”当前小部件 ID 的目的。 onUpdate 获取的 id 数组并不总是完整列表;当添加一个新的小部件时,它甚至会在配置对话框以“OK”按钮或类似的东西正确结束之前用这个新的 ID 调用!为什么???另外,看到小部件被踢出的唯一方法是在onDelete - 但现在它不起作用。提供程序被一遍又一遍地实例化 - 我应该使用首选项来存储已知的小部件 id 吗??
    • @Zordid:然后在AppWidgetManager 上致电getAppWidgetIds()。如果您不知道什么 ID 与什么配置一起使用,那将无济于事。就我个人而言,我还没有编写一个应用程序小部件,它对多个实例有任何意义,所以我决定只更新具有相同内容的所有实例。
    • 啊啊啊! getAppWidgetIds()!!很酷,没有任何例子可以证明任何地方!你怎么知道?? :-)
    • @Zordid:因为我在回答另一个 SO 问题时遇到了它。同样,恕我直言,这并不是特别有用——如果您要使用相同的内容更新所有应用小部件,则无论如何都不需要 ID。如果你不打算用相同的内容更新它们,你需要通过其他方式知道 ID,所以你有每个 ID 的配置数据。但是,如果它为您解决了一些问题,请尽情享受!
    • 不,内容不一样——每个小部件可以显示不同车站的出发时间。但是由于最大更新间隔是每分钟一次,我也可以更新所有这些......
    【解决方案2】:

    不知道他们是否还能帮助你,但我前几天写了一些关于 Android Widget 的帖子。

    这是关于 AlarmManager 的:

    http://malubu.wordpress.com/2012/06/05/take-your-time-widgets-and-alarmmanager/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多