使用AlarmManager手动更新小部件

时间:2011-02-13 14:29:12

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

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

2 个答案:

答案 0 :(得分:1)

  

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

我不会,因为AFAIK不可能精确地“模仿默认行为”。只需让AlarmManager闹钟使用PendingIntent即可向您AppWidgetProvider中处理的onReceive()发送自定义操作,或者startService()上的IntentService 1}}您正在使用app小部件背后的真实智能。

  

我不知道如何获取小工具ID

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

  

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

请允许用户配置。

  

哦,另外我想知道的是:如果设备在应该更新小部件时处于睡眠状态并且由于睡眠设备而没有发出警报,它会在醒来时立即更新吗?< / p>

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

答案 1 :(得分:0)

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

以下是有关AlarmManager的内容:

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