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
Intent filter e permissões
 Caso um <intent-filter> não seja definido para uma
activity apenas a própria aplicação poderá iniciá-la
 Mas é possível exportá-la
<activity ... android:exported=“true” > ...
 Mesmo assim, é necessário que a aplicação que queira
iniciá-la use Intent.setComponentName() ou
setClassName() e conheça o nome da classe completo
• Exemplo: “com.example.application.ActivityName”
 O uso de <intent-filter> no manifest exporta a activity
automaticamente
 Usar setClassName() ou setComponentName() para
iniciar uma activity não exportada lançará uma
SecurityException
14
Intent filter e permissões
 É possível criar sua própria permissão
<manifest ... >
<permission android:label="@string/..."
android:name="application_package.PERMISSION_NAME" />
<application ... >
<activity ...
android:exported="true"
android:permission="application_package.PERMISSION_NAME" >
</activity>
</application>
</manifest>
 Se uma aplicação diferente quiser acessar esta activity
será necessário usar um elemento <uses-permission>
para a permissão definida pela aplicação
<uses-permission android:name="application_package.PERMISSION_NAME"/>
15
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>
16
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
17
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.
18
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);
19
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
20
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 21
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
22
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.
23
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
24
Threads
 São linhas ou fluxos de execução de código que rodam
em “paralelo” numa mesma aplicação
 Usadas para executar tarefas independentes entre si.
 Sempre há uma thread inicial ou principal
 Interface gráfica sempre executa nesta thread
 Exemplo:
 Uma aplicação pode usar 3 threads, assim distribuídas:
• Interface gráfica
• Reprodução de música
• Download de arquivo da Internet
25
Exemplo de aplicação multithread
26
Classe Thread e Interface Runnable





Thread.sleep
Thread.start
Thread.join
Runnable.run()
Thread.isAlive()
27
Criação de threads
28
Threads e interfaces gráficas
29
Serviços
 Usado para executar tarefas em segundo plano
 Estas tarefas não possuem um tempo definido de
execução (podendo ser demoradas)
 Não deve iniciar activities: use notificações (em breve)
 Configuração no AndroidManifest.xml
<application ... >
<service android:name="ServiceName">
<intent-filter>
<action android:name="com.example.serviceapp.ACTION" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
</application>
 Caso se queira iniciar o serviço de outra aplicação sem
um <intent-filter> deve-se usar android:exported="true"
30
Formas de iniciar um serviço
 Pode ser iniciado de dentro de activity, broadcast
receiver ou outro serviço
 Duas formas
 Desacoplado: serviço é iniciado e fica independente do
contexto (activity, receiver ou serviço) chamador
 Conectado: serviço é iniciado mas fica associado ao
contexto chamador
 Métodos (classe Context)
Método
Descrição
startService(Intent)
Inicia um serviço desacoplado
bindService(Intent, ServiceConnection, flags)
Inicia um serviço conectado. O segundo
parâmetro é um objeto com métodos
callbacks para notificar conexão e desconexão
31
Ciclo de vida de um serviço
32
Classe Service
 Classe base para qualquer serviço
public class MyService extends Service {
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
// Inicializar varíaves e criar uma thread (opcional)
}
@Override
public void onDestroy() {
super.onDestroy();
// Terminar a thread aqui, caso esteja rodando
}
}
33
Compatibilidade com versões anteriores
// Método onStart antigo que é chamado nas
// plataformas anteriores a 2.0
@Override
public void onStart(Intent intent, int startId) {
processaStart(intent);
}
// Método chamado a partir da plataforma 2.0
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
processaStart(intent);
// Retorne isto para que o serviço rode até ser
// explicitamente terminado
return START_STICKY;
}
// Método para onde onStart e onStartCommand converge
protected void processaStart(Intent intent) {
// Processa independente de versão de plataforma
}
34
Inicialização de serviços desacoplados
 Método startService(Intent)
 Inicia o serviço determinado pela intent.
 O serviço roda independente do chamador e por tempo
indeterminado
 Se o contexto chamador terminar o serviço continua
rodando normalmente
 Pode ser chamado inúmeras vezes
• Apenas na primeira o callback onCreate() é chamado
• O método onStart/onStartCommand sempre é chamado
 Método stopService(Intent)
 Termina o serviço chamando onDestroy()
 Não importa quantas vezes startService foi chamado,
uma única chamada a este encerra o serviço
35
Como e quando terminar serviços
 Método stopSelf()
 Chamar quando serviço terminar o processamento
 Boa prática para evitar consumo de bateria
 Caso queira que o serviço volte a executar de forma
automática no futuro usar AlarmManager (em breve)
36
Serviços - Exercício 24
 Crie um projeto chamado ServiceTest sem activitty
 Adicione uma classe ServiceTest que extenda Service
 Implemente onCreate() e onDestroy() escrevendo no
LogCat uma mensagem dizendo em qual deles está
 No manifest, coloque um <intent-filter> dentro de
<service> com o seguinte par action-category:
 "com.example.servicetest.SERVICE“
 "android.intent.category.DEFAULT"
 No projeto ReceiverTest, adicione as seguintes linhas
no final do método WallpaperReceiver.onReceive()
intent = new Intent("com.example.servicetest.SERVICE");
context.startService(intent);
 Instale, mude o papel de parede e olhe o LogCat
37
Serviços e threads – Exercício 25
 Thread no serviço
38
Serviços e permissões – Exercício 26
 Permissoes proprias
39
Uso de serviços acoplados
40
Notificações
41
AlarmManager
42
Handler
43
Download

intent-filter - samples-android