Cosa succede effettivamente quando si fa scorrere un'app dall'elenco delle app recenti?


147

Il recente elenco di app in Ice Cream Sandwich ha aggiunto la possibilità di eliminare le app dall'elenco, eliminandole in modo permanente (e per quanto ne so questa è una funzione vanilla, non una ROM CM / personalizzata). I punti salienti della documentazione e della piattaforma non sembrano coprire i meccanismi nascosti di questa funzionalità, ma sono curioso di sapere cosa sta effettivamente facendo il sistema.

Aggiungendo alla mia curiosità, ho deciso di fare un rapido test: ho avviato Music su un'installazione CM9, quindi ne sono uscito. Ho quindi controllato l'elenco delle app recenti e ho visto che era effettivamente lì (e nello stato corretto, in base alla miniatura). Poi sono entrato Settings->Applicationse ho forzato l'arresto dell'app Music, ma era ancora elencata nell'elenco recente, portandomi a credere che non fosse collegato a processi persistenti in background.

Comprendendo ora che la musica potrebbe essere stata una scelta sbagliata, ho anche testato con l'app USA Today. Questo mostrava sostanzialmente lo stesso comportamento e sembrava che fosse costretto a "riavviare" dopo l'arresto forzato (il che ha senso) sebbene la miniatura nell'elenco delle app recenti non riflettesse questo (memorizzato nella cache, immagino?).

Quindi, cosa succede effettivamente a livello di sistema operativo quando si fa scorrere un'app dall'elenco recente? Elimina semplicemente i dati dell'app dalla RAM e la spazzatura lo raccoglie, distruggendo il suo stato salvato?

Risposte:


68

Scorrere le app dall'elenco delle app recenti è vaniglia e, sì, non ben documentato. Questo è stato l'argomento di una discreta quantità di discussioni su vari forum Android ... il consenso sembra essere meglio descritto qui in alcuni commenti : che il comportamento è simile ma non esattamente uguale alla chiusura di un'app - in generale ( per le app che non definiscono la gestione esplicita dei pulsanti di back) è la stessa cosa che rispondere a un numero di volte sufficiente all'interno di un'applicazione da cui si esce.

Il link ha alcuni dettagli in più sui dettagli, ma nel complesso puoi pensarlo come uscire dall'applicazione.

Specifico per l'app Music, credo che avvii un servizio, quindi mentre l'attività stessa (l'app Music / UI) potrebbe essere chiusa, il servizio continua a essere eseguito in background in modo che la tua musica non si interrompa improvvisamente solo perché l'attività è stato eliminato per motivi di gestione della memoria. Ciò potrebbe aver influito su ciò che hai visto.


1
Grazie, quel link ha molte buone discussioni. Potresti anche avere ragione riguardo a: musica, potrebbe essere stato un test scarso. Proverò un'altra app, solo per i calci.
eldarerathis,

2
Andare avanti e accettarlo poiché la discussione su reddit mi ha aiutato a trovare alcuni termini di ricerca migliori e sembrava essere corroborato da alcuni post di Dianne Hackborn che ho notato nella mia risposta . Grazie!
eldarerathis,


1
Perfetto, grazie! Per me questo post mi ha aiutato: reddit.com/r/Android/comments/mpevh/…
Boris Strandjev,

Lettori musicali di terze parti come Rocket Player interrompono la musica quando si scorre l'app dall'elenco Recenti anche se il servizio viene eseguito in background e è necessario aprire l'app o riprodurre di nuovo nel widget per avviare la musica.
Lucky

78

Mi sembra di aver trovato i termini di ricerca magici che hanno portato ad alcune spiegazioni da parte dei dipendenti di Google. In particolare, ho trovato un paio di posti diversi in cui Dianne Hackborn spiega cosa succede quando si fa scorrere qualcosa dall'elenco recente. Il primo è un commento su uno dei suoi post su Google+ :

[W] hat si verifica specificamente quando si trascina via un'attività recente: (1) uccide qualsiasi background o processi vuoti dell'applicazione (consultare http://developer.android.com/guide/topics/fundamentals/processes-and- threads.html # Ciclo di vita per ciò che significa), e (2) utilizza la nuova http://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent) API per dire qualsiasi servizi dell'applicazione in merito all'attività da rimuovere in modo che possa fare tutto ciò che ritiene appropriato.

Nota anche in un commento sul blog :

In realtà, la rimozione di una voce nelle attività recenti eliminerà tutti i processi in background esistenti per il processo. Non causerà l'arresto diretto dei servizi, tuttavia esiste un'API per scoprire che l'attività è stata rimossa per decidere se vogliono che ciò significhi che devono arrestarsi. Questo in modo che la rimozione dica che l'attività recente di un'app di posta elettronica non farà smettere di controllare la posta elettronica.

Se vuoi davvero interrompere completamente un'app, puoi premere a lungo sulle attività recenti per andare alle informazioni sull'app e premere forza per fermarti lì. Perché stop è un kill completo dell'app: tutti i processi vengono interrotti, tutti i servizi vengono arrestati, tutte le notifiche rimosse, tutti gli allarmi rimossi, ecc. L'app non può riavviarsi fino a quando non viene esplicitamente richiesto.

Quindi, sembra che il riepilogo sia che lo scorrimento di un'app dall'elenco ucciderà prima tutti i processi in background per l'app, quindi verrà utilizzato onTaskRemovedper notificare all'app che l'attività in background è stata rimossa. A quel punto sembra che spetti all'app decidere cosa succede, quindi immagino che tecnicamente non ci sia una regola rigida su ciò che accade all'app oltre quel punto.


Questo è certamente un comportamento non ovvio, molto interessante!
Matteo Leggi il

"uccide tutti i processi in background che esistono per il processo. Non causerà direttamente l'arresto dei servizi". È ancora vero? Ho fatto un test ieri. Ieri ho spazzato via un'app con un servizio in background nel processo principale. Le app => in esecuzione dell'interfaccia utente hanno mostrato 0 processi e 0 servizi. Successivamente ho trascinato via la stessa app con un processo in esecuzione in un processo specifico dell'applicazione separato. Le app => in esecuzione dell'interfaccia utente hanno detto che avevo 0 processi e 1 servizio. Quello era su una Moto X (2014) con Android 4.4.4.
Steven Wexler,

@StevenWexler: è possibile che il servizio sia terminato da solo nel primo caso, ma non nel secondo, oppure che nel secondo scenario il processo principale abbia determinato (per qualche motivo) che non voleva interrompere il servizio. Difficile da sapere con certezza.
eldarerathis,

il servizio avviato si riavvia automaticamente dopo essere uscito dall'elenco recente, il suo onCreate è stato richiamato nuovamente. ma in alcune app onCreate chiamato prima onTaskRemoved e in alcune chiamate dopo onTaskRemoved. perché questo comportamento è allora?
Umesh,

21

Ci sono alcune informazioni nel codice sorgente nelle classi com.android.internal.policy.impl.RecentApplicationsBackground e com.android.internal.policy.impl.RecentApplicationsDialog .

Se li leggo correttamente, ci sono gestori specifici per la selezione delle app, ma niente di speciale per il loro scorrimento ad eccezione di onDetachedFromWindow(), che chiama com.android.View.onDetachedFromWindow()che sostanzialmente nasconde l'elemento e cancella i suoi dati. Ciò indicherebbe il fatto che non accade nulla di speciale nel passaggio dell'app, che corrisponde alla risposta di Austin Mills, poiché poiché l'elenco non mostra l'app attiva, le onPause()e altre chiamate di sistema che vengono fatte quando si "esce" da un'applicazione è già successo.


10

Penso che farà lo stesso del pulsante Indietro. Tranne un piccolo cambiamento. Saranno finish()tutte le attività / i frammenti nell'app.

Ho appena fatto un piccolo test con una piccola app selfbuild. Puoi anche provare. Ecco la mia app di test: https://bitbucket.org/Leandros99/lifecycletest (disponibile anche per il download. Per coloro che non riescono a costruire.)
In ogni metodo del ciclo di vita delle attività ( http://developer.android.com/reference/android/app /Activity.html#ActivityLifecycle ) stampa l'app un registro. Puoi visualizzarlo con adb logcat (installa Android SDK, cd su strumenti-piattaforma in cmd / shell e tipo adb logcat. Ora vedrai, ogni volta che fai qualcosa come il pulsante Indietro o Home, l'app stampa il metodo del ciclo di vita, menzionato sopra. )

La tua domanda: se scorro un'app dal riquadro delle app recenti, onDestroyverrà chiamato il metodo. Funziona quasi come il pulsante Indietro.
Spero di aver aiutato un po '. Se ci sono domande, basta chiedere.


3

Chiude l'app e i suoi dati archiviati nella RAM. Pertanto, offrendoti più spazio RAM in modo da poter eseguire altre app. Tuttavia, i servizi in background NON vengono forzati automaticamente alla chiusura a causa della chiusura dell'app che utilizza.


1
Sebbene sia scritta nel linguaggio di tutti i giorni, questa è in realtà una risposta abbastanza accurata: cattura il fatto che il processo è stato eliminato, mancano molte altre risposte (quelle che lo confrontano erroneamente con il pulsante Indietro). Tuttavia, ciò che manca qui è la consapevolezza che Android eliminerà i processi quando necessario per ottenere comunque memoria, quindi mentre compie un po 'di pulizia della memoria, ciò avverrebbe automaticamente se / quando necessario.
Chris Stratton,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.