сигнал тревоги для RTC_WAKEUP и BroadcastReceiver для перехвата режима ожидания - PullRequest
2 голосов
/ 02 апреля 2019

Я хочу, чтобы мой безрежимный JS, работающий в фоновом режиме, выполнял работу каждые 30 секунд. Когда есть соответствие критерия, я хочу уведомления уведомления на моем телефоне Android. Все отлично работает, пока телефон не задремал. Задание по тревоге успевает вовремя активировать уведомление, как я настроил в диспетчере аварий.

Нет, пока телефон не дремлет, после чего ему удастся отобразить уведомления, когда только телефон пробудит экран. Это действительно работает, но не по моим ожиданиям. Пробуждение по экрану происходит один раз примерно каждые 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);
    }
}

&

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();
        }
    }
}
...