Curso de Android
Fevereiro de 2011
Cristiano Expedito Ribeiro
Fabrício Firmino de Faria
Agenda das próximas aulas [excluir]







Intent filter
BroadcastReceiver, Threads, Services e Notification
AlarmManager e Handler
Banco de Dados e ContentProvider
Mapas de GPS
Sockets e Web Services
Projeto
2
Agenda da Aula 2
 Intent filter
 Aplicações em segundo plano
 BroadcastReceiver
 Threads e Services
 Notification
 AlarmManager
 Handler
 Banco de Dados
 Introdução: Tabelas e SQL
 SQLite
 ContentProvider
 Mapas de GPS
3
Intent Filter
 Criação de filtros que determinam quais Intents devem
ser executadas para cada mensagem
<activity android:name=".HelloActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
 Action = MAIN
 Diz que activity é um ponto de partida, semelhante ao
public static void main() da Java
 Category = LAUNCHER
 Indica que o ícone da activity deverá aparecer na tela
pode ser aberta pelo usuário
4
IntentFilter - Exercício 17
 Volte ao projeto LayoutSamples
 Abra o AndroidManifest.xml
• Remova o elemento <action> e salve
• Tente rodar a aplicação pelo eclipse
• Tente rodar a aplicação pelo menu do emulador
• Desfaça a remoção (Ctrl+Z)
• Remove o elemento <category> e salve
• Tente rodar a aplicação
• Desfaça a remoção (Ctrl+Z)
• Tente rodar a aplicação. Apenas com os dois elementos
que a aplicação rodará normalmente.
5
Ações de Intent úteis
 Lembra das ações “nativas” do Android?
Action
URI - chamar Uri.parse(uri)
Descrição
ACTION_VIEW
http://www.gmail.com
Abre browser na página
ACTION_VIEW
ACTION_EDIT
content://com.android.contacts/contacts/1
Mostra ou edita o contato
solicitado
ACTION_VIEW
geo:0,0?q=Presidente+Vargas,Rio+de+Ja
neiro
Busca no Google Maps
ACTION_CALL
ACTION_DIAL
tel:12345678
Liga ou apenas disca para o
número
ACTION_INSERT
content://com.android.contacts/contacts
Abre activity padrão para
inserir contatos
ACTION_PICK
ContactsContract.Contacts.CONTENT_URI
Abre lista de contatos do
celular
ACTION_SET_WALLPAPER
-
Abre lista para escolha de
papéis de parede
6
Ações de Intent – Exercício 18
 Crie um novo projeto chamado IntentFilterTest
 Experimente chamar activities usando a tabela anterior
 Exemplo:
Uri uri = Uri.parse("content://com.android.contacts/contacts");
Intent intent = new Intent(Intent.ACTION_INSERT, uri);
startActivity(intent);
intent = new Intent(Intent.ACTION_SET_WALLPAPER);
startActivity(intent);
 Experimente também:
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY, "Maria");
startActivity(intent);
 Sim, você pode passar parâmetros via Intent,
dependendo de qual ação está sendo executada!
7
Ações de Intent – Exercício 18
 ACTION_CALL não irá funcionar pois é necessário
pedir permissão através do AndroidManifest.xml
• Adicione esta permissão e tente novamente
<uses-permission android:name="android.permission.CALL_PHONE”/>
 Outras permissões úteis
android.permission.READ_CONTACTS
android.permission.VIBRATE
android.permission.INTERNET
android.permission.BATTERY_STATS
android.permission.BLUETOOTH
android.permission.CAMERA
android.permission.REBOOT
android.permission.SEND_SMS
 Além disso, para usar o Google Maps é necessário
rodar o emulador com Google Maps.
8
Categorias e parâmetros para Intent
 Algumas vezes Ação e URI não são suficientes
 É possível adicionar tantas categorias e parâmetros
extras quanto forem necessários, além de outros dados:
Método da Intent
Descrição
addCategory(String)
Adiciona mais uma categoria à Intent
putExtra(String, ...)
Adiciona um parâmetro à Intent
setData(Uri)
Define o Uri. Equivalente ao parâmetro URI do construtor
setType(String)
Define o tipo MIME: text/plain, image/jpeg, etc
setFlags(int)
addFlags(int)
Define os flags da Intent. Um flag útil é o FLAG_ACTIVITY_NEW_TASK,
que faz a activity iniciar numa nova tarefa
setAction(String)
Define a ação desta intent. Note que, diferentemente de categorias e
extras, apenas uma ação pode ser definida por intent.
 Os métodos setData() e setType() são antagônicos, ou
seja, chamar um deles implica em limpar o outro.
9
Substituindo ações nativas
 Tecla Home
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
 Tecla discar (call)
<action android:name="android.intent.action.CALL_BUTTON" />
<category android:name="android.intent.category.DEFAULT" />
 Intent.ACTION_SEARCH
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
 Intent.ACTION_WEB_SEARCH
<action android:name="android.intent.action.WEB_SEARCH" />
<category android:name="android.intent.category.DEFAULT" />
10
Ações nativas - Exercícios 19 e 20
 Exercício 19
 Crie um projeto IntentFilterNativeSubst
 Modifique o manifest e rode a aplicação para cada
exemplo do slide anterior
 Exercício 20
 Após o último exemplo (web search) edite o projeto
IntentFilterTest para chamar web search:
intent = new Intent(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY, "Maria");
startActivity(intent);
 Execute IntentFilterTest
 Veja que o emulador irá perguntar
qual aplicação executar
11
Ações e categorias próprias e filtragem
 Para criar as próprias ações e categorias, faça:
 Configurá-las no manifest usando <intent-filter>
 Criar a Intent e executá-la
• Isto pode ser feito na mesma aplicação ou não
 Filtragem
 Ao executar uma Intent, uma activity só rodará caso seu
intent-filter satisfaça a ação e todas as categorais
definidas na Intent.
 Exemplos:
• Considere intent-filter: ACAO1, CATEG1, CATEG2
1. Intent: ACAO1, CATEG1  Executa
2. Intent: ACAO1, CATEG1, CATEG2  Executa
3. Intent: ACAO1, CATEG3  Não executa!
12
Ações próprias e filtragem – Exercício 21
 No manifest de IntentFilterNativeSubst
<action android:name="com.example.intentfilter.nativesubst.ACTION" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.example.intentfilter.nativesubst.CATEG1" />
<category android:name="com.example.intentfilter.nativesubst.CATEG2" />
 Dê play na aplicação IntentFilterNativeSubst para
instalá-la, note que nada rodará na tela, pois não há
MAIN e LAUNCHER
 Em IntentFilterTest
intent = new Intent("com.example.intentfilter.nativesubst.ACTION");
intent.addCategory("com.example.intentfilter.nativesubst.CATEG1");
intent.addCategory("com.example.intentfilter.nativesubst.CATEG2");
startActivity(intent);
 Rode IntentFilterTest e IntentFilterNativeSubst rodará
 Remova CATEG2 do manifest e repita a operação...
13
BroadcastReceiver
 Chamado pelo Android para reagir a mensagens
broadcast
 Usado para executar tarefas rápidas em segundo plano
 Não interromper o usuário por meio de activities
 Use notificações! (Serão explicadas em breve)
 O que são mensagens broadcasts?
 São mensagens enviadas pelo Android quando ocorre
algum evento do sistema ou de uma aplicação
 Interceptada pelos BroadcastReceiver’s apropriados
• Definido pelos <intent-filter>
14
Tipos de broadcast
 Ordered ou Síncrono
 Os receivers são executados em sequência e a falha de
um interrompe o processamento dos demais
 Não está no escopo deste curso
 Normal ou Assíncrono
 Todos os receivers executam simultaneamente em
paralelo e de forma independente
 Método para disparar: Context.sendBroadcast(Intent)
BroadcastReceiver1
Evento
Mensagem
...
BroadcastReceiverN
15
Configurando um receiver
 É necessário adicionar o elemento <receiver> dentro
de <aplication> no AndroidManifest.xml
<receiver android:name="NomeReceiver">
<intent-filter>
<action android:name="com.example.broadcastreceiver.ACTION"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</receiver>
 Implementar uma classe filha de BroadcastReceiver
com o callback onReceive(Context, Intent)
public class NomeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// ...
}
}
 Atenção: onReceive deve retornar em menos de 10 s.
16
Disparando mensagens broadcast
 Criar uma Intent com a mensagem
 Enviar via Context.sendBroadcast(Intent)
 Context é uma classe base de activity, logo o método
pode ser chamado diretamente
Intent intent =
new Intent("com.example.broadcastreceiver.ACTION");
sendBroadcast(intent);
17
Broadcast Receiver – Exercício 22
 Crie um projeto chamado ReceiverTest
 Crie um broadcast conforme slide anterior
 Dentro do método onReceive escreva algo no log
 Edite o projeto IntentFilterTest para enviar o broadcast
18
Mensagens broadcast do sistema
 Mensagens broadcast enviadas apenas pelo sistema
 Não podem ser enviadas pelo método sendBroadcast()
android.intent.action
Condição de envio (pelo sistema)
WALLPAPER_CHANGED
Papel de parece alterado
BOOT_COMPLETED*
Sistema concluiu o bootstrap
ACTION_SHUTDOWN
Sistema está desligando (antes de desligar o aparelho)
BATTERY_CHANGED**
Estado de carga da bateria mudou
BATTERY_LOW
Estado de carga da bateria baixo
BATTERY_OKAY
Estado de carga da bateria voltou a níveis normais
ACTION_POWER_CONNECTED
Carregador conectado
ACTION_POWER_DISCONNECTED Carregador desconectado
* Requer permissão android.permission.RECEIVE_BOOT_COMPLETED
** Não podem ser usados com <intent-filter> serão mostrados em breve 19
Mensagens broadcast do sistema
android.intent.action.*
Condição de envio (pelo sistema)
TIME_SET
Data e/ou hora do sistema foram alterados
TIMEZONE_CHANGED
Fuso horário foi modificado
TIME_TICK**
Hora do sistema mudou normalmente (enviado a cada minuto)
SCREEN_ON
Tela do dispositivo acendeu (estava inativa, mas usuário ativou)
SCREEN_OFF
Tela do dispositivo apagou (normal para economizar bateria)
PACKAGE_ADDED
Uma nova aplicação foi instalada no dispositivo
PACKAGE_REMOVED
Uma aplicação foi removida do dispositivo
PACKAGE_REPLACED
Uma aplicação foi substituída. Normalmente por upgrade de versão.
PACKAGE_RESTARTED
Uma aplicação foi reiniciada, tendo seus processados terminados.
PACKAGE_DATA_CLEARED
Dados de uma aplicação foram apagados. Enviado após
PACKAGE_RESTARTED
** Não podem ser usados com <intent-filter> serão mostrados em breve
20
Broadcast de sistema – Exercício 23
 Adicione mais um receiver no projeto ReceiverTest
<receiver android:name="WallpaperReceiver">
<intent-filter>
<action android:name="android.intent.action.WALLPAPER_CHANGED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
 Adicione o seguinte no callback onReceive()
Log.i(this.getClass().getCanonicalName(), intent.getAction());
 Instale a aplicaçao
 Tenta mudar o papel de parede no emulador
 Menu > Wallpaper > Wallpapers
 Analise o LogCat.
21
Configuração de receivers via código
 Indicado quando um receiver deve executar apenas
quando uma acitivity está executando
 É possível registrar dinamicamente via código
 registerReceiver(BroadcastReceiver, Intent)
 unregisterReceiver(BroadcastReceiver)
 Recomendável:
 Registrar em Activity.onCreate() ou onResume()
 Desregistrar no Activity.onDestroy() ou onPause()
 Note que são necessários para actions TIME_TICK e
BATTERY_CHANGED da tabela
22
Threads
23
Download

intent-filter - samples-android