AlarmManager иногда не срабатывает - PullRequest
2 голосов
/ 09 декабря 2011

Я разрабатываю живые обои для Android.Для обновления обоев в установленное время я использую AlarmManager.В большинстве случаев это прекрасно работает, но иногда мой сигнал тревоги не получен.Кроме того, я не могу воспроизвести это поведение, это происходит случайно.Я столкнулся с этим, используя как минимум 3 ПЗУ.

Теперь для кода.
Я использую это 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);

где время - время 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) заранее, а впоследствии не заносятся в журнал аварийных сигналов.Похоже, они «теряются» при Т минус ноль.

Я буду очень рад, если один из вас сможет решить эту проблему для меня.

1 Ответ

2 голосов
/ 09 декабря 2011

Я использую следующий код:

  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) - если телефон спит глубоко в джинсовом кармане, пользователь не заинтересован в изменениях вашей жизниобои - не нужно тратить заряд батареи и разбудить телефон

Вам также может понадобиться зарегистрировать загрузочный приемник полного вещания, чтобы начать планирование обновлений при перезагрузке.

...