7


Voglio eseguire il servizio di allarme per ogni secondo nella mia applicazione. Funziona bene sotto la versione 5.1. ma non si avvia in dispositivi 5.1. Sto usando il servizio di intenti di commonsware. Il messaggio di logcat sta dicendo che "Sospetto breve intervallo di 1000 millis, espansione a 60 secondi". Come posso eseguire il polling per ogni secondo in 5.1? Qualcuno mi può suggerire come ottenere questo risultato?allarme di programmazione per ogni secondo in Android 5.1

Spiegazione po 'di più:

mio caso d'uso è che ho bisogno di fare qualche operazione per ogni intervallo di 30 minuti. AFAIK Per questo L'uso di Alarm Manager è efficiente, ma qui

1) Devo visualizzare il timer per il conto alla rovescia per l'utente. (Attività timer, conto alla rovescia, ScheduledExecutorService è piuttosto utile per questo)
2) Devo avvisare l'utente per ogni 30 minuti (tramite notifica) anche se l'app è in background. (Il servizio di allarme è sufficiente per questo)

ma qui il mio problema è quando l'app è in background, quando si fa scorrere l'applicazione da recents (cioè, il processo di applicazione viene ucciso) nessuno dei servizi o timer, gestori, servizi di executor non funzionerà). In questo caso, come posso avvisare l'utente dopo il completamento di 30 minuti. Per favore guidami se sto pensando in modo sbagliato.

Grazie,
Chaitanya

+0

utilizzare TimerTask è progettato per tale necessità. – Techfist

+0

Controlla la mia risposta aggiornata –

+0

Cosa c'è di sbagliato nella mia domanda? Posso sapere il motivo alla base del downvote? – Chaitu

risposta

0

io non esattamente capire il vostro caso d'uso, ma l'impostazione di allarme per ogni secondo è eccessivo. È possibile utilizzare Timer. Dai un'occhiata a questo corso.

6

Questo è un comportamento normale in Android Lollipop.

Intervallo sospettosamente breve 1000 millis; espansione a 60 secondi

Indica che al sistema non piacciono più quei brevi intervalli di tempo.

Problema #161244 documentato che:

Questo sta funzionando come previsto, anche se è attualmente documentato adeguatamente (e siamo consapevoli di questo lato del problema).

Parlare in modo molto generale: gli allarmi di breve durata e prossimo futuro sono sorprendentemente costosi in batteria; le app che richiedono un lavoro a breve o quasi futuro dovrebbero utilizzare altri meccanismi per pianificare la propria attività.

Quindi non utilizzare uno AlarmService per questo. Preferire un filo o Executors o TimerTask o qualcosa d'altro:

// Using Handler 
new Handler().postDelayed(runnable, TimeUnit.SECONDS.toMillis(1)); 

// Using Executors 
Executors.newSingleThreadScheduledExecutor().schedule(runnable, 1, TimeUnit.SECONDS); 
+3

Cosa fare se l'attività deve essere eseguita anche se il dispositivo è addormentato o l'applicazione non è in esecuzione? –

+0

Non è possibile impostare un servizio che attiva un allarme ogni secondo, punto (per motivi esposti sopra). Vedere le alternative sopra o il riferimento ufficiale: https://developer.android.com/training/scheduling/alarms.html#set o semplicemente utilizzare un intervallo più lungo. – shkschneider

+0

Non parlo ogni secondo, mi dispiace. Sto parlando di un periodo di tempo inferiore a 1 minuto (ad esempio 25 secondi), come sembra implicare il messaggio di registro. PostDelayed ed Executor funzionano anche se il dispositivo è inattivo o l'applicazione non è più in esecuzione? –

0

Questa è una segnalato issue per Android 5.1 che accade ogni volta che si tenta di impostare una sveglia per un intervallo di meno di 60000 millisecondi.

Questo avviso si verifica perché l'impostazione di un intervallo molto basso come questo scaricherà la batteria molto velocemente.

membro del progetto sulla piattaforma, ha dichiarato:

parlando molto in generale: di breve periodo e gli allarmi vicino-futuri sono sorprendentemente costosi in batteria; le app che richiedono un lavoro a breve termine o nel prossimo futuro dovrebbero utilizzare altri meccanismi per pianificare l'attività .

Ecco perché non è consigliabile utilizzare Alarm nel tuo caso.

Secondo l'aggiornamento della domanda. Desiderate mantenere il vostro servizio in background Sveglio anche se l'utente lo ha fatto scorrere manualmente dall'elenco delle app recenti. Questo può essere fatto semplicemente usando il flag START_STICKY come il seguente. Aggiungere questo codice al vostro servizio onStartCommand metodo:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
Log.i("LocalService", "Received start id " + startId + ": " + intent); 
// We want this service to continue running until it is explicitly 
// stopped, so return sticky. 
return START_STICKY; 
} 

Fonte: answer

+0

Sto usando 'START_STICKY', ma quando chiudo l'app il mio servizio è comunque abile. Penso che questa non sia una soluzione affidabile. – szx

3

Perché l'hai fatto?
utilizzare un gestore invece:

Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     // do your stuff here, called every second 
     mHandler.postDelayed(this, 1000); 
    } 
}; 

// start it with: 
mHandler.post(runnable); 

e utilizzare il seguente per arrestare il timer 1 sec:

mHandler.removeCallbacks(runnable); 
+0

Hey @ lazy-ninja Puoi controllare la mia domanda aggiornata. e suggeriscimi – Chaitu

1

Usa sia 1 e 2:

  • Utilizzare il AlarmManager per il ruolo di avvisare l'utente ogni 30 minuti

  • Se l'attività in cui è necessario mostrare gli aggiornamenti è in primo piano, poi fare anche qualcosa di economico, come postDelayed(), per dare all'utente aggiornamenti periodici in quell'attività

+0

Grazie per il tuo suggerimento. Ho fatto lo stesso funziona perfettamente come mi aspettavo. – Chaitu

+0

chaitu vorresti per favore aiutarmi cosa hai fatto? –

0

prova questi passaggi.

  1. Utilizzare un periodico Alarmmaager dopo 1 min
  2. All'interno che il manager di allarme utilizzare un gestore che chiamano dopo alcuni secondi ed eseguire il vostro compito.

Ricordati

sua non è una buona idea, come il direttore di allarme non è a conoscenza della situazione attuale del dispositivo, ad esempio, non considera se il dispositivo è collegato a una presa di corrente, inattivo o connesso a una rete Anche il gestore degli allarmi spreca risorse perché non gli interessa quando il dispositivo ha più risorse disponibili.

-2

Ho modificato con successo l'intervallo minimo di AlarmManager da 1 minuto a 30 secondi.

Sul dispositivo copiare /system/framework/services.jar sul computer. Estrai classes.dex da esso, apri con Winrar per esempio.

 

Scarica baksmali

java-jar baksmali.jar -o ExtractFolder classes.dex

modificare ExtractFolder \ com \ \ server Android \ AlarmManagerService $ Constants.smali

Sostituire tutti i valori 0xea60 (60000ms/1min in hex) a molti ms si desidera che l'intervallo minimo sia l'esempio 30seconds 0x7530

Salva e Smali torna a classes.dex

java-jar -Xmx512M smali.jar ExtractFolder -o classes.dex

aperto services.jar nuovo in Winrar, eliminare classes.dex e trascinare le classi di nuova creazione .dex in services.jar.

Copia torna a /system/framework/services.jar

dispositivo Riavvia.

Anche sul mio dispositivo Samsung, la parola allarme o avviso (non testato) nel nome del pacchetto lo aggiunge a una lista bianca. I miei allarmi sono sparati esattamente quando lo faccio.