2015-03-28 10 views
9

Sto tentando di mantenere il servizio in esecuzione ininterrottamente finché l'utente chiude l'app.Arresta il servizio quando l'app viene chiusa

Sto usando il metodo startService() dal metodo onCreate() della mia attività principale e stopService() nel metodo onDestroy().

Ora ho un problema, perché sembra che la mia attività principale muoia e venga ricreata quando ruoto il dispositivo o quando spengo lo schermo.

Come posso interrompere il servizio solo quando l'utente interrompe l'app manualmente?

+0

Gli utenti non chiudono realmente le app su Android. Cosa intendi per "user close app"? – CommonsWare

+0

Intendo chiusura app intenzionale. Dopo che l'utente ha fatto scorrere l'app nella schermata "App recenti". – Kamil

risposta

-11

Inizia aggiungendo il nodo android: configChanges al nodo manifest di Activity per interrompere l'attività di riavvio quando il dispositivo ruota.

Ora per rilevare un evento di chiusura, pensa ai modi in cui l'utente può chiudere l'app manualmente. In Android, premendo un pulsante Indietro o il tasto Home. Quindi metti un listener di chiavi di evento per il pulsante home & e termina il servizio.

10

Intendo app intenzionale chiudi. Dopo che l'utente ha fatto scorrere l'app nella schermata "App recenti".

Questo non è "chiudere l'app", in termini di Android. Questo è "rimuovere l'attività" (o talvolta "fermare l'attività" - Google non è molto coerente sulla terminologia).

Il servizio deve essere chiamato with onTaskRemoved() quando l'attività viene rimossa. Tuttavia, questo dovrebbe essere sia quando l'utente rimuove manualmente l'attività tramite la schermata panoramica (a.k.a., elenco delle attività recenti), sia quando l'attività va via naturalmente su Android 4.4 e sotto perché l'attività è troppo vecchia.

+1

Questa inconsistenza terminologica in Android mi fa impazzire ...:/ – Kamil

42

impostare l'attributo di seguito nel tag di servizio nel file manifesto,

<service android:name="service" android:stopWithTask="true"/> 

aggiungendo questo chiamerà il ondestroy() del servizio quando il compito viene rimosso (app chiuso dal recente elenco di app).

+1

Nel mio caso, non ha funzionato perché stavo avviando il servizio usando AlarmManager. Ma sembra che sia la risposta corretta per il caso di servizi aperti all'interno dell'attività, ad esempio. – mizerablebr

+0

Grazie! Tu salvi la mia giornata! –

Problemi correlati