首页 文章

使用AlarmManager手动更新小部件

提问于
浏览
4

如Android Dev Guide中所述,如果您希望窗口小部件更频繁地更新,则应使用 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);
}

2 回答

  • 1

    有人可以说出我需要的代码来形成模仿默认行为的PendingIntent吗?

    我不会,因为AFAIK确实不可能"mimic the default behavior" . 只需让 AlarmManager 警报使用 PendingIntent 即可向您在 onReceive() 中处理的 AppWidgetProvider 发送自定义操作,或者在您正在使用的 IntentService 上调用 startService() 用于应用小部件后面的真实智能 .

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

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

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

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

    哦,另外我想知道的是:如果设备在睡眠时应该更新并且由于睡眠设备而没有发出警报时睡眠,那么当它醒来时它会立即更新吗?

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

  • 0

    不知道他们是否仍然可以帮助你,但我几天前写了一些关于Android Widget的帖子 .

    这是关于AlarmManager的一个:

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

相关问题