Por que não usar sempre android: configChanges = "keyboardHidden | orientação"?

178

Fiquei me perguntando por que não usar android:configChanges="keyboardHidden|orientation"em todas as atividades (quase todas;)?

Mercadorias:

  • não precisa se preocupar com a sua atividade ter sido rotacionada
  • é mais rápido

Não tão legal:

  • precisa alterar seus layouts se eles dependem do tamanho da tela (por exemplo, layouts com duas colunas ou mais)

Ruim:

  • nenhuma maneira flexível de ter layouts diferentes em diferentes orientações
  • não é tão bom quando se usa fragmentos

Mas se não usamos layouts diferentes, por que não?

Mikooos
fonte
6
Você também deve explicar o que você acha keyboardHidden | orientação está fazendo
Blundell
Isso impede o uso de manipulação nativa de alterações de configuração especificadas e permite que o aplicativo lide com isso, não é?
21411 Mikooos
2
É por isso que esta opção existe, se você souber o que está fazendo (sem alterações nos recursos), use-a.
Pointer Null
por que é mais rápido que usar o ScreenSize?
batmaci

Respostas:

334

Histórico Rápido

Por padrão, quando certas alterações de configuração de chave ocorrem no Android (um exemplo comum é uma alteração de orientação), o Android reinicia completamente a Atividade em execução para ajudá-lo a se ajustar a essas alterações.

Ao definir android:configChanges="keyboardHidden|orientation"no AndroidManifest, você está dizendo ao Android: "Por favor, não faça a redefinição padrão quando o teclado for puxado ou o telefone estiver girado; eu mesmo quero lidar com isso. Sim, eu sei o que estou fazendo "

Isto é uma coisa boa? Veremos em breve ...

Não se preocupe?

Um dos profissionais com os quais você começa é o seguinte:

não precisa se preocupar com a sua atividade ter sido rotacionada

Em muitos casos, as pessoas acreditam erroneamente que quando têm um erro que está sendo gerado por uma mudança de orientação ("rotação"), elas podem simplesmente corrigi-lo inserindo android:configChanges="keyboardHidden|orientation".

No entanto, android: configChanges = "keyboardHidden | orientação" nada mais é do que um bandaid. Na verdade, existem muitas maneiras pelas quais uma alteração na configuração pode ser acionada. Por exemplo, se o usuário selecionar um novo idioma (ou seja, a localidade mudou), sua atividade será reiniciada da mesma maneira que ocorre por uma mudança de orientação. Se você quiser, pode ver uma lista de todos os diferentes tipos de alterações na configuração .

Editar : Mais importante, porém, como o hackbod aponta nos comentários, sua atividade também será reiniciada quando o aplicativo estiver em segundo plano e o Android decidir liberar memória matando-o. Quando o usuário retornar ao seu aplicativo, o Android tentará reiniciar a atividade da mesma maneira que ocorre se houver alguma outra alteração na configuração. Se você não conseguir lidar com isso - o usuário não ficará feliz ...

Em outras palavras, usar android:configChanges="keyboardHidden|orientation"não é uma solução para suas "preocupações". O caminho certo é codificar suas atividades para que elas fiquem felizes com qualquer reinício do Android. Esta é uma boa prática que irá ajudá-lo no caminho, para se acostumar.

Então, quando devo usá-lo?

Como você mencionou, há uma vantagem distinta. Substituir a alteração de configuração padrão para uma rotação, manipulando você mesmo, acelerará as coisas. No entanto, essa velocidade vem com um preço de conveniência.

Simplificando, se você usar o mesmo layout para retrato e paisagem, estará em boa forma fazendo a substituição. Em vez de uma recarga completa da atividade, as visualizações simplesmente mudarão para preencher o espaço restante.

No entanto , se, por algum motivo, você usar um layout diferente quando o dispositivo estiver em modo paisagem, o fato de o Android recarregar sua Atividade será bom, pois ele carregará o layout correto. [Se você usar a substituição em uma atividade desse tipo e quiser fazer um novo layout mágico em tempo de execução ... boa sorte - está longe de ser simples]

Resumo Rápido

Por todos os meios, se android:configChanges="keyboardHidden|orientation"for certo para você, use-o. Mas lembre- se de testar o que acontece quando algo muda, porque uma mudança de orientação não é a única maneira de ativar uma reinicialização completa da atividade.

yydl
fonte
50
Vale acrescentar que não lidar com a atividade sendo reiniciada significa que você tem problemas maiores do que simplesmente não lidar com alterações de configuração menos comuns. A reinicialização da atividade usada aqui é exatamente o mesmo mecanismo de como o Android restaura sua atividade ao estado anterior quando o aplicativo é interrompido em segundo plano. Portanto, se você não estiver fazendo isso corretamente, seus usuários experimentarão o aplicativo aleatoriamente não retornando corretamente quando retornarem ao segundo plano, dependendo se o processo foi interrompido. Um grande benefício: garante que o aplicativo seja reiniciado corretamente.
hackbod
14
A partir do Android 3.x, não deixe de adicionar "screenSize" ---------- android: configChanges = ["mcc", "mnc", "locale", "touchscreen", "keyboard", "keyboardHidden", "navegação", "screenLayout", "fontScale", "uiMode", "orientação", "screensize", "smallestScreenSize"]
Michael Biermann
1
Percebi que quando você usa o atributo configChanges, seu aplicativo também ignora o recurso de bloqueio de orientação. Como você pode resolver isso? se você souber a resposta, escreva-a aqui: stackoverflow.com/questions/24000361/…
desenvolvedor android
4
Please don't do the default reset when the keyboard is pulled outeu nunca vi uma atividade reiniciar para teclado retirar !
Muhammad Babar
bem reiniciado ocasionais são ok na minha opinião ... configChanges alças maioria dos casos, para mim ... bem, talvez em algum outro tipo de aplicações isto pode ser um problema, mas isso depende realmente ....
Renetik
2

Do meu ponto de vista: se o layout for o mesmo nos modos paisagem e retrato - você também pode desativar um dos dois no seu aplicativo.

A razão pela qual afirmo isso é que, como usuário, espero que o aplicativo me forneça algum benefício quando mudo de orientação. Se não importa como seguro meu telefone, não preciso escolher.

Tomemos, por exemplo, um aplicativo em que você tenha um ListView e, ao clicar em um ListItem, deseja exibir uma visualização detalhada desse item. Na paisagem, você odiaria isso dividindo a tela em duas, tendo o ListView à esquerda e a vista detalhada à direita. No Portrait, você teria a lista em uma tela e, em seguida, alteraria a tela para a exibição detalhada quando um ListItem for selecionado. Nesse caso, a mudança de orientação faz sentido, bem como diferentes layouts.

Kaspermoerch
fonte
4
Sim, concordamos com isso na versão 1.0 do nosso aplicativo, para coincidir com o lançamento da Apple. Foi apresentado SOMENTE em retrato. O que parecia ótimo no meu Droid X, combinamos exatamente o comportamento do teclado pop-up da versão do IOS. Em seguida, o CFO instalou o aplicativo em seu Droid, virou-o para o lado e abriu o teclado. Opa A coisa sobre o Android é que é uma plataforma aberta e você realmente não pode prever a configuração de hardware ou o que o usuário fará com ele, então você provavelmente deve suportar as duas (todas) orientações para o caso.
Tevo D
1
Que substituiu incidentalmente nossa configuração somente para retrato, pois era basicamente no hardware que a paisagem era então a orientação normal, e não alternativa. O que realmente foi cancelada a nossa disposição :( e foi muito embaraçoso, tendo uma grande falha em poucos segundos de ele instalar o aplicativo
Tevo D
1
Por que você estava tentando fazê-lo se comportar exatamente como o iOS? :(
FunkTheMonk 1/11/11
7
@FunkTheMonk Infelizmente, vivemos em um mundo onde os empresários tomam decisões técnicas. Mesmo se você argumentar contra, metade do tempo eles acham que estão certos de qualquer maneira. E eles controlam o seu salário.
StackOverflowed
2
Usar apenas um layout não significa que a tela terá a mesma aparência quando girada. Um layout XML bem estruturado fará com que as coisas mudem automaticamente para que funcionem bem com dimensões razoáveis, e os usuários apreciarão isso.
Melinda Green
-1

Eu não vejo por que .... reinicializações ocasionais estão ok na minha opinião ... configChanges lida com a maioria dos casos para mim ... bem, talvez em alguns tipos de aplicativos isso possa ser um problema, mas depende realmente do tipo de aplicativo e de como você restaura estado quando o aplicativo é reiniciado ... Quando um dos meus aplicativos é reiniciado, o usuário é logado novamente e a última atividade é aberta pelo meu código, e o usuário jus perde algumas etapas para voltar onde estava, mas não é grande coisa. Em outro, algum estado é sempre persistente e algum estado é sempre restaurado na reinicialização. Quando a atividade é reiniciada, deve ser que o aplicativo não tenha sido usado ou algo assim ... então não há problema algum ... No jogo, por exemplo, isso pode ser um problema, talvez ou em algum outro tipo de aplicativo que eu não conheça ...

Eu digo que, quando você faz dessa maneira, os aplicativos funcionam bem em circunstâncias normais. E o código é muito mais legível sem uma tonelada de lógica necessária para salvar e restaurar onde você só pode criar novos bugs e ter que mantê-lo o tempo todo ... com certeza se o Android fica sem energia e mata a janela do aplicativo, ele perde o contexto e começa de novo, mas isso acontece apenas em situações especiais e em dispositivos mais novos eu acredito que isso é cada vez mais raro ...

Então me mate, mas eu uso isso em aplicativos com bastante êxito ... android: configChanges = "locale | teclado | tecladoHidden | orientação | screenLayout | uiMode | screenSize | smallestScreenSize" Mas eu entendo que para alguns tipos especiais de aplicativos pode não ser bom caminho, mas a maioria dos aplicativos pode viver com isso apenas OK.

Renetik
fonte
Oi, alguém que conhece esse tópico pode dar uma olhada no meu tópico: stackoverflow.com/questions/35941585/…? Preciso desesperadamente de ajuda.
Luke Allison
Você deve apoiar totalmente a economia / retomada de atividades ... manipulá-lo para rotação não é diferente ... Você diz que perde algumas etapas ... se fizer isso corretamente, não perde etapas e restaura exatamente de onde o usuário parou ... mesmo após o reinício do dispositivo.
HaMMeReD 7/16/16
hammered Eu não sei do que você está falando, mas digo que quando você faz dessa maneira os aplicativos simplesmente funcionam bem em circunstâncias normais. E o código é muito mais legível, sem muita lógica necessária para salvar e restaurar, onde você só pode criar novos bugs e ter que mantê-lo o tempo todo ... com certeza, se o Android fica sem energia e mata a janela do aplicativo, ele perde o contexto e começa de novo, mas isso acontece apenas em situações especiais e em dispositivos mais recentes Eu acredito este é cada vez mais raro ...
Renetik
Ignorar a adesão ao contrato de Atividade (estado de economia / restauração) é uma prática ruim, e esse é um péssimo conselho geral. Tente testar a morte do processo e veja onde o aplicativo o leva, e esse comportamento é completamente normal "circunstância normal" se o usuário usar pelo menos 2 a 3 aplicativos no telefone e alternar entre eles.
EpicPandaForce 16/01
-3

Sim, acho que pausar será mais rápido do que liberar o player. Ainda tem uma pausa.

Agora encontrei uma solução que não pausa a música.

Informe no manifesto que você manipulará a alteração de configuração para orientação da tela e, em seguida, use o método onConfigurationChanged para carregar o arquivo de layout. Ao fazer isso no logCat, vejo onPause, onCreate e onResume não são chamados e, portanto, a música não é pausada.

  1. atualize o manifesto para lidar com a orientação.

    android:configChanges="orientation|screenSize"
  2. adicione este código

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub      
        super.onConfigurationChanged(newConfig);        
        setContentView(R.layout.activity_main);
    }
    
Raul
fonte
Você deve usar um serviço para tocar música. Sério, você está dizendo para as pessoas adicionarem código que ainda tenha "// TODO método stub gerado automaticamente" nele. Solução desleixada. Também não funcionará bem, você precisará refazer todas as suas referências e, caso contrário, elas serão imprevisíveis na melhor das hipóteses.
HaMMeReD 7/16/16