Quindi ho un BroadcastReceiver e AlarmManager.AlarmManager non esegue sempre BroadcastReceiver
Diciamo che creo le Intenti in sospeso in questo modo:
Intent i;
i = new Intent(context, MyReceiver.class);
i.setAction(MyReceiver.ACTION_1);
i.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
pendingIntent1 = PendingIntent.getBroadcast(context, 1, i, PendingIntent.FLAG_UPDATE_CURRENT);
i = new Intent(context, MyReceiver.class);
i.setAction(MyReceiver.ACTION_2);
i.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
pendingIntent2 = PendingIntent.getBroadcast(context, 2, i, PendingIntent.FLAG_UPDATE_CURRENT);
e programmare gli allarmi in questo modo:
now = SystemClock.elapsedRealtime();
long time1 = now + 10 * 1000;
long time2 = time1 + 60 * 1000;
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, time1, pendingIntent1);
am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, time2, pendingIntent2);
ora sto sperimentando che il mio ricevitore trasmissione ottiene la trasmissione per ACTION_1
abbastanza affidabile , mentre ACTION_2
spesso non viene consegnato. Quindi, onReceive
viene eseguito raramente o mai con un intento che mantiene l'azione ACTION_2
. Come mai? Ho pensato, *_WAKEUP
si assicura che le trasmissioni vengano consegnate comunque?
[Aggiornamento 15/09/2015] - Per scopi di test, sto tentando di stampare un messaggio di registro nel mio metodo onReceive
. Continua a non funzionare. - Ho provato a utilizzare setExact su AlarmManager ora. Continua a non funzionare. - Ho anche provato a usare WakefulBroadcastReceiver
. Continua a non funzionare. - Ho scoperto, tuttavia, che il dispositivo si attiva in modo affidabile quando è in stato di carica della batteria. Cosa potrebbe causare questo problema? Ho letto ovunque che i ricevitori delle trasmissioni siano garantiti per essere eseguiti se attivati dal gestore degli allarmi tramite un intento in sospeso (e senza fare troppa roba in onReceive
). Ho forse qualche politica aggressiva di risparmio energetico sul mio telefono che non posso davvero lavorare contro (senza acquisire un lungo wake-lock, vedere i commenti)?
[Aggiornamento 09/19/2015] Ho appena provato un'app sveglia (https://play.google.com/store/apps/details?id=com.alarmclock.xtreme.free) su Google Play e non riavvia in modo affidabile il telefono. Immagino, è davvero un bug e non per colpa mia. Mi limiterò alla soluzione wake lock, suppongo.
qual è il valore di 'showAt'? –
Oups mi dispiace, risolto. Doveva essere "time1". L'app è fondamentalmente dedicata alla visualizzazione di una finestra di dialogo (in un'attività trasparente) dopo un po 'di tempo in cui lo schermo si è spento (in questo caso 10 secondi) e lo nasconde di nuovo, se lo schermo era spento troppo a lungo (qui 10 + 60 = 70 secondi). – flxapps
Ho risolto il mio problema acquisendo un wake lock in questo modo: 'wakeLock.acquire (time2 - now + 5000);' (mantenendo il telefono sveglio per - nell'esempio superiore - 70 secondi più 5 secondi come buffer) - Tuttavia, ritengo che questa sia una soluzione piuttosto hacky. Cosa ne pensi? È legittimo o troppo sporco, probabilmente causa problemi? – flxapps