Estou trabalhando em um aplicativo Android bastante complexo que requer uma grande quantidade de dados sobre o aplicativo (eu diria um total de cerca de 500 KB - isso é grande para um dispositivo móvel?). Pelo que posso dizer, qualquer mudança de orientação na aplicação (na atividade, para ser mais preciso) provoca uma destruição e recriação completa da atividade. Com base em minhas descobertas, a classe Application não tem o mesmo ciclo de vida (ou seja, é, para todos os efeitos, sempre instanciada). Faz sentido armazenar as informações de estado dentro da classe do aplicativo e, em seguida, referenciá-las a partir da Activity ou esse geralmente não é o método "aceitável" devido a restrições de memória em dispositivos móveis? Eu realmente aprecio qualquer conselho sobre este assunto. Obrigado!
112
Respostas:
Eu não acho que 500kb será um grande negócio.
O que você descreveu é exatamente como resolvi meu problema de perda de dados em uma atividade. Criei um singleton global na classe Application e pude acessá-lo a partir das atividades que usei.
Você pode passar dados em um Global Singleton se ele for muito usado.
Em seguida, chame-o em qualquer atividade:
Eu discuto isso aqui em minha postagem do blog , na seção "Singleton Global".
fonte
Aqueles que contam com
Application
instância estão errados. À primeira vista, pode parecer queApplication
existe enquanto todo o processo do aplicativo existir, mas essa é uma suposição incorreta.O sistema operacional pode matar processos conforme necessário. Todos os processos são divididos em 5 níveis de "capacidade de eliminação" especificados no documento .
Portanto, por exemplo, se seu aplicativo ficar em segundo plano devido ao usuário responder a uma chamada, dependendo do estado da RAM, o sistema operacional pode (ou não) interromper seu processo (destruindo a
Application
instância no processo) .Acho que uma abordagem melhor seria manter seus dados no arquivo de armazenamento interno e depois lê-los quando a atividade for retomada.
ATUALIZAR:
Recebi muitos feedbacks negativos, então é hora de acrescentar um esclarecimento. :) Bem, inicialmente eu realmente usei uma suposição errada de que o estado é realmente importante para o aplicativo. No entanto, se o seu aplicativo estiver certo que às vezes o estado é perdido (podem ser algumas imagens que serão apenas relidas / baixadas novamente), então está totalmente OK mantê-lo como membro
Application
.fonte
Application
instância, no entanto, não haverá seus dados estáticos com os quais você conta, a menos que você os persista.Se você deseja acessar o "Global Singleton" fora de uma atividade e não deseja passar no
Context
por todos os objetos envolvidos para obter o singleton, você pode apenas definir um atributo estático em sua classe de aplicativo, que contém a referência para em si. Basta inicializar o atributo noonCreate()
método.Por exemplo:
Como as subclasses de
Application
também podem obter os Recursos, você pode acessá-los simplesmente ao definir um método estático, que os retorna, como:Mas tenha muito cuidado ao passar referências de contexto para evitar vazamentos de memória .
fonte
Application
para fazer isso. Você pode declarar uma variável de membro estático em qualquer classe para fazer isso.Dave, que tipo de dados são? Se forem dados gerais que pertencem ao aplicativo como um todo (exemplo: dados do usuário), estenda a classe Application e armazene-a lá. Se os dados pertencerem à Activity, você deve usar os manipuladores onSaveInstanceState e onRestoreInstanceState para persistir os dados na rotação da tela.
fonte
Na verdade, você pode substituir a funcionalidade de orientação para garantir que sua atividade não seja destruída e recriada. Olhe aqui .
fonte
Você pode criar uma classe de aplicativo e salvar todos os seus dados nesse calss para usar em qualquer lugar em seu aplicativo.
fonte
Eu sei que esta é uma questão muito antiga, mas usar o ViewModel dos componentes do jetpack é a melhor maneira de preservar os dados entre a rotação de atividades.
fonte