Aula 02
(Android Basico)
Activities e Intents

Natanael Fonseca
Arquiteto de Software



Site Pessoal: www.natanaelfonseca.com.br
Ementa
 O que é uma Activity(Atividade);
 Como aplicar estilos e temas;
 Como exibir uma Activity como um dialogo;
 Entendendo Intents(Intenções);
 Como realizar link de activities através de intents;
 Intent filters(Filtro de Intenções);
 Notifications(Notificações);
O que é uma Activity
 Uma aplicação pode ter uma ou mais Atividades;
 Serve para incluir a lógica de iteração com o
  usuário;
 São sempre declaradas no arquivo
  AndroidManifest.xml;
 Responsáveis por “inflar” o layout xml
  correspondente a UI;
 Possui um ciclo de vida;
 Normalmente trabalham de modo que ou estão
  ativas e visíveis ou inativas numa stack;
Ciclo de Vida de uma Activity
onCreate() — Chamado quando a atividade é criada ela
primeira vez;

onStart() — Chamado quando a atividade se torna visível para
o usuário;

onResume() — Chamado quando a atividade inicia a iteração
com o usuário;

onPause() — Chamado quando a atividade corrente está
sendo pausada e uma outra atividade
está sendo resumida(Resumed);

onStop() — Chamado quando a atividade não está mais visível
para o usuário;

onDestroy() — Chamado antes da atividade ser destruida pelo
sistema(Ou manualmente ou pelo sistema
para economizar memória)

onRestart() — Chamado quando a atividade foi
parada(Stopped) e restartada novamente;
Exemplo
 Exemplo
   Aula02_Lifecycle.zip
 Trecho relevante
     @Override                                              Tratar os eventos:
     protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);             • Sleep
            Log.d( TAG, "onCreate()");                      • Home Buttom
            setContentView(R.layout.main);
     }                                                      • Orientação
     @Override
     protected void onPause() {
            super.onPause();
            Log.d(TAG, "onPause()");
     }

     @Override
     protected void onResume() {
            super.onResume();
            Log.d(TAG, "onResume()");
     }
Importante...
1 - Sempre fazer quaisquer chamada(s) a findViewById, sempre depois de inflar o Layout
          Ex:

          setContentView(R.layout.main);
          TextView textView = (TextView) findViewById(R.id.textView);



2 – Declarar no arquivo AndroidManifest.xml a Activity criada, conforme exemplo Abaixo:
Tratando Mudanças de Configuração
• A configuração de um dispositivo pode mudar em tempo de
  execução. Possíveis mudanças são:
   – Orientação da Tela;
   – Disponibilidade do Teclado;
   – Alteração do Idioma;
• Quando uma mudança de configuração Acontece, o Android
  recria a atividade, chamando:
   – onDestroy() seguido de onCreate().
onSaveInstanceState e
            onRestoreInstanceState

 Sua aplicação deve estar apta a reiniciar sem perder os dados
  do usuário ou estado.
 O Android fornece os métodos onSaveInstanceState e
  onRestoreInstanceState para salvar as informações de estado.
  Uma maneira bem comum de guardar suas informações é
  fazer da seguinte forma:
   • Salvar as variáveis de instancia(Somente o necessário) no
     método onSaveInstanceState;
   • Após o evento de mudança, Recuperar as varáveis ou no
     método onCreate ou no método onRestoreInstanceState;
Exemplo
Perceba que existe um if        @Override
                                public void onCreate(Bundle savedInstanceState) {
dentro do método onCreate
                                  super.onCreate (savedInstanceState);
testando se o bundle é nullo.     if( savedInstanceState != null ){
Quando acontecer de não ser            // recupere os valores do bundle
nulo, possivelmente houve um      }
evento de mudança de            }
                                @Override
configuração.
                                public void onSaveInstanceState(Bundle savedInstanceState) {
                                   super.onSaveInstanceState(savedInstanceState);
                                    savedInstanceState.putString("MyInstanceVariable", variable);
                                }
                                @Override
                                public void onRestoreInstanceState(Bundle savedInstanceState) {
                                    super.onRestoreInstanceState(savedInstanceState);
                                    variable = savedInstanceState.getString("MyInstanceVariable");
                                }
Recuperando a Activity mas Pensando
            no usuário.
Algumas vezes podemos encontrar situações em
que reiniciar a aplicação e recuperar uma porção
de informação pode ser algo custoso, nesse caso
podemos pensar nas seguintes alternativas :

  Manter um objeto durante uma mudança de
   configuração;
  Tratar a mudança de Configuração na própria
   Atividade.
Mantendo um Objeto durante uma
      mudança de configuração

Para reter um objeto durante uma mudança de
configuração, basta :
  Sobrescrever o método
   onRetainNonConfigurationInstance() para retornar o
   objeto que nos gostariamos de manter;
  Quando a atividade é criada novamente, bata chamar
   o método getLastNonConfigurationInstance() para
   recuperar o objeto.
Tratando você mesmo a mudança de
            Configuração

Isso vai acontecer nos casos em que:
• Você não precisa atualizar nenhum recurso;
• Você possui uma limitação de desempenho;
Mas cuidado, essa técnica deve ser usada em ultimo
estágio, e ela não é recomendada para a maioria das
aplicações.
Exemplo
 Alterar o exemplo abaixo
para fazer uso do método:
getLastNonConfigurationInstance()

Ex: Aula02_ConfigChange.zip



             Tratar os eventos:
             • LandScape
             • Portrait
Tratando você mesmo a mudança de
              Configuração

Para declarar que você vai tratar as mudanças de configuração
basta fazer :
   – Declarar o atributo android:configChanges dentro da tag
      <activity> do AndroidManifest.xml;
   – Declarar qual ou quais mudanças você quer tratar por sua
      propria conta, por exemplo: orientation, keyboardHidden;
   – Sobrescrever o método
      onConfigurationChanged(Configuration config);
Exemplo
 Alterar o exemplo abaixo
para fazer uso de
Android:ConfigChanges.

Ex: Aula02_ConfigChange.zip


              Tratar os eventos:
              • LandScape
              • Portrait
Aplicando Temas

No arquivo AndroidManifest.xml
você coloca o tema:
Aplicando Estilos
No arquivo AndroidManifest.xml você declara o estilo :



Dentro da pasta values, basta criar o arquivo style.xml com o conteúdo :
Activity como Dialogo
È possivel fazer com que uma activity se pareça
com um dialog, apenas trocando o estilo no
Arquivo Android AndroidManifest.xml.

Ex:

Aula02_ActivityAsDialog.zip


Trecho relevante :

<application
   android:allowBackup="true"
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@android:style/Theme.Dialog" >
Dialogos
 Pequena janela que pede do usuario alguma decisão ou
  pede a ele alguma informação Adicional.
Subclasses de “Dialog”
 Evite instanciar a classe Dialog diretamente, ao invés você
  deve utilizar uma de suas subclasses :

   – AlertDialog
   – DatePickerDialog
   – TimePickerDialog


 Ou se precisar criar um Dialog ainda mais personalizado, você
  deve utilizar DialogFragment;
   Analisar o exemplo Aula2_DisplayingADialog.zip.

   Maiores informações acesse: pagina oficial.
Entendendo Intents
 Representam uma descrição abstrata de uma
  operação.
 Pode ser utilizado pelo método startActivity()
  para disparar uma mensagem de broadcast que e
  executada por qualquer broadcast receiver
  interessado.
 Pode ser utilizado pelo método
  bindService(Intent, ServiceConnection, int) para
  comunicar com qualquer “service” em
  background.
Estrutura fundamental de um Intent
No geral um “intent” é composto por duas partes fundamentais, a ação e os dados.

(Action) A ação geral a ser executada, exemplo :
            •   ACTION_VIEW
            •   ACTION_EDIT
            •   ACTION_MAIN



(Data) A informação a ser trabalhada, tal como uma pessoa no registro de banco de
dados, essas inforações são expressas através de uma URI. Alguns exemplos de pares
action/data são:
            •   ACTION_VIEW content://contacts/people/1
            •   ACTION_DIAL content://contacts/people/1
            •   ACTION_VIEW tel:123
            •   ACTION_DIAL tel:123
            •   ACTION_EDIT content://contacts/people/1
            •   ACTION_VIEW content://contacts/people/
            •   ACTION_VIEW content://contacts/N

Consultar a pagina do google sobre intent.
Outros atributos de um intent
 category - fornece algumas informações adicionais a respeito a ação a ser
  executada, por exemplo:
        CATEGORY_LAUNCHER significa que deve aparecer como uma Top-
        Level application, normalmente como um icone da lista de
        programas(default).
        CATEGORY_ALTERNATIVE significa que deve aparecer na lista de
        programas alternativos.
 type - Especifica um tipo explicito (um tipo MIME) para os dados sendo
  passsados.
 component - Expecifica um nome explicito ao componente.
 extras - Um Bundle com informações adicionais, no caso de um email
  podemos incluir aqui partes como o corpo do email, assunto, remetende e
  destinatário.
Chamando outras Activities

No android, você pode navegar entre activities
 usando “intents” das seguintes formas:
  Passando apenas a ação (Forma implicita) :

  Intent intent = new Intent("com.example.callinganotheractivity.SecondActivity");
  startActivity( intent );

  Dentro do mesmo projeto, então podemos fazer (Forma explicita):

  Intent intent = new Intent( this, SecondActivity.class );
  startActivity( intent );
Passando e recuperando parametros
               entre Activities
 É possivel passar um “bundle” com os parametros para a activity
  sendo chamada, Além disso, é possivel esperar pelo resultado de
  outra activity utilizando o método startActivityForResult.

 Com startActivityForResult você chama uma outra atividade
  esperando por um retorno.
 No callback onActivityResult() você recupera o valor fornecido
  pela activity chamada.

Analisar o exemplo: Aula02_CallingAnotherActivity.zip
Intent Filters

Ajuda o android a saber se o componente
 atende ao intent :

<intent-filter>
         <action android:name="com.example.callinganotheractivity.SecondActivity" />
         <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Intent Resolution
Somente três aspectos são consultados
 quando o android precisar resolver o intent
 informado, são eles:

  – action
  – data (both URI and data type)
  – category
Notifications
È possivel notificar o usuário sobre uma
 informação importante utilizando “Toasts”.

  Ex: Toast.makeText(this, “Texto para o usuário”,
      Toast.LENGTH_SHORT).show();




  Contudo, a notificação se perde depois de alguns segundos, uma segunda
forma ainda mais persistente e elegante é o sistema de notificações do
android fornecido pela classe NotificationManager.
NotificationManager
Classe que serve para notificar que alguma
 coisa aconteceu em background;
As notificações podem assumir diferentes
 formas
  - Um ícone persistente na status bar que ao ser clicado pode disparar um intent;
  - Ligando e desligando LEDs no device;
  - Alerta com o flash da câmera, tocando um som ou vibração.

  Analisar o exemplo: Aula02_DisplayANotification.zip
Conceitos úteis

NotificationManager é a classe principal para
 iteragir com o serviço de notificações do android.
Um objeto “PendingIntent” ajuda a realizar uma
 ação em nome do aplicativo, muitas vezes em um
 momento posterior, independentemente se a
 aplicação esta ou não rodando.
Referencias

 Beginning Android™ Application Development, Wei-Meng Lee, Wiley 2011.
 Android Training : http://developer.android.com/training/index.html.

Atividades e Intenções (Android)

  • 1.
  • 2.
    Activities e Intents NatanaelFonseca Arquiteto de Software Site Pessoal: www.natanaelfonseca.com.br
  • 3.
    Ementa  O queé uma Activity(Atividade);  Como aplicar estilos e temas;  Como exibir uma Activity como um dialogo;  Entendendo Intents(Intenções);  Como realizar link de activities através de intents;  Intent filters(Filtro de Intenções);  Notifications(Notificações);
  • 4.
    O que éuma Activity  Uma aplicação pode ter uma ou mais Atividades;  Serve para incluir a lógica de iteração com o usuário;  São sempre declaradas no arquivo AndroidManifest.xml;  Responsáveis por “inflar” o layout xml correspondente a UI;  Possui um ciclo de vida;  Normalmente trabalham de modo que ou estão ativas e visíveis ou inativas numa stack;
  • 5.
    Ciclo de Vidade uma Activity onCreate() — Chamado quando a atividade é criada ela primeira vez; onStart() — Chamado quando a atividade se torna visível para o usuário; onResume() — Chamado quando a atividade inicia a iteração com o usuário; onPause() — Chamado quando a atividade corrente está sendo pausada e uma outra atividade está sendo resumida(Resumed); onStop() — Chamado quando a atividade não está mais visível para o usuário; onDestroy() — Chamado antes da atividade ser destruida pelo sistema(Ou manualmente ou pelo sistema para economizar memória) onRestart() — Chamado quando a atividade foi parada(Stopped) e restartada novamente;
  • 6.
    Exemplo  Exemplo Aula02_Lifecycle.zip  Trecho relevante @Override Tratar os eventos: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); • Sleep Log.d( TAG, "onCreate()"); • Home Buttom setContentView(R.layout.main); } • Orientação @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause()"); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume()"); }
  • 7.
    Importante... 1 - Semprefazer quaisquer chamada(s) a findViewById, sempre depois de inflar o Layout Ex: setContentView(R.layout.main); TextView textView = (TextView) findViewById(R.id.textView); 2 – Declarar no arquivo AndroidManifest.xml a Activity criada, conforme exemplo Abaixo:
  • 8.
    Tratando Mudanças deConfiguração • A configuração de um dispositivo pode mudar em tempo de execução. Possíveis mudanças são: – Orientação da Tela; – Disponibilidade do Teclado; – Alteração do Idioma; • Quando uma mudança de configuração Acontece, o Android recria a atividade, chamando: – onDestroy() seguido de onCreate().
  • 9.
    onSaveInstanceState e onRestoreInstanceState  Sua aplicação deve estar apta a reiniciar sem perder os dados do usuário ou estado.  O Android fornece os métodos onSaveInstanceState e onRestoreInstanceState para salvar as informações de estado. Uma maneira bem comum de guardar suas informações é fazer da seguinte forma: • Salvar as variáveis de instancia(Somente o necessário) no método onSaveInstanceState; • Após o evento de mudança, Recuperar as varáveis ou no método onCreate ou no método onRestoreInstanceState;
  • 10.
    Exemplo Perceba que existeum if @Override public void onCreate(Bundle savedInstanceState) { dentro do método onCreate super.onCreate (savedInstanceState); testando se o bundle é nullo. if( savedInstanceState != null ){ Quando acontecer de não ser // recupere os valores do bundle nulo, possivelmente houve um } evento de mudança de } @Override configuração. public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); savedInstanceState.putString("MyInstanceVariable", variable); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); variable = savedInstanceState.getString("MyInstanceVariable"); }
  • 11.
    Recuperando a Activitymas Pensando no usuário. Algumas vezes podemos encontrar situações em que reiniciar a aplicação e recuperar uma porção de informação pode ser algo custoso, nesse caso podemos pensar nas seguintes alternativas : Manter um objeto durante uma mudança de configuração; Tratar a mudança de Configuração na própria Atividade.
  • 12.
    Mantendo um Objetodurante uma mudança de configuração Para reter um objeto durante uma mudança de configuração, basta : Sobrescrever o método onRetainNonConfigurationInstance() para retornar o objeto que nos gostariamos de manter; Quando a atividade é criada novamente, bata chamar o método getLastNonConfigurationInstance() para recuperar o objeto.
  • 13.
    Tratando você mesmoa mudança de Configuração Isso vai acontecer nos casos em que: • Você não precisa atualizar nenhum recurso; • Você possui uma limitação de desempenho; Mas cuidado, essa técnica deve ser usada em ultimo estágio, e ela não é recomendada para a maioria das aplicações.
  • 14.
    Exemplo  Alterar oexemplo abaixo para fazer uso do método: getLastNonConfigurationInstance() Ex: Aula02_ConfigChange.zip Tratar os eventos: • LandScape • Portrait
  • 15.
    Tratando você mesmoa mudança de Configuração Para declarar que você vai tratar as mudanças de configuração basta fazer : – Declarar o atributo android:configChanges dentro da tag <activity> do AndroidManifest.xml; – Declarar qual ou quais mudanças você quer tratar por sua propria conta, por exemplo: orientation, keyboardHidden; – Sobrescrever o método onConfigurationChanged(Configuration config);
  • 16.
    Exemplo  Alterar oexemplo abaixo para fazer uso de Android:ConfigChanges. Ex: Aula02_ConfigChange.zip Tratar os eventos: • LandScape • Portrait
  • 17.
    Aplicando Temas No arquivoAndroidManifest.xml você coloca o tema:
  • 18.
    Aplicando Estilos No arquivoAndroidManifest.xml você declara o estilo : Dentro da pasta values, basta criar o arquivo style.xml com o conteúdo :
  • 19.
    Activity como Dialogo Èpossivel fazer com que uma activity se pareça com um dialog, apenas trocando o estilo no Arquivo Android AndroidManifest.xml. Ex: Aula02_ActivityAsDialog.zip Trecho relevante : <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@android:style/Theme.Dialog" >
  • 20.
    Dialogos  Pequena janelaque pede do usuario alguma decisão ou pede a ele alguma informação Adicional.
  • 21.
    Subclasses de “Dialog” Evite instanciar a classe Dialog diretamente, ao invés você deve utilizar uma de suas subclasses : – AlertDialog – DatePickerDialog – TimePickerDialog  Ou se precisar criar um Dialog ainda mais personalizado, você deve utilizar DialogFragment; Analisar o exemplo Aula2_DisplayingADialog.zip. Maiores informações acesse: pagina oficial.
  • 22.
    Entendendo Intents  Representamuma descrição abstrata de uma operação.  Pode ser utilizado pelo método startActivity() para disparar uma mensagem de broadcast que e executada por qualquer broadcast receiver interessado.  Pode ser utilizado pelo método bindService(Intent, ServiceConnection, int) para comunicar com qualquer “service” em background.
  • 23.
    Estrutura fundamental deum Intent No geral um “intent” é composto por duas partes fundamentais, a ação e os dados. (Action) A ação geral a ser executada, exemplo : • ACTION_VIEW • ACTION_EDIT • ACTION_MAIN (Data) A informação a ser trabalhada, tal como uma pessoa no registro de banco de dados, essas inforações são expressas através de uma URI. Alguns exemplos de pares action/data são: • ACTION_VIEW content://contacts/people/1 • ACTION_DIAL content://contacts/people/1 • ACTION_VIEW tel:123 • ACTION_DIAL tel:123 • ACTION_EDIT content://contacts/people/1 • ACTION_VIEW content://contacts/people/ • ACTION_VIEW content://contacts/N Consultar a pagina do google sobre intent.
  • 24.
    Outros atributos deum intent  category - fornece algumas informações adicionais a respeito a ação a ser executada, por exemplo: CATEGORY_LAUNCHER significa que deve aparecer como uma Top- Level application, normalmente como um icone da lista de programas(default). CATEGORY_ALTERNATIVE significa que deve aparecer na lista de programas alternativos.  type - Especifica um tipo explicito (um tipo MIME) para os dados sendo passsados.  component - Expecifica um nome explicito ao componente.  extras - Um Bundle com informações adicionais, no caso de um email podemos incluir aqui partes como o corpo do email, assunto, remetende e destinatário.
  • 25.
    Chamando outras Activities Noandroid, você pode navegar entre activities usando “intents” das seguintes formas: Passando apenas a ação (Forma implicita) : Intent intent = new Intent("com.example.callinganotheractivity.SecondActivity"); startActivity( intent ); Dentro do mesmo projeto, então podemos fazer (Forma explicita): Intent intent = new Intent( this, SecondActivity.class ); startActivity( intent );
  • 26.
    Passando e recuperandoparametros entre Activities  É possivel passar um “bundle” com os parametros para a activity sendo chamada, Além disso, é possivel esperar pelo resultado de outra activity utilizando o método startActivityForResult.  Com startActivityForResult você chama uma outra atividade esperando por um retorno.  No callback onActivityResult() você recupera o valor fornecido pela activity chamada. Analisar o exemplo: Aula02_CallingAnotherActivity.zip
  • 27.
    Intent Filters Ajuda oandroid a saber se o componente atende ao intent : <intent-filter> <action android:name="com.example.callinganotheractivity.SecondActivity" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
  • 28.
    Intent Resolution Somente trêsaspectos são consultados quando o android precisar resolver o intent informado, são eles: – action – data (both URI and data type) – category
  • 29.
    Notifications È possivel notificaro usuário sobre uma informação importante utilizando “Toasts”. Ex: Toast.makeText(this, “Texto para o usuário”, Toast.LENGTH_SHORT).show(); Contudo, a notificação se perde depois de alguns segundos, uma segunda forma ainda mais persistente e elegante é o sistema de notificações do android fornecido pela classe NotificationManager.
  • 30.
    NotificationManager Classe que servepara notificar que alguma coisa aconteceu em background; As notificações podem assumir diferentes formas - Um ícone persistente na status bar que ao ser clicado pode disparar um intent; - Ligando e desligando LEDs no device; - Alerta com o flash da câmera, tocando um som ou vibração. Analisar o exemplo: Aula02_DisplayANotification.zip
  • 31.
    Conceitos úteis NotificationManager éa classe principal para iteragir com o serviço de notificações do android. Um objeto “PendingIntent” ajuda a realizar uma ação em nome do aplicativo, muitas vezes em um momento posterior, independentemente se a aplicação esta ou não rodando.
  • 32.
    Referencias  Beginning Android™Application Development, Wei-Meng Lee, Wiley 2011.  Android Training : http://developer.android.com/training/index.html.