setAlarmClock BroadcastReceiver иногда не достигает onResume
Я создал приложение-будильник с помощью setAlarmClock. У некоторых людей будильник не запускается должным образом. Я знаю, что вы должны отключить все виды режимов энергосбережения на устройствах, иначе сигнал тревоги может не сработать. Но у меня есть несколько редких случаев, когда будильник запускается вовремя, но у него есть временные промежутки, пока он не завершит все шаги onCreate и onPostCreate моей активности.
Это может быть связано с тем, что у меня очень поздно активируется wakelock. Когда Broadcastreceiver вызывается с тревожным событием, он запускает мое основное действие. Действие запускает поток, который должен выполняться хотя бы один раз. Он проверяет, должна ли сработать сигнализация. Если да, то он создает wakelock, чтобы устройство не спало.
Я мог бы попытаться создать wakelock ealier, но я видел файлы журнала, в которых onResume даже не вызывался, только onStart. Между onStart и onResume разница в 5 минут. Так что шансов сделать это достаточно рано.
Что-то не так с моей концепцией будильника и пробуждения? Возможно ли / разумно запустить 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 ответ
Вы пытаетесь начать действие с приемника в onReceive
метод, что проблематично, если ваше приложение работает в фоновом режиме.
Прочтите следующую документацию по этому вопросу:
https://developer.android.com/guide/components/activities/background-starts
Вы должны представить уведомление для пользователя и открыть действие по действию пользователя.