setAlarmClock BroadcastReceiver иногда не достигает onResume - PullRequest
0 голосов
/ 13 апреля 2020

Я создал приложение будильника, используя setAlarmClock. Для некоторых людей сигнал тревоги не запускается должным образом. Я знаю, что вы должны отключить все виды энергосберегающих режимов на устройствах, иначе это может быть из-за того, что будильник не срабатывает. Но у меня есть несколько редких случаев, когда будильник срабатывает вовремя, но у него есть временные промежутки, пока он не завершит все шаги onCreate и onPostCreate моей деятельности.

Это может быть связано с тем, что мой пробуждение активируется очень поздно , Когда Broadcastreceiver вызывается с событием тревоги, он начинает мою основную деятельность. Действие запускает поток, который должен запускаться хотя бы один раз. Он проверяет, должна ли сработать сигнализация. Если да, то он создает wakelock, чтобы держать устройство в активном состоянии.

Я мог бы попытаться создать wakelock более ранним, но я видел файлы журналов, где onResume даже не вызывался, только onStart. Между onStart и onResume существует разрыв в 5 минут. Так что у меня нет шансов сделать это достаточно рано.

Что-то не так с моей концепцией будильника и wakelock? Возможно ли / целесообразно запустить wakelock в BroadcastReceiver и остановить его в Activity?

public class AlarmManagement extends BroadcastReceiver implements Serializable
{
    @Override
    public void onReceive (Context context, Intent intent)
    {
        Intent i = new Intent(context, FullscreenActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        context.startActivity(i);
    }

    public void scheduleSystemAlarmApi21(Context context,long alarmTime, PendingIntent pi) {
        AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent i2=new Intent(context, FullscreenActivity.class);
        PendingIntent pi2=PendingIntent.getActivity(context, 0, i2, 0);
        am.setAlarmClock(new AlarmManager.AlarmClockInfo(alarmTime,pi2),pi);
    }

    public void scheduleSystemAlarm(Context context,int id, long alarmTime) {
        Intent i = new Intent(context, AlarmManagement.class);
        PendingIntent pi = PendingIntent.getBroadcast(context, id, i, 0);

        scheduleSystemAlarmApi21(context,alarmTime,pi);
    }
}

public class FullscreenActivity extends AppCompatActivity {
    Thread thread;

    @Override
    protected void onResume() {
        super.onResume();
        if (threadStopped)
            alarmServiceThread();
    }

    void alarmServiceThread() {
        thread = new Thread() {
            @Override
            public void run() {
            ...
                if (needToStartWakeup(currentTime))
                     startWakeup();
            ...
            }
        }
        thread.start(); 
    }

    PowerManager powerManager;
    PowerManager.WakeLock wake;

    public void startWakeup() {
        powerManager = ((PowerManager) getSystemService(Context.POWER_SERVICE));
        int levelAndFlags=PowerManager.ACQUIRE_CAUSES_WAKEUP;
        levelAndFlags |= PowerManager.SCREEN_BRIGHT_WAKE_LOCK;
        wake = powerManager.newWakeLock( levelAndFlags , WAKE_LOCK_TAG);
        wake.acquire();
    }   
}

1 Ответ

0 голосов
/ 13 апреля 2020

Вы пытаетесь запустить действие с получателя в методе onReceive, что проблематично c, если ваше приложение работает в фоновом режиме.

Пожалуйста, прочитайте следующую документацию по теме:
https://developer.android.com/guide/components/activities/background-starts

Вы должны представить уведомление для пользователя и открыть действие на действие пользователя.

...