Succede in continuazione: qualche task sta girando in background e pensiamo che stia consumando le batterie o che stia occupando tutta la memoria.
La prima reazione è scaricare un app dedicata per terminare questi task.
Questo comportamento è tipico di chi non conosce Android e si avvicina per la prima volta a questo sistema operativo.
Questo è il punto: terminando i task che non hanno esaurito il loro compito, è più probabile che facciate del male piuttosto che del bene al sistema.
Di default, ogni applicazione viene eseguita in un proprio processo Linux. Android inizia il processo quando qualsiasi parte di codice dell’app ha bisogno di essere eseguita, e termina il processo quando non è più necessario e le risorse di sistema sono richieste da altre app.
Un content provider è attivo solo fin tanto che sta rispondendo a una richiesta da un ContentResolver; un broadcast receiver è attivo fin tanto che sta rispondendo a un broadcast message. Non c’è pertanto bisogno di terminare esplicitamente questi componenti.
Le attività forniscono l’interfaccia utente; sono in una conversazione a lungo termine con l’utente e possono rimanere attive, anche se idle, finchè la conversazione continua. In modo simile anche i servizi possono restare in esecuzione per un lungo periodo. Quindi Android ha diversi metodi per terminare attività e servizi in modo ben definito:
Un’attività può essere chiusa richiamando il metodo finish;
Un servizio può essere chiuso richiamando il suo metodo stopSelf o richiamando Context.stopService.
Anche i componenti posso essere terminati dal sistema quando non sono più usati oppure quando Android richiede memoria per altri componenti attivi.
Se l’utente lascia un task per molto tempo, il sistema cancella tutte le attività del task tranne l’attività di root. Quando poi l’utente torna nuovamente al task, questo è come l’utente l’aveva lasciato, tranne che è presente la sola attività iniziale. L’idea alla base di questo comportamento è che, dopo un certo tempo, probabilmente l’utente ha abbandonato ciò che stava facendo in precedenza ed è ritornato al task per iniziare qualcosa di nuovo.
Ciclo di vita delle attività
Un’attività ha essenzialmente 3 stati:
1) Attiva o in esecuzione: è in primo piano (in cima allo stack delle attività per il task corrente);
2) In Pausa: non è al “centro dell’attenzione” ma è ancora visibile all’utente; è completamente “in funzione” (mantiene tutte le informazioni di stato e del membro e rimane attaccato al window manager) ma può essere killata dal sistema in caso di memoria estremamente limitata;
3) Stoppata: è completamente oscurata da un’altra attività; mantiene ancora tutte le informazioni di stato e del membro, però non è più visibile all’utente, e quindi la sua finestra è nascosta; sarà sempre killata dal sistema quando la memoria è rischiesta da qualsiasi attività.
Se un attività è in pausa o stoppata, il sistema può toglierlo dalla memoria sia chiedendogli di finire (chiamando il suo metodo finish) sia killando i suo processo. Quando l’utente richiama nuovamente questa attività, deve essere completamente riavviata e riportata alla condizione precedente.
Il tempo di vita in primo piano di un’attività ha luogo tra una chiamata al metodo onResume() fino alla corrispondente chiamata del metodo onPause(). La transizione tra resumed e paused è un passaggio frequente per un’applicazione, quindi il codice tra questi due metodi dovrebbe essere leggero.
Riassumendo:
Android è progettato per killare automaticamente i task quando c’è bisogno di più memoria;
Android è progettato per killare automaticamente i task quando ha finito di fare ciò che deve;
Android è progettato per killare automaticamente i task quando non vengono usati per molto tempo;
La maggior parte dei servizi che girano in background usano pochissima memoria quando non stanno attivamente eseguendo qualcosa;
Un content provider fa qualcosa solo se deve dare una notifica; in caso sontrario usa pochissima memoria;
Killare un processo quando questo non è pronto ha come unico effetto che questo processo si dovrà riavviare da capo completamente quando è richiesto nuovamente;
Se non si è esperti, killare alcuni processi può avere effetti indesiderati: mancata ricezione di messaggi, allarmi che non si spengono...;
La magior parte delle app si chiudono premendo il tasto “Indietro”; comunque anche premendo il tasto “Home” Android alla fine terminerà il task una volta che questo sia stato messo in background per un certo tempo
Digressione:
La gestione della memoria in Linux e Windows è un po’ differente; in Windows possono avere senso programmi che “puliscono” la memoria, in Linux no: Linux si comporta allo stesso modo se hai 20MB o 300MB liberi! Android inizierà a liberare memoria quando sarà a corto di memoria.
Altro luogo comune da sfatare è che una RAM piena consumi più batterie: FALSO. Ha più senso dire che un maggiore utilizzo della CPU aumenta i consumi.
Fonte: Ipmart
grazie a "aledeago"