Perché non usare sempre android: configChanges = “keyboardHidden | orientamento”?


178

Mi chiedevo perché non usarlo android:configChanges="keyboardHidden|orientation"in ogni (quasi ogni;)) attività?

Merce:

  • non devi preoccuparti che la tua attività sia stata ruotata
  • è più veloce

Non così carino:

  • è necessario modificare i layout se dipendono dalle dimensioni dello schermo (ad esempio layout con due colonne o giù di lì)

Male:

  • nessun modo flessibile per avere layout diversi con orientamento diverso
  • non così buono quando si usano frammenti

Ma se non utilizziamo layout diversi, perché no?


6
Dovresti anche spiegare cosa pensi che stia facendo KeyboardHidden | orientamento
Blundell,

Impedisce l'utilizzo della gestione nativa delle modifiche alla configurazione specificate e consente all'applicazione di gestirla, no?
Mikooos,

2
Ecco perché questa opzione è lì, se sai cosa stai facendo (nessun cambiamento nelle risorse), usalo.
Puntatore Null

perché è più veloce dell'uso di ScreenSize?
Batmaci,

Risposte:


334

Sfondo rapido

Per impostazione predefinita, quando si verificano determinate modifiche alla configurazione chiave su Android (un esempio comune è una modifica dell'orientamento), Android riavvia completamente l'attività in esecuzione per aiutarla ad adattarsi a tali modifiche.

Quando definisci android:configChanges="keyboardHidden|orientation"nel tuo AndroidManifest, stai dicendo ad Android: "Per favore, non eseguire il ripristino predefinito quando la tastiera viene estratta o il telefono viene ruotato; voglio gestirlo da solo. Sì, so cosa sto facendo "

È una buona cosa? Vedremo presto ...

Nessun problema?

Uno dei vantaggi con cui inizi è che esiste:

non devi preoccuparti che la tua attività sia stata ruotata

In molti casi, le persone credono erroneamente che quando hanno un errore generato da un cambiamento di orientamento ("rotazione"), possono semplicemente risolverlo inserendo android:configChanges="keyboardHidden|orientation".

Tuttavia, android: configChanges = "keyboardHidden | orientamento" non è altro che un cerotto. In verità, ci sono molti modi in cui una modifica della configurazione può essere attivata. Ad esempio, se l'utente seleziona una nuova lingua (ovvero le impostazioni internazionali sono state modificate), la tua attività verrà riavviata nello stesso modo in cui avviene una modifica dell'orientamento. Se lo desideri, puoi visualizzare un elenco di tutti i diversi tipi di modifiche alla configurazione .

Modifica : Ancora più importante, tuttavia, come sottolinea hackbod nei commenti, la tua attività verrà riavviata anche quando l'app è in background e Android decide di liberare un po 'di memoria uccidendola. Quando l'utente torna alla tua app, Android tenterà di riavviare l'attività nello stesso modo in cui si verificava qualche altra modifica di configurazione. Se non riesci a gestirlo, l'utente non sarà felice ...

In altre parole, l'uso android:configChanges="keyboardHidden|orientation"non è una soluzione per le tue "preoccupazioni". Il modo giusto è codificare le tue attività in modo che siano contente di ogni riavvio che Android le lancia. Questa è una buona pratica che ti aiuterà lungo la strada, quindi abituati.

Quindi quando dovrei usarlo?

Come hai detto, c'è un netto vantaggio. Sovrascrivere la modifica della configurazione predefinita per una rotazione gestendola da soli accelererà le cose. Tuttavia, questa velocità ha un prezzo di convenienza.

Per dirla semplicemente, se usi lo stesso layout sia per il ritratto che per il paesaggio sei in buona forma eseguendo la sovrascrittura. Invece di una ricarica completa dell'attività, le viste si sposteranno semplicemente per riempire lo spazio rimanente.

Tuttavia , se per qualche motivo usi un layout diverso quando il dispositivo è in orizzontale, il fatto che Android ricarichi la tua attività è buono perché caricherà quindi il layout corretto. [Se usi l'override su tale attività e vuoi fare un magico re-layout in fase di esecuzione ... beh, buona fortuna - è tutt'altro che semplice]

Riepilogo rapido

Certamente, se android:configChanges="keyboardHidden|orientation"è giusto per te, allora usalo. Ma PER FAVORE essere sicuri di test di ciò che accade quando qualcosa cambia, perché un cambiamento di orientamento non è l'unico modo per un riavvio completo di attività può essere attivato.


50
Vale la pena aggiungere che non gestire la tua attività in fase di riavvio significa che hai problemi più grandi che semplicemente non gestire modifiche di configurazione meno comuni. Il riavvio dell'attività utilizzato qui è esattamente lo stesso meccanismo con cui Android ripristina l'attività allo stato precedente quando l'app viene uccisa in background. Quindi, se non lo stai facendo correttamente, i tuoi utenti sperimenteranno la tua app in modo casuale non tornando correttamente quando tornano ad essa dallo sfondo, a seconda che il processo sia stato ucciso. Quindi un enorme vantaggio: si assicura che la tua app si riavvii correttamente.
hackbod,

14
Da Android 3.x in poi non perdere l'aggiunta di "screenSize" ---------- android: configChanges = ["mcc", "mnc", "locale", "touchscreen", "tastiera", "keyboardHidden", "navigation", "screenLayout", "fontScale", "uiMode", "orientamento", "screenSize", "smallestScreenSize"]
Michael Biermann,

1
Ho notato che quando usi l'attributo configChanges, la tua app ignora anche la funzione di blocco dell'orientamento. Come puoi risolverlo? se conosci la risposta, scrivila qui: stackoverflow.com/questions/24000361/…
sviluppatore Android

4
Please don't do the default reset when the keyboard is pulled outnon ho mai visto un riavvio di attività per Keyboard estrarre !
Muhammad Babar,

bene i riavvii occasionali sono ok secondo me ... configChanges gestisce la maggior parte dei casi per me ... beh forse in qualche altro tipo di applicazioni questo può essere un problema ma dipende davvero ....
Renetik

2

Dal mio punto di vista: se il layout è lo stesso in modalità orizzontale e verticale, potresti anche disabilitare uno dei due nella tua app.

Il motivo per cui lo dico è che come utente mi aspetto che l'app mi offra alcuni vantaggi, quando cambio orientamento. Se non importa come tengo il telefono, non ho bisogno della scelta.

Prendi ad esempio un'app in cui hai un ListView e facendo clic su un oggetto List si desidera visualizzare una vista dettagliata per quell'elemento. In orizzontale, potresti dividerlo dividendo lo schermo in due, con ListView a sinistra e la vista dettagliata a destra. In Verticale si avrebbe l'elenco in una schermata e quindi si passa alla schermata dettagliata quando si seleziona un oggetto ListItem. In tal caso, la modifica dell'orientamento ha senso oltre a layout diversi.


4
Sì, siamo andati con quello nella versione 1.0 della nostra app, per abbinare la nostra versione di Apple. È stato presentato SOLO in verticale. Che sembrava fantastico sul mio Droid X, corrispondevamo esattamente al comportamento della tastiera popup della versione IOS. Quindi il CFO ha installato l'app sul suo Droid, l'ha girata di lato e ha aperto la tastiera. Ops. La cosa su Android è che è una piattaforma aperta e non puoi davvero prevedere la configurazione hardware o cosa l'utente vorrà fare con essa, quindi dovresti probabilmente supportare entrambi (tutti) gli orientamenti per ogni evenienza.
Tevo D,

1
Che incidentalmente ha scavalcato la nostra impostazione di solo ritratto, poiché era sostanzialmente nell'hardware che l'orientamento orizzontale era allora l'orientamento normale, non alternativo. Il che ha davvero rovinato il nostro layout :( ed è stato piuttosto imbarazzante, avendo un grosso difetto in pochi secondi da quando ha installato l'app
Tevo D

1
Perché stavi cercando di farlo comportare esattamente come iOS? :(
FunkTheMonk

7
@FunkTheMonk Purtroppo viviamo in un mondo in cui gli uomini d'affari prendono decisioni tecniche. Anche se litighi contro di essa, la metà delle volte pensa comunque di avere ragione. E controllano la tua busta paga.
StackOverflow

2
L'uso di un solo layout non significa che lo schermo avrà lo stesso aspetto quando ruotato. Un layout XML ben strutturato farà sì che le cose si spostino automaticamente per funzionare bene con dimensioni ragionevoli e gli utenti lo apprezzeranno.
Melinda Green,

-1

Non capisco perché .... i riavvii occasionali sono ok secondo me ... configChanges gestisce la maggior parte dei casi per me ... beh forse in alcuni tipi di applicazioni questo può essere un problema ma dipende davvero dal tipo di app e da come ripristini stato al riavvio dell'app ... Quando una delle mie app riavvia l'utente viene ricollegato e l'ultima attività si apre con il mio codice e l'utente jus perde alcuni passaggi per tornare indietro dov'era ma non è un grosso problema .. In altri alcuni stati sono sempre persistenti e alcuni stati vengono sempre ripristinati al riavvio. Quando l'attività è stata riavviata doveva essere che l'app non è stata utilizzata o qualcosa del genere ... quindi nessun problema ... Nel gioco, ad esempio, questo può essere un problema forse o in qualche altro tipo di app che non conosco ...

Dico che quando lo fai in questo modo le applicazioni funzionano bene in circostanze normali. E il codice è molto più leggibile senza tonnellate di logica necessaria per salvare e ripristinare dove puoi semplicemente creare nuovi bug e mantenerlo sempre ... sicuro che se Android si esaurisce e uccide la finestra dell'applicazione, perde il contesto e ricomincia, ma questo accade solo in situazioni speciali e su dispositivi più recenti credo che questo sia sempre più raro ...

Quindi uccidimi, ma lo uso con successo su tutte le applicazioni ... android: configChanges = "locale | tastiera | tastiera nascosta | orientamento | screenLayout | uiMode | screenSize | smallestScreenSize" Ma capisco che per alcuni tipi speciali di applicazioni potrebbe non essere buon modo, ma la maggior parte delle app può vivere con questo semplicemente OK.


Salve qualcuno può essere informato su questo argomento, per favore dai un'occhiata al mio thread: stackoverflow.com/questions/35941585/…? Ho un disperato bisogno di aiuto.
Luke Allison,

Dovresti supportare completamente il salvataggio / ripresa delle attività ... gestirlo per la rotazione non è diverso ... Dici di perdere alcuni passi ... se lo fai correttamente non perdi nessun passo e ripristini esattamente dove l'utente ha interrotto ... anche dopo il riavvio del dispositivo.
HaMMeReD

martellato non so di cosa tu stia parlando ma dico che quando lo fai in questo modo le applicazioni funzionano bene in circostanze normali. E il codice è molto più leggibile senza tonnellate di logica necessaria per salvare e ripristinare dove puoi semplicemente creare nuovi bug e mantenerlo sempre ... sicuro che se Android si esaurisce e uccide la finestra dell'applicazione, perde il contesto e ricomincia, ma questo accade solo in situazioni speciali e su dispositivi più recenti credo che questo sia sempre più raro ...
Renetik

Ignorare di aderire al contratto di attività (salvare / ripristinare lo stato) è una cattiva pratica e questo è nel complesso un consiglio terribile. Prova a testare la morte del processo e vedi dove ti arriva la tua app, e questo comportamento è una "circostanza normale" completamente standard se l'utente utilizza almeno 2-3 app sul proprio telefono e passa da una all'altra.
EpicPandaForce,

-3

Sì, penso che mettere in pausa renderà più veloce il rilascio del giocatore. Comunque fai ancora una pausa.

Ora ho trovato una soluzione che non metterà in pausa la canzone.

Indicare nel file manifest che si gestirà la modifica della configurazione per l'orientamento dello schermo e quindi utilizzare il metodo onConfigurationChanged per caricare il file di layout. In questo modo in logCat posso vedere onPause, onCreate e onResume non vengono chiamati, e quindi la canzone non viene messa in pausa.

  1. aggiorna il manifest per gestire l'orientamento.

    android:configChanges="orientation|screenSize"
  2. aggiungi questo codice

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub      
        super.onConfigurationChanged(newConfig);        
        setContentView(R.layout.activity_main);
    }

Dovresti utilizzare un servizio per riprodurre musica. Scherzi a parte, stai dicendo alle persone di aggiungere codice che contiene ancora "// stub del metodo generato automaticamente da TODO". Soluzione sciatta. Non funzionerà neanche bene, dovrai ricollegare tutti i tuoi riferimenti e, in caso contrario, saranno imprevedibili nella migliore delle ipotesi.
HaMMeReD
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.