intent-filter - samples-android
Download
Report
Transcript intent-filter - samples-android
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