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