4

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

2 回答 2

2

任何人都可以说明我需要形成模仿默认行为的 PendingIntent 的代码吗?

我不会,因为 AFAIK 不可能精确地“模仿默认行为”。只需让AlarmManager警报使用一个向您处理PendingIntent的自定义操作发送一个自定义操作,或者调用您正在使用的应用程序小部件背后的真正智能。AppWidgetProvideronReceive()startService()IntentService

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

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

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

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

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

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

于 2011-02-13T15:32:30.293 回答
0

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

这是关于 AlarmManager 的:

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

于 2012-06-20T22:35:47.937 回答