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.
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
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
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