我正在为Android开发动态壁纸。要在设定的时间刷新壁纸,我使用AlarmManager。大部分时间这都很好,但偶尔我的警报没有收到。最重要的是,我不能复制这种行为,它只是随机发生。我使用至少3个ROM遇到了这个问题。
现在代码。
我使用PendingIntent:
mRefreshIntent = new Intent()
.setComponent(new ComponentName(mContext, RefreshBroadcastReceiver.class))
.setAction("my.package.name.REFRESH_WALLPAPER");
mPendingRefreshIntent = PendingIntent.getBroadcast(
mContext,
0,
mRefreshIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
这是我设置闹钟的代码:
mAlarmManager.set(AlarmManager.RTC_WAKEUP, time, mPendingRefreshIntent);
其中time是UTC时间,以毫秒为单位。我经常使用adb shell dumpsys alarm
验证警报是否按预期设置。
接收方:
public class RefreshBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("DayNight", "onReceive ; " + System.currentTimeMillis());
DayNightService.refresher.refresh();
Log.d("DayNight", "onReceive done; " + System.currentTimeMillis());
}
}
关联的清单行:
<application>
...
<receiver
android:name="RefreshBroadcastReceiver">
<intent-filter>
<action android:name="my.package.name.REFRESH_WALLPAPER" />
</intent-filter>
</receiver>
...
</application>
未触发的警报始终存在于队列(dumpsys警报)中,之后不在警报日志中。似乎他们在T减零时“丢失”。
如果你们中的一个能为我解决这个问题,我将非常高兴。
答案 0 :(得分:2)
我使用以下代码:
Intent intent = new Intent(ACTION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE);
Log.d(LOG_TAG, "pending intent: " + pendingIntent);
// if no intent there, schedule it ASAP
if (pendingIntent == null) {
pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
// schedule new alarm in 15 minutes
alarmService.setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis(),300000, pendingIntent);
Log.d(LOG_TAG, "scheduled intent: " + pendingIntent);
}
请注意,我要求不准确的重复闹钟和RTC(不是RTC_WAKEUP) - 如果手机在牛仔裤口袋深处睡觉,用户对您的动态壁纸更改不感兴趣 - 无需浪费电池汁和唤醒手机
您可能还需要注册启动完成广播接收器以开始更新计划 重启。