我已经实施了AlarmManager,每天唤醒一次手机以执行更新任务,更新小部件并发送通知(如果适用)。
我正在使用setRepeating
和ELAPSED_REALTIME_WAKEUP
第一次触发警报(SystemClock.elapsedRealtime()+60000
)
但它不会在86400000
毫秒(24小时)之后被触发。
真的很挣扎,我很高兴接受我做错了什么,或者是否有更好的方法来实现我想做的事情。但是我认为我的代码看起来像人们似乎做的标准事情。
这几乎就像重复警报在所有情况下都没有做到它应该做的事情。如果我将间隔减少到10分钟它确实有效,我的警报就会触发,服务会一遍又一遍地运行。
我的应用程序的性质意味着每天更新超过一次是过度的。 我需要找到一个现实可靠的解决方案。
感谢您的时间和希望你能指出我正确的方向。
这是我的警报实施代码......
清单:
<receiver android:name=".SystemChangeReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE" />
</intent-filter>
</receiver>
<receiver android:name=".UpdateAlarmReceiver" />
<service android:name=".UpdateService" />
<receiver android:name=".WidgetProviderSmall" android:label="@string/widget_small_label">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/appwidget_small" />
</receiver>
<receiver android:name=".WidgetProviderLarge" android:label="@string/widget_large_label">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/appwidget_large" />
</receiver>
SystemChangeReceiver
侦听引导广播,检查是否需要设置警报,如果需要,则设置警报。
SystemChangeReceiver
:
@Override
public void onReceive(Context context, Intent intent) {
SharedPreferences prefs = context.getSharedPreferences(context.getString(R.string.prefs_name), 0);
Boolean notifications = prefs.getBoolean("enable_updates", false);
if(notifications == true) {
Utils.setNotificationAlarm(context);
}
}
setNotificationAlarm方法设置重复警报...
public static void setNotificationAlarm(Context context) {
AlarmManager alarmManager=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, UpdateAlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
alarmManager.setRepeating(
AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime()+60000,
86400000,
pi);
}
当警报触发我的接收器UpdateAlarmReceiver
决定做什么并使用WakefulIntentService
运行我的后台更新过程时,服务的处理程序然后更新小部件并根据需要发送通知
UpdateAlarmReceiver
:
public void onReceive(Context context, Intent intent) {
WakefulIntentService.sendWakefulWork(context, UpdateService.class);
}
答案 0 :(得分:2)
没有什么明显的错误。
在很长一段时间内,我建议使用RTC_WAKEUP
,因此您可以安排在半夜或可能在用户可选择的时间进行,而不是每24小时从半随机起点开始。 RTC_WAKEUP
可能会给你更好的结果。
此外:
onReceive()
UpdateAlarmReceiver
添加一个日志记录语句,以确认您是否完全控制,或者问题是(喘息!)WakefulIntentService
。答案 1 :(得分:1)
您是否尝试过将其设置为不重复。然后当它发射时你会在24小时后设置下一次单发警报?这可以起到重复警报的作用,但可能会避免您遇到的一些问题。