Диспетчер тревог не стреляет на экране выключен
Я установил диспетчер будильника для контроля времени. Моя цель - продолжать контролировать время на выключенном экране. Пока экран включен, все в порядке, но когда я заблокирован на устройстве (экран), мой вещательный приемник не получает ничего
Я пробовал много разных решений (в Манифесте экспорта: ложь или процесс:": удаленный") о похожей проблеме, но проблема не решена. Мне нужно помочь Я надеюсь, что кто-то решил эту проблему раньше.
Для установленного менеджера тревог
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 - это механизм, позволяющий держать устройство включенным