segunda-feira, 31 de agosto de 2015

Activity


Fala galera! Estou atualizando minhas publicações para melhorar a qualidade do blog. 

Definição:

Uma Activity é uma classe que apresenta uma tela da aplicação e também é responsável por tratar eventos gerados nessa tela, por exemplo, quando o usuário pressiona um botão ou um item de menu é selecionado.
A classe Activity deve implementar obrigatoriamente o método onCreate(bundle) responsável por realizar a inicialização do aplicativo(se for a Activity princilal) ou outra Activity. Cada Activity deve ser declarada no arquivo AndroidManifest.xml como mostrado a seguir:




A Activity pode ser declarada na forma que está na imagem, definida como principal (a que inicia o app) ou como descrito abaixo:

<activity android:name=”.MinhaClasseActivity”/>

Empilhamento de Activities:

Quando a Activity atual chama outra a nova Activity é colocada no topo da pilha, a Activity anterior permanece na pilha mas é interrompida. Quando uma Activity para, o OS mantém o estado atual IU(Interface de Usuário), ao pressionar o botão voltar, a activity atual é retirada do topo da pilha (destruída) e a atividade anterior retorna (o estado da IU é restaurado). Activities na pilha nunca são reorganizadas apenas entram e saem da pilha.



Se o usuário continua pressionando voltar, cada activity na pilha é retirada mostrando a anterior até o usuário retornar à tela inicial.

Ciclo de Vida:


Uma Activity pode existir em trẽs estados:

  • Em Execução: a activity está em primeiro plano (topo da pilha(activity stack)) e tem o foco do usuário.

  • Pausada: A Activity está visível, mas outra activity está no topo da pilha e tem o foco, ou seja outra activity está visível acima desta. Uma activity pausada está totalmente ativa, mas pode ser elimidada pelo sistema em situações de memória crítica.

  • Parada: A activity passa para “segundo plano”. Uma activity ainda está ativa no entando ela não fica mais visível para o usuário e pode ser elimidada pelo SO se a memória for necessária em outro processo.

Se uma activity estiver pausada ou interrompida, o SO poderá removê-la da memória solicitando a finalização de processo (chamando o método finish()) ou eliminando-o, ao reabrir a activity (depois de finalizada ou destruída) ela será totalmente recriada.


Fonte: https://developer.android.com/guide/components/activities?hl=pt-br


Exemplo Prático:

Abra o Android Studio clique em “Start a new Android Studio Project” ou se algum projeto estiver aberto clique em File > Close project e na tela inicial clique em “Start a new Android Studio Project” e preencha de acordo com a imagem e clique em Next:

  • Application name: nome do projeto;
  • Company domain: seu domínio, pode ser sua pagina web ou um fictício, define o pacote do projeto como visto em Package name;
  • Project location: localização do projeto em seu pc;
Na tela seguinte deixe marcado a opção “Phone and Tablet” e selecionada a api mínima 19 (KitKat) e clique em Next:


Selecione Empty Activity e clique em Next:


Deixe tudo como está e clique em Finish:

Com o projeto criado selecione res > layout e abra o arquivo activity_main.xml, altere o layout de acordo com a imagem:


Na classe MainActivity altere o método onCreate como na imagem:
Dentro do método onCreate definimos um log(é similar ao System.out.println do java) e um botão que ao ser clicado pelo usuário abrirá o browser (navegador do cel) na página do google como definido na imagem.

Crie os métodos correspondentes ao ciclo de vida da Activity e em cada um adicione um log:

Salve o projeto, clique em executar ou aperte shift+F10.



Ao iniciar o app no log cat aparecerá as seguintes linhas:



Os métodos onCreate, onStart e onResume foram executados, criando, iniciando e mostrando a IU ao usuário. Ao clicar em voltar no app as seguintes linhas aparecem no log cat:

Agora os métodos onPause, onStop e onDestroy foram executados, pausando, parando e destruindo a Activity, ao clicar no icone do app na galeria de apps do emulador (não executando pelo Android Studio) verá que as três linhas anteriores são mostradas, pois o método onDestroy destruiu a Activity e ela foi criada novamente executando o onCreate.

Com o app aberto clique no botão para abrir o browser as seguintes linhas são mostradas no logcat:

Apenas os métodos onPause e onStop são chamados, ou seja a Activity não foi destruida está em “segundo plano”, ao clicar em voltar para fechar o browser e mostrar a tela do app novamente vemos:


Veja que os métodos onRestart, onStart e onResume são chamados e a Activity é trazida ao “primeiro plano” novamente.

Observação: os métodos onCreate e onDestroy são chamados apenas uma vez no ciclo de vida.


Até a proxima!






terça-feira, 25 de agosto de 2015

Intent e Intent-Filter



No post desta semana utilizaremos um aplicativo simples para mostrar a funcionalidade das classes Intent e IntentFilter que são o coração do Android, mas antes de irmos para a prática falaremos um pouco de ambas.

Intent

A classe Intent (“intenção em português”) representa uma ação que a aplicação executará, pode-se dizer que a Intent representa a intenção da aplicação de realizar alguma tarefa. Isto é, a mensagem é enviada ao sistema operacional que irá decidir o que fazer em seguida.
Uma intente pode ser utilizada para abrir uma tela:

Intent intent = new Intent(this, Tela2.class);
startActivity(intent);

ou

Intent intent = new Intent(“ABRIR_TELA”);
startActivity(intent);
(Este Segundo exemplo será melhor explicado no tópico sobre IntentFilter).

O browser (em um endereço específico):

Uri uri  = Uri.parse(“www.google.com.br”);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
requer a permissão:
<uses-permission android:name=”android.permission.INTERNET” >

Efetuar uma ligação:

Uri uri = Uri.parse(“tel:66778899”);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
requer a permissão:
<uses-permission android:name=”android.permission.CALL_PHONE” >

Ver um contado da agenda:

Uri uri = Uri.parse(“content://com.android.contacts/contacs/1”);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

requer a permissão:
<uses-permission android:name=”android.permission.READ_CONTACTS” >

Ou todos os contados:

Uri uri = Uri.parse(“contente://com.android.contacts/contacts”);
Intent intent = new Intent(Intent.ACTION_PICK, uri);
startActvity(intent);

Iniciar algum processamento em segundo plano utilizando classes como BroadcastReceiver e Service que serão vistas em postagens futuras e muito mais. É possível também retornar o resultado de uma activity aberta com a intente com o método startActivityForResult(intente, codigo);

IntentFilter

A classe IntentFilter (“em português filtro de intenções”) serve para filtrar as ações de uma intent mapeando-as de acordo com a tarefa a ser executada. No segundo exemplo de intent usado para abrir uma tela informamos uma String coma ação ABRIR_TELA no construtor da classe Intent ao invés do contexto e da classe que representa a activity (tela) a ser aberta. Você deve estar se perguntando como saber qual activity será executada? Provavelmente alguém terá de configurar a ação ABRIR_TELA para que algo seja executado.

Veja o código xml da activity principal que mostra a configuração do intente-filter:

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

No código estão definidas a ação MAIN e a categoria LAUNCHER.

A ação define o que a intente deseja fazer, nos exemplos de intent mostramos a ação Intent.ACTION_VIEW utilizada para mostrar algo na tela.
A categoria é usada em conjunto com a ação para descobrir o que a intente deseja realizar, por exemplo, a ação MAIN define a tela configurada como principal, ou seja, a primeira tela mostrada sempre que a aplicação for iniciada da mesma forma que o método public static void main (String[] args) do Java.
A categoria LAUNCHER define que a aplicação será iniciada manualmente pelo usuário e será visível na tela inicial do sistema.

Obs.: Toda ação precisa, por padrão, ter uma categoria definida, por exemplo, se definir a ação ABRIR_TELA e executar o código:

Intent intent = new Intent(“ABRIR_TELA”);
startActivity(intent);

Vai se deparar com este erro no logcat: “No Activity found to Handle Intent ...”.

Sempre que se executa uma ação com a intent, por padrão a intente define a categoria como DEFAULT, se está categoria não estiver mapeada na tag intente-filter a intente não executará.

Agora vamos a prática, crie um novo projeto e  na tela new android application (caso esteja usando o eclipse) digite as informações como na imagem abaixo:

Altera o arquivo activity_main.xml de acordo com as informações abaixo:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="2dp"
    android:gravity="center" >

    <Button
        android:id="@+id/abrirTela"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_abrir_tela" />

    <Button
        android:id="@+id/abrirTela2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_abrir_tela_2" />

    <Button
        android:id="@+id/abrirTela3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_abrir_tela_3" />
   
    <Button
        android:id="@+id/abrirBrowser"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_abrir_browser" />
   
    <Button
        android:id="@+id/verContatoAgenda"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_ver_contato_agenda" />
   
    <Button
        android:id="@+id/verAgenda"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_ver_agenda" />
   
    <Button
        android:id="@+id/fazerChamada"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_fazer_chamada" />

</LinearLayout>

Modifique o arquivo strings.xml da pasta resources de acordo com a imagem abaixo:


Na classe MainActivity adicione os seguintes métodos:

Método da Interface OnClickListener

Retorna o texto da TelaTeste ao clicar o botão abrir tela 3

Inicializa os botãos da tela diretamente com o método setOnClickListener

Obs.: no método inicializarComponentes não instanciamos em nenhum momento a classe Button, pois o únco atributo a ser utilizado é o onclick que pode ser utilizado diretamente do método findViewById(id do botão);

Código da classe tela exemplo:




Obs2.: No método oncreate da tela exemplo chamamos o método setResult(codigo, intent) que recebe os parâmetros código, que informa se a activity vai retornar alguma informação ou não e a intent com a mensagem a ser retornada. Neste exemplo utilizamos como código o número diretamente, mas poderíamos utilizar uma constante padrão do android como RESULT_OK;

Arquivo manifest do projeto com as permissões necessárias e a configuração da tag intent-filter:


Arquivo AndroidManifest.xml

 Prints do projeto:


Tela Inicial da aplicação
Tela mostrando o contato de id 1



















Link do projeto: http://www.4shared.com/rar/tVP_B2Dqce/ExemploIntent.html