#android #react-native #android-doze
#Android #react-native #android-doze
Вопрос:
Я хочу, чтобы мой react-native безголовый JS, работающий в фоновом режиме, выполнял задание каждые 30 секунд. При совпадении критериев я хочу, чтобы на моем телефоне Android появлялось уведомление. Все работает идеально до того, как телефон переходит в режим ожидания. Заданию alarm удается своевременно запускать уведомление, подобное тому, что я настроил в своем диспетчере сигналов тревоги.
Только после того, как телефон заснет, ему удается отображать уведомления, когда только экран телефона активируется. Это действительно работает, но не так, как я ожидал. Пробуждение экрана происходит примерно каждые 4-5 минут один раз, и это не каждые 30 секунд. Я даже попытался добавить еще одно задание будильника (2 задания расписания будильников), и это все равно не сработает. Моя цель — чтобы мой телефон, по крайней мере, показывал тусклый дисплей при срабатывании onReceive (). Что я пропустил? Или что я должен делать?
public class AlarmHelper {
private static final int PI_SELF_SCHEDULED_ALARM = 1000;
private static final int PI_REPEATING_ALARM = 1001;
private final Context context;
private AlarmManager alarmManager;
public AlarmHelper(Context context) {
this.context = context;
alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
}
public void setNextSelfSchedulingAlarm() {
final long fourtySecondsFromNow = System.currentTimeMillis() SECONDS.toMillis(30);
Intent exactIntent = new Intent(context, AlarmBroadcastReceiver.class).setAction(SELF_SCHEDULING_ALARM);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, PI_SELF_SCHEDULED_ALARM, exactIntent, FLAG_UPDATE_CURRENT);
if (SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(RTC_WAKEUP, fourtySecondsFromNow, pendingIntent);
} else if (SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(RTC_WAKEUP, fourtySecondsFromNow, pendingIntent);
} else {
alarmManager.set(RTC_WAKEUP, fourtySecondsFromNow, pendingIntent);
}
}
public void startRepeatingAlarm() {
final int repeatingIntervalInSeconds = 30;
final long tenSecondsFromNow = System.currentTimeMillis() SECONDS.toMillis(30);
Intent repeatingIntent = new Intent(context, AlarmBroadcastReceiver.class).setAction(REPEATING_ALARM);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, PI_REPEATING_ALARM, repeatingIntent, FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(RTC_WAKEUP, tenSecondsFromNow, SECONDS.toMillis(repeatingIntervalInSeconds), pendingIntent);
}
}
amp;
public class AlarmBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "AlarmReceiver";
@Override
public void onReceive(Context context, Intent intent) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock screenWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "ScreenLock tag from AlarmListener");
try {
screenWakeLock.acquire();
Hawk.init(context).build();
String action = intent.getAction();
if (action == null) {
screenWakeLock.release();
return;
}
if (REPEATING_ALARM.equals(action)) {
} else if (SELF_SCHEDULING_ALARM.equals(action)) {
AlarmHelper alarmHelper = new AlarmHelper(context);
alarmHelper.setNextSelfSchedulingAlarm();
}
Intent intentService = new Intent(context, HeadlessTaskService.class);
context.startService(intentService);
} finally {
screenWakeLock.release();
}
}
}