Диспетчер тревог не стреляет на экране выключен

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

Я пробовал много разных решений (в Манифесте экспорта: ложь или процесс:": удаленный") о похожей проблеме, но проблема не решена. Мне нужно помочь Я надеюсь, что кто-то решил эту проблему раньше.

Для установленного менеджера тревог

    AlarmManager alarmManager = (AlarmManager)             
    context.getSystemService(Context.ALARM_SERVICE);

    Intent intent = new Intent(context, TimeService.class);
    intent.setAction(SETUP_TIMER_FOR_NOTIFICATION);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 112, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    long now = System.currentTimeMillis();
    long minute = 1000 * 60;

    alarmManager.cancel(pendingIntent);
    alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() , minute, pendingIntent);

Мой приемник

public class TimeService extends WakefulBroadcastReceiver {

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



Log.i("TimeService", "onReceive");

 Intent timeIntent = new Intent(context, NotificationService.class);
        timeIntent.setAction(SETUP_TIMER_FOR_NOTIFICATION);

        startWakefulService(context, timeIntent);


   }
}

manifest.xml

<receiver
            android:name="service.TimeService"
            android:enabled="true"
            android:exported="false"
            >

            <intent-filter>
                <action android:name="alarm_timer_for_notification" />
            </intent-filter>
        </receiver>

2 ответа

setAndAllowWhileIdle это работает, когда экран выключен и телефон находится в режиме ожидания

В зефире вводят режим дозирования для экономии заряда батареи. Таким образом, сигнал тревоги не срабатывает правильно в режиме повтора.

Поэтому мы используем https://developer.android.com/reference/android/app/AlarmManager.html

От зефира и выше, будильник включается только с 10-минутным интервалом,setAndAllowWhileIdle также запускает службу или уведомление 10 минут один раз, когда телефон находится в режиме ожидания (экран выключен).

В нормальном режиме интервал времени работает нормально (я проверил интервал в 3 минуты)

public class TimeService extends WakefulBroadcastReceiver {

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

    Log.i("TimeService", "onReceive");

    Intent timeIntent = new Intent(context, NotificationService.class);
    timeIntent.setAction(SETUP_TIMER_FOR_NOTIFICATION);

    startWakefulService(context, timeIntent);

    setAlarm(context);
}

public void setAlarm(Context context)
{
    Timber.v(TAG +"set Alarm");
    PreferencesHelper preferencesHelper =new PreferencesHelper(context);
    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, TimeService.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
    int intervalInMinutes = preferencesHelper.getInt(context.getResources().getString(R.string.sha_loc_intervals), 1)* 60000;
      if (android.os.Build.VERSION.SDK_INT >= 23) {
        alarmManager.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime()+intervalInMinutes , pendingIntent);
    } else if (android.os.Build.VERSION.SDK_INT >= 19
            && android.os.Build.VERSION.SDK_INT < 23) {
        alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+intervalInMinutes , pendingIntent);
    } else {
        alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+intervalInMinutes , pendingIntent);
    }
}

public void cancelAlarm(Context context)
{
    Timber.v(TAG +"cancel Alarm");
    Intent intent = new Intent(context, TimeService.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
    AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(pendingIntent);
}}

<receiver android:name=".TimeService"
              android:enabled="true"
              android:exported="true"
              android:process=":remote">
</receiver>

В MainActivity.class

TimeService timeService = new TimeService ();

timeService.setAlarm (MainActivity.this);

Вы хотите получить разрешение в файле манифеста.

использует разрешение android: name = "android.permission.WAKE_LOCK"

WakeLock - это механизм, позволяющий держать устройство включенным