Android AlarmManager setRepeating不会以长间隔重复

时间:2011-09-02 18:37:03

标签: android alarmmanager

我已经实施了AlarmManager,每天唤醒一次手机以执行更新任务,更新小部件并发送通知(如果适用)。

我正在使用setRepeatingELAPSED_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);
}

2 个答案:

答案 0 :(得分:2)

没有什么明显的错误。

在很长一段时间内,我建议使用RTC_WAKEUP,因此您可以安排在半夜或可能在用户可选择的时间进行,而不是每24小时从半随机起点开始。 RTC_WAKEUP可能会给你更好的结果。

此外:

  • onReceive() UpdateAlarmReceiver添加一个日志记录语句,以确认您是否完全控制,或者问题是(喘息!)WakefulIntentService
  • 尝试稳步增加期限。既然你说10分钟的工作,试试一小时,然后四个小时等等,并尝试在发生故障时理解。
  • “我实际上正在使用AutoKiller内存优化器它没有白名单这可能是问题?我的应用程序仍在运行,但根据进程列表。” - 我会禁用所有任务杀手,只是为了确保它们不会干扰。

答案 1 :(得分:1)

您是否尝试过将其设置为不重复。然后当它发射时你会在24小时后设置下一次单发警报?这可以起到重复警报的作用,但可能会避免您遇到的一些问题。