Alarm Manager setRepeating перестает работать через некоторое время

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

    public static void startRepeated(Context context){
        Intent intent=new Intent(context,MyService.class);
        //starting it manually first because API 19+ doesn't deliver exact alarms, but we want a run now
        context.startService(intent);
        intent = new Intent(context,ServiceReceiver.class);
        int minutes=PreferenceManager.getDefaultSharedPreferences(context).getInt("timer",R.integer.timer_def);
        final PendingIntent pendingIntent= PendingIntent.getBroadcast(context.getApplicationContext(),1,intent,PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager alarmManager=(AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(),minutes*60000,pendingIntent);
    }

Метод onreceive получателя (WakefulBroadcastReceiver):

@Override
public void onReceive(Context context, Intent intent) {
    Log.e("SERV-RECEIVER ","triggered");
    startWakefulService(context,new Intent(context,MyService.class));
}

Обратите внимание, что когда это происходит, я не вижу журнал SERV-RECEIVER, поэтому даже приемник не срабатывает. Моя служба намерений открывает базу данных SQLite, выполняет некоторую работу, закрывает ее, а затем освобождает блокировку. Получатель регистрируется в манифесте Android без намерений:

<receiver android:name=".ServiceReceiver" android:enabled="true"/>

Я попытался перевести устройство в режим ожидания, а приложение в режим ожидания вручную с помощью команд adb, и после того, как я разбужу устройство, оно все еще работает нормально. Проблема возникает, только если я оставляю его на некоторое время. Используя аварийный сигнал adb shell dumpsys, я заметил, что это всегда видно (даже после того, как аварийный сигнал

trigerring):
u0a229:com.isoc.android.monitor +2s384ms running, 37 wakeups:
    +2s384ms 37 wakes 37 alarms, last -6m33s804ms:
      *walarm*:com.isoc.android.monitor/.ServiceReceiver

Но это исчезает, когда возникает проблема (из пакетного раздела):

ELAPSED_WAKEUP #0: Alarm{99ac864 tag *walarm*:com.isoc.android.monitor/.ServiceReceiver type 2 when 340221779 com.isoc.android.monitor}
      tag=*walarm*:com.isoc.android.monitor/.ServiceReceiver
      type=2 whenElapsed=-971ms when=-5s971ms
      window=+3m45s0ms repeatInterval=300000 count=0 flags=0x0
      operation=PendingIntent{14dfacd: PendingIntentRecord{82c6f82 com.isoc.android.monitor broadcastIntent}}

Я заметил, что на моем мобильном телефоне Android API 15 этой проблемы не возникает. Только на моем Android-телефоне с зефиром ... Любая помощь будет очень признательна :) Спасибо.


person michaelg9    schedule 30.07.2016    source источник


Ответы (1)


Вот мой класс WakeLocker

  public class WakeLocker {
private static PowerManager.WakeLock wakeLock;

public static void setWakeLock(Context ctx) {
    PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE);

    if (wakeLock != null) wakeLock.release();
    wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "Vocabulary_Alarm");

    wakeLock.acquire();
}

public static void resetWakeLock() {
    if (wakeLock != null) wakeLock.release();
    wakeLock = null;
} }

и в приемнике onReceive

  public class AlarmReceiver extends WakefulBroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {

    WakeLocker.setWakeLock(context);


    Intent intentone = new Intent(context.getApplicationContext(), YourActivity.class);
    intentone.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    intentone.putExtra("startTest",true);
    context.startActivity(intentone);

но здесь, если вы видите, что я запустил требуемую активность, а не службу. Если ваша проблема не решена даже после использования WakeLock, вы тоже попробуйте запустить связанную активность.

person Satya    schedule 30.07.2016
comment
Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат. - person Cody Gray; 27.03.2019