Usando a classe de aplicativo Android para persistir dados
-
25-09-2019 - |
Pergunta
Estou trabalhando em um aplicativo Android bastante complexo que requer uma quantidade um pouco grande de dados sobre o aplicativo (eu diria que um total de cerca de 500kb - isso é grande para um dispositivo móvel?). Pelo que posso dizer, qualquer mudança de orientação no aplicativo (na atividade, para ser mais precisa) causa uma destruição e recreação completas da atividade. Com base nas minhas descobertas, a classe de aplicativo não possui o mesmo ciclo de vida (ou seja, é, para todos os efeitos, sempre instanciados). Faz sentido armazenar as informações do estado dentro da classe de aplicativos e, em seguida, referenciá -las da atividade, 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 tópico. Obrigado!
Solução
Eu não acho que 500kb serão tão importantes.
O que você descreveu é exatamente como abordei meu problema de perder dados em uma atividade. Criei um singleton global na aula de aplicativos e pude acessá -la a partir das atividades que usei.
Você pode transmitir dados em um singleton global se for muito usado.
public class YourApplication extends Application
{
public SomeDataClass data = new SomeDataClass();
}
Em seguida, chame -o de qualquer atividade:
YourApplication appState = ((YourApplication)this.getApplication());
appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here.
Eu discuto isso Aqui na minha postagem no meu blog, sob a seção "Global Singleton".
Outras dicas
Aqueles que contam com Application
instância estão errados. A princípio, pode parecer que o Application
Existe enquanto existir todo o processo do aplicativo, mas isso é uma suposição incorreta.
O sistema operacional pode matar processos conforme necessário. Todos os processos são divididos em 5 níveis de "matança" especificado no documento.
Assim, por exemplo, se o seu aplicativo entrar em segundo plano devido ao usuário que responde a uma chamada recebida, dependendo do estado da RAM, o sistema operacional pode (ou não) matar seu processo (destruindo o Application
instância no processo).
Eu acho que uma abordagem melhor seria persiste seus dados em arquivo de armazenamento interno e depois leia quando sua atividade recomeçar.
ATUALIZAR:
Recebi muitos feedbacks negativos, então é hora de adicionar 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 bom que às vezes o estado seja perdido (pode ser algumas imagens que serão apenas releitivas/reduzidas), então é totalmente bom mantê -lo como membro de Application
.
Se você deseja acessar o "Singleton Global" fora de uma atividade e não quer passar pelo Context
Através de todos os objetos envolvidos para obter o Singleton, você pode definir um atributo estático na sua classe de aplicativo, que mantém a referência a si mesma. Basta inicializar o atributo no onCreate()
método.
Por exemplo:
public class ApplicationController extends Application {
private static ApplicationController _appCtrl;
public static ApplicationController getAppCtrl()
{
return _appCtrl;
}
}
Porque subclasses de Application
Também pode obter os recursos, você pode acessá -los simplesmente quando definir um método estático, que os devolve, como:
public static Resources getAppResources()
{
return _appCtrl.getResources();
}
Mas tenha muito cuidado ao passar em torno de referências de contexto para Evite vazamentos de memória.
Dave, que tipo de dados é esse? Se são dados gerais que se referem ao aplicativo como um todo (exemplo: dados do usuário), estenda a classe de aplicativo e armazenem -os lá. Se os dados se referem à atividade, você deverá usar os manipuladores OnsaveInstancestate e OnRestoreInstanCestate para persistir os dados na rotação da tela.
Você pode substituir a funcionalidade de orientação para garantir que sua atividade não seja destruída e recriada. Olhar aqui.
Você pode criar a classe de aplicativo e salvar todos os dados sobre esse CALSS para uso que em qualquer lugar do seu aplicativo.