segunda-feira, 23 de setembro de 2013

Você conhece o Application do Android?

Introdução
Quando vamos desenvolver aplicativos, seja qual for a linguagem, sempre existe o momento em que precisamos trabalhar com variáveis globais, manter o usuário logado, salvar arquivos em cache, entre outros exemplos em que o conteúdo sería acessível a aplicação toda.

Para isso, existe um padrão chamado Singleton que possibilita o acesso de uma variável estática onde é possível trabalhar com essas situações.

Porém, no Android, é possível trabalhar com uma classe chamada Application onde se mantem ativa e acessível pela aplicação enquanto esta estiver acessível, com a vantagem de você ter controle de quando a aplicação foi finalizada ou alguma configuração alterada, entre outras coisas.

Dessa forma podemos ter controle total do conteúdo que estamos mantendo globalmente, por exemplo, caso eu tenha algumas imagens mantidas em cache, quando a aplicação for finalizada, eu podería forçar a limpeza da memória eliminando as imagens da mesma, caso não fizesse isso, o device poderá ficar a espera do Garbage de memória do Android podendo ter alguma demora dependendo da situação.

Bem, vamos a algumas explicações e depois a prática! o/

O que é o tal do Singleton?
O Singleton nada mais é do que um padrão onde garante uma única instância de uma classe para a aplicação toda, ou seja, a mesma classe não poderá ser iniciada duas(02) vezes na mesma aplicação.

Usando o padrão Singleton é possível trabalhar com variáveis globais ou então centralizar o trabalho de conexão ao banco ou até mesmo manter os dados do usuário logado, entre outras coisas.

Segue link(Wikipédia) com um resumo e exemplos de várias linguagens usando o padrão Singleton.

Desvendando o Application
Para se trabalhar com o Application não é nada complicado, segue os passos:
  • Criar uma classe que extenda da classe android.app.Application;
  • Adicionar essa classe a propriedade name da tag <application> do AndroidManifest.xml;
  • Acessar em qualquer Activity da sua aplicação atraves do comando getApplicationContext();
Viu como é simples? É perfeitamente possível trabalhar com o padrão Singleton substituindo essa configuração toda, porém perdemos o controle do status atual da aplicação. Essa sería a grande vantagem de usar o Application.
Segue abaixo alguns métodos úteis do Application:
  • onCreate()
    • Chamado quando a aplicação é iniciada, antes da Activity, Service ou Objetos receptores sejam criados;
  • onTerminate()
    • Esse método somente usado para processos de ambientes emulados;
  • onConfigurationChanged(Configuration newConfig)
    • Chamado pelo sistema quando a configuração do device mudou enquanto a aplicação está rodando;
  • onTrimMemory(int level)
    • Chamado quando o sistema determina que é uma boa hora para limpar processos desnecessários em memória;
  • onLowMemory()
    • Ele é chamado quando o sistema roda com pouca memória e processos tenham que cortar seu consumo de memória;

Podemos ver, com esses métodos, que temos praticamente total controle do que acontece durante a aplicação. Dessa forma podemos expandir muito as possibilidades da nossa Aplicação.

Vamos a prática? o/
Vamos fazer um exemplo simples, onde iremos salvar uma mensagem no Application e depois buscar a mesma e apresentar na tela usando o Toast. Algo simples mas que mostra a funcionalidade em si.

1- Depois do seu projeto criado, vamos criar uma classe chamada AppApplication que extenda de "android.app.Application". Também criar uma variável chamada "message" e encapsula-la.
import android.app.Application;

public class AppApplication extends Application {
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

2- Depois vamos atualizar o nosso AndroidManifest.xml, incluindo a informação "nome-pacote-application+nome-classe-application" na propriedade "name" da tag <application>;

3- Agora vem a alteração da sua Activity. Segue abaixo o código da Activity:
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ((Button)findViewById(R.id.btnMessage)).setOnClickListener(onClickMessage());
        ((Button)findViewById(R.id.btnAlertMessage)).setOnClickListener(onClickAlertMessage());
    }

    /**
     * Quando clicar no botão Salvar Mensagem, irá salvar a mensagem no Application
     * @return View.OnClickListener
     */
    private View.OnClickListener onClickMessage() {
        return new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Pega a mensagem do EditText
                String message = ((EditText)findViewById(R.id.etMessage)).getText().toString();
                // Seta a mensagem no AppApplication
                ((AppApplication)getApplicationContext()).setMessage(message);
                ((EditText)findViewById(R.id.etMessage)).setText("");
                Toast.makeText(MainActivity.this, "Mensagem Salva no Application", Toast.LENGTH_LONG).show();
            }
        };
    }

    /**
     * Quando clicar no botão Alerta Mensagem, irá buscar a mensagem do Application e mostrar em um Toast
     * @return View.OnClickListener
     */
    private View.OnClickListener onClickAlertMessage() {
        return new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Pega a mensagem salva no AppApplication
                String message = ((AppApplication)getApplicationContext()).getMessage();
                // Mostra a mensagem no Toast
                Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show();
            }
        };
    }
}

Obs: Eu criei no layout hum(01) EditText para escrever a mensagem e dois(02) botões para salvar e mostrar a mensagem.
Conclusão e documentação
Viu como é simples? É possível fazer muito mais como manter o usuário logado entre outras coisas. A minha intensão com o exemplo é mostrar como é simples a utilização do Application.

Para saber mais sobre a classe Application, segue a documentação da mesma: link

Bem, essa é mais uma dica bacana para quem está conhecendo o universo Android.
Espero que tenha gostado e caso tenha dúvidas ou sugestões, por favor, comente no campo de comentários.

Bons estudos,

[]~

Nenhum comentário:

Postar um comentário