10

Normalmente, uscire la mia domanda chiamando:Perché l'applicazione a volte si riavvia su killProcess?

android.os.Process.killProcess(android.os.Process.myPid()); 

esegue bene senza incidenti.

Ma ogni tanto l'applicazione si riavvia nuovamente (dopo essere usciti!).

delle relative e spettacoli registro frammento:

.631: I/Process(15495): Sending signal. PID: 15495 SIG: 9 
.641: W/AudioFlinger(121): write blocked for 252 msecs, 1279 delayed writes, thread 0xdc18 
.651: I/ActivityManager(164): Process com.ef.myapp (pid 15495) has died. 
.651: I/WindowManager(164): WIN DEATH: Window{463659e8 com.ef.myapp/com.ef.myapp.MainActivity paused=false} 
.661: I/AudioService(164): AudioFocus abandonAudioFocus() from [email protected] 
.701: I/ActivityManager(164): Start proc com.ef.myapp for activity com.ef.myapp/.MainActivity: pid=15589 uid=10077 gids={3003} 

so che, per la progettazione del sistema operativo Android, killProcess() non è il modo corretto per terminare un'applicazione. Questo perché killProcess() interrompe il processo immediately senza dare alcun modo o possibilità per l'app di impedirlo o prepararsi per esso.

So che quando chiamo finish(), lo stack di applicazioni viene semplicemente spostato sullo sfondo (ed esiste ancora nella memoria). Lo stesso Android decide quando chiudere l'applicazione (cioè rimuovere la sua istanza dalla memoria) e generalmente questo viene fatto quando l'applicazione diventa "la più vecchia non usata per il tempo più lungo". Il suo comportamento è in realtà più prevedibile se è davvero lo last one.

Il problema è che finish() interrompe e distrugge solo l'attività per la quale è stato chiamato. Non blocca altre attività generate dall'applicazione o da altre attività. Quindi, per facilitare il test di debug durante lo sviluppo, sto usando killProcess() come una comoda scorciatoia.

Ma ora vedo che questo ha l'effetto collaterale dell'applicazione volte riavviare immediatamente dopo l'uccisione in sé - tutti entro 30 millisecondi.

Una soluzione semplice sarebbe quella di iterare attraverso tutte le attività dell'applicazione e finish() di loro. Ma prima di procedere con questo, sto morendo dalla voglia di capire ciò che nel sistema operativo Android fa ricominciare un'applicazione stessa.

Perché Android riavviava l'applicazione?

E perché inconsistentemente? (ad esempio a volte)

+0

Avete ricevitori broadcast con filtri intent registrati nel manifesto? Ciò provocherebbe l'avvio della tua app. –

risposta

4

C'è un bug noto nelle applicazioni modo per iniziare la prima volta dal programma di installazione, web-browser e via IDE (IntelliJ, Eclipse, etc.). Prova ad installare la tua app senza avviarla e poi a avviarla dall'elenco delle applicazioni disponibili e vedere se il problema scompare. Vedere queste problematiche presentate da tempo legati al problema:

http://code.google.com/p/android/issues/detail?id=2373

http://code.google.com/p/android/issues/detail?id=26658

+1

L'app, a proposito, dovrebbe ** a volte ** riavviarsi anche quando viene eseguita per la prima volta dall'installer o da Eclipse. Non si riavvia sempre su quelle invocazioni. – ef2011

2

La tua app è in esecuzione in un unico processo o in più? killProcess ucciderà un singolo processo, non necessariamente l'intera applicazione. Prova a utilizzare ActivityManager#killBackgroundProcesses(String packageName) invece.

Se ciò non funziona, sembra che questi links potrebbero essere helpful nello spiegare il comportamento del sistema quando il processo viene interrotto.

E, a proposito, il sistema Android è ciò che sta riavviando l'applicazione ... va bene manipolare il suo comportamento (cioè impedendo il riavvio forzato delle app sulla chiusura forzata) a fini di sviluppo, ma non dovresti farlo quando spingi la tua app in produzione.

+0

Wow. Grazie per gli ottimi consigli. Ho sempre pensato che stavo correndo in un unico processo, ma permettimi di ricontrollarlo. Aggiornerò come ho più risultati. – ef2011

+0

OK, ho ricontrollato e sto eseguendo solo un singolo processo. Tuttavia, invoco attività eseguite in altri processi (ad esempio Google Maps), ciò vale? Sono propenso ad accettare la tua risposta perché contiene collegamenti a casi molto simili ai miei con informazioni che potrebbero spiegare cosa succede nel mio caso. Ma aspetterò un po 'per vedere se qualcuno può trovare una spiegazione più precisa (dubito che accadrà). Grazie! – ef2011

+0

** Aggiornamento: ** Ho appena incontrato un altro incidente di riavvio di questo tipo e ora che ho alcune chiamate di registro in più posso dirti che: ** 1. ** Succede sempre su un'installazione completamente nuova (app prima disinstallato manualmente tramite le impostazioni delle applicazioni, quindi eseguito tramite 'Esegui> Esegui (Ctrl + F11)'. ** 2. ** Il riavvio crea una nuova istanza dell'applicazione ('Activity.getApplication(). toString()'). Non è sicuramente la stessa applicazione riportata in primo piano. Cosa posso imparare da questo? – ef2011

1

Da ADT 17.0.0, esiste un campo statico BuildConfig.DEBUG che consente di eseguire il debug. Ad esempio puoi avere una classe statica che contiene tutte le istanze di attività in esecuzione. Quindi puoi finirli tutti alla volta.Penso che sia meglio che killProcess() ...

+0

Grande consiglio. Grazie. Inoltre un upvote. – ef2011

+0

Sono contento che sia utile. Prego :-) –

Problemi correlati