2010-06-15 11 views
14

Ho un servizio in esecuzione nello stesso processo della mia Applicazione.Servizio Android ucciso

A volte il sistema operativo Android decide di interrompere il servizio (probabilmente a causa della memoria insufficiente).

La mia domanda è: la mia applicazione viene uccisa insieme al servizio? o come funziona esattamente?

Grazie!

risposta

35

Prima assicuratevi di leggere: http://developer.android.com/guide/components/processes-and-threads.html#Lifecycle

La chiave di questo è che su Android un processo è solo un contenitore per il codice - - o in particolare uno o più componenti (attività, servizi, destinatari, fornitori). Di default tutti i componenti in un .apk hanno il loro processo dedicato, in cui tutti corrono insieme. Questo è quasi sempre quello che vuoi.

Quando l'utente interagisce direttamente con un componente di tale processo (ovvero un'attività), Android tenterà molto duramente di mantenere attivo quel processo e non lo vedrà ucciso, salvo circostanze eccezionali.

Quando l'utente non interagisce più direttamente con il processo, diventa quindi spendibile rispetto ad altri processi come descritto nella documentazione di riferimento. Cioè, i processi vuoti (senza componenti interessanti) verranno uccisi prima dei processi contenenti attività che l'utente stava usando, che verrà ucciso prima dei processi con i servizi in esecuzione. Quindi avere un servizio in corso tenderà a mantenere il processo a spese di altri processi.

Allo stesso tempo, dobbiamo gestire bene un numero sempre maggiore di applicazioni che lasciano i servizi in esecuzione, spesso indefinitamente, e spesso con perdite di memoria. Quindi un servizio funziona per un tempo sempre più lungo, Android cercherà sempre meno di mantenere il processo in corso. In pratica, questo significa spostarlo nel secchio dello sfondo fino a quando il fuori killer di memoria lo toglie. Successivamente, se il servizio vuole ancora essere eseguito, verrà creato un nuovo processo per il riavvio.

Il risultato è che per i normali servizi che sono in esecuzione da molto tempo, è previsto un comportamento che il loro processo verrà ucciso dopo un po '.Questo non ha bisogno di fermare il servizio; un servizio che vuole continuare a funzionare lo farà, dovrà solo essere istanziato in un nuovo processo.

Ovviamente finché l'utente interagisce con un'attività nel processo, il processo non verrà interrotto, poiché questo lo porterà alla categoria in primo piano indipendentemente da ciò che sta accadendo con qualsiasi servizio in esso contenuto.

+0

grazie per la tua utile risposta! quindi per essere un po 'più specifico: I sottoclasse da Applicazione e in esso tengo un riferimento al mio oggetto di servizio. Quando il mio servizio viene ucciso, come posso ottenere un riferimento a quello nuovo? o anche il mio oggetto Application muore e quando viene riattivato è tutto uguale a quando avvio l'app per la prima volta? – Erdal

+2

Quando si uccide qualcosa per la memoria, l'intero processo (incluso l'oggetto dell'applicazione) viene ucciso e in questo punto non viene eseguito alcun codice. Se il servizio è appena stato distrutto perché non ha più bisogno di essere eseguito, verrà chiamato onDestroy() e quando il servizio sarà necessario verrà creata una nuova istanza e chiamato onCreate(). Personalmente in genere raccomando di non usare Application; in realtà non ti dà nulla solo usando le classi statiche di singleton, e penso che crei aspettative per le persone (visto che esiste un modello di applicazione più tradizionale) che non reggono. – hackbod

+0

Capisco cosa intendi. L'unico problema che ho avuto, costringendomi a usare la classe Application era che non volevo collegarmi al Servizio da tutte le mie diverse attività. Io chiamo solo bind durante il metodo onCreate della mia Applicazione e tutte le altre attività accedono al Servizio tramite il mio singleton dell'applicazione. Consiglieresti qualcosa di meglio? – Erdal

3

I processi vengono uccisi dal killer di memoria basso, non Applicazioni. Quindi, a meno che non si lavori di più per far funzionare il servizio in un processo diverso, le attività vengono eliminate insieme al servizio.

Il killer di memoria basso non tenta di distruggere alcun oggetto nel processo, sebbene il gestore attività possa chiamare suDestroy su oggetti Attività che non sono più necessari. Ma ciò accade come parte del normale ciclo di vita delle attività, non a causa delle basse condizioni di memoria.

(A proposito, io sono chiaro se si intende "applicazione" in generale, o il vostro oggetto che si estende Application, o se vuoi dire le vostre attività che mostrano l'interfaccia utente.)

+0

per applicazione Intendo il mio oggetto che si estende dall'applicazione – Erdal

1

Un'applicazione è qualcosa che ha un'interfaccia utente e se hai incluso un servizio insieme a esso, sicuramente verrà ucciso poiché le applicazioni vengono terminate quando la coda dell'applicazione cache diventa piena

quindi creare Servizio separato dall'applicazione o in altre parole creare un altro progetto per questo :)

btw, io non sono un Android de esperto veloper ma questo penso che quello che ho imparato guardando i video del ciclo di vita dello sviluppo di Android da Google

+1

Definitivamente non creare un altro progetto. Inoltre, non eseguire il servizio in un altro processo (tramite Android: processo) tranne in circostanze molto particolari. – hackbod

+0

sì, sto cercando di mantenere il mio servizio nello stesso processo. Probabilmente è più facile e veloce per me chiamare i metodi statici piuttosto che implementare l'aiuto – Erdal

Problemi correlati