如Android Dev Guide中所述,如果您希望窗口小部件更频繁地更新,则应使用 AlarmManager
设置不会唤醒设备的警报 .
原则上:不要使用 AppWidgetProvider
类提供的标准机制,并且在xml文件中使用android:updatePeriodMillis轻松设置 .
我很遗憾地问,但是指南只是声明“使用AlarmManager,使用 RTC
或 ELAPSED_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 回答
我不会,因为AFAIK确实不可能"mimic the default behavior" . 只需让
AlarmManager
警报使用PendingIntent
即可向您在onReceive()
中处理的AppWidgetProvider
发送自定义操作,或者在您正在使用的IntentService
上调用startService()
用于应用小部件后面的真实智能 .您从实际的
onUpdate()
调用中保存了窗口小部件ID,例如当应用程序窗口小部件首次放在屏幕上时 . 当闹钟响起时,请更新所有应用小部件 .请允许这是用户可配置的 .
AFAIK,是的,但我没有使用不属于
_WAKEUP
种类的警报 .不知道他们是否仍然可以帮助你,但我几天前写了一些关于Android Widget的帖子 .
这是关于AlarmManager的一个:
http://malubu.wordpress.com/2012/06/05/take-your-time-widgets-and-alarmmanager/