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
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)
Evento
Mensagem
BroadcastReceiver1
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) { // ...
} }
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");
Broadcast Receiver
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
Mensagens broadcast do sistema
Mensagens broadcast enviadas apenas pelo sistema
Não podem ser enviadas pelo método sendBroadcast()
* Requer permissão android.permission.RECEIVE_BOOT_COMPLETED
** Não podem ser usados com <intent-filter> serão mostrados em breve
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_DISCONNECTEDCarregador desconectado
Mensagens broadcast do sistema
** Não podem ser usados com <intent-filter> serão mostrados em breve
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.
Broadcast de sistema
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
Tente mudar o papel de parede no emulador
Menu > Wallpaper > Wallpapers
Alguns outros eventos importantes
Evento Constante Descrição
android.intent.action.BATTERY_CHANGED Aviso transmitido contendo o estado de carga, nível e outras informações sobre a bateria.
android.intent.action.BATTERY_LOW Indica condição de bateria fraca no aparelho.
android.intent.action.BATTERY_OKAY Indica que a bateria está agora bem depois de ter sido baixo. android.intent.action.BOOT_COMPLETED Este é transmitido uma vez, após o boot ter finalizado. android.intent.action.BUG_REPORT Mostrar atividade para relatar um bug.
android.intent.action.CALL Efetuar uma chamada especificada pelos dados.
android.intent.action.CALL_BUTTON O usuário pressionou o botão "call" para ir para o discador ou outro UI apropriado para fazer uma chamada.
android.intent.action.DATE_CHANGED A data foi alterada.
Exemplo
public
class
MyReceiver
extends
BroadcastReceiver
{
@Override
public
void
onReceive
(
Context
context
,
Intent
intent
)
{
Toast
.
makeText
(
context
,
"Intent Detected."
,
Toast
.
LENGTH_LONG
).
show
();
}
}
<application
android:icon
=
"@drawable/ic_launcher"
android:label
=
"@string/app_name"
android:theme
=
"@style/AppTheme"
>
<receiver
android:name
=
"MyReceiver"
>
<intent-filter>
<action
android:name
=
"android.intent.action.BOOT_COMPLETED"
>
</action>
</intent-filter>
</receiver>
Método para Broadcast customizada
// broadcast a custom intent.
public
void
broadcastIntent
(
View
view
)
{
Intent
intent
=
new
Intent
();
intent
.
setAction
(
"com.suaaplicacao.CUSTOM_INTENT"
);
sendBroadcast
(
intent
);
}
<receiver
android:name
=
"MyReceiver"
>
<intent-filter>
<action
android:name
=
"com.suaaplicacao.CUSTOM_INTENT"
>
</action>
</intent-filter>
Configuração de receivers via código
Indicado quando um receiver deve executar apenas
quando uma activity 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
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
Exemplo de aplicação
multithread
Classe Thread e Interface
Runnable
Métodos da classe Thread
* Cuidado ao chamar métodos bloqueantes em threads que recebem callbacks, pois estes devem retornar rapidamente.