Programação para a Plataforma Android Aula 17. Broadcasts

Documentos relacionados
BroadcastReceiver. O que são mensagens broadcasts? Use notificações! (Serão explicadas em breve)

Desenvolvimento de um aplicativo básico usando o Google Android

Login. Criar uma nova Activity. Login. Luiz Eduardo Guarino de Vasconcelos

AlarmManager. Programação em Dispositivos Móveis (PDM) Centro de Cálculo Instituto Superior de Engenharia de Lisboa

Módulo 3 - Intenções. SECAP 2014 Prof. Rone Ilídio - UFSJ

Tutorial Android Speech

Provedores de Conteúdo

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS

Desenvolvimento com Android Studio. Aula 02 Widgets, Manipulação de Dados e Programação de Eventos

Módulo 2 - Novas Activities Android. Programação Orientada a Objetos Prof. Rone Ilídio - UFSJ

Comunicação entre A0vidades

Computação Móvel Conceitos Básicos do Android Ref. Capítulo 3

Programação para Dispositivos Móveis

Programação para a Plataforma Android Aula 16. Fragmentos

Android Activity. Ivan Nicoli

Firebase. Acesse o site Acesse o menu Go to Console. Acesse com uma conta Google ou crie uma conta.

Retrofit. Criar um novo projeto. Selecionar a API. Retrofit para consumir Web Service Luiz Eduardo Guarino de Vasconcelos

Programação para Android. Aula 08: Persistência de dados SQL

Apresentação de um Processo Cria4vo de Desenvolvimento de uma App Android. Realização de Dinâmica Hands- On para Construção de uma App Android

Primeira Aplicação Android Olá Mundo. Prof. Fellipe Aleixo

Google Android. SMS Short Message Service

Projeto GoHome Tutorial Sobre o serviço do Google Maps no Android

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

Prof: Ricardo Quintão Site:

Simulado de Linguagem de Programação Java

RESULUÇÃO DOS EXERCÍCIOS E INSTRUÇÕES DE DECISÃO (if{} e else{}) Profº André Aparecido da Silva Disponível em:

Programação para a Plataforma Android Aula 7. Mul$mídia

Android DEFINIÇÕES E CICLO DE VIDA. Prof. Dr. Joaquim assunção.

Desenv. Para Dispositivos Móveis. Prof. Clayton Almeida

Computação II - Java - Prova 1 Prof. Adriano Joaquim de Oliveira Cruz /05/13. Questão: Total Pontos: Gráu:

Casa do Código Livros para o programador Rua Vergueiro, º andar Vila Mariana São Paulo SP Brasil

Exercício de Estrutura de dados. Java Fila

Programação para Dispositivos Móveis. Banco de Dados (SQLite)

Programação para Dispositivos Móveis

PROPOSTA DE UM PADRÃO DE PROJETO PARA ANDROID UTILIZANDO A WEB

Algoritmos e Programação 2. Objetos e Classes em Java. Classes. Revisão. Definições de classes incluem (geralmente):

Computação II Orientação a Objetos

Desenvolvimento de um aplicativo básico usando o Google Android

ANDROID APRENDIZ. Um guia para iniciantes Crie seu primeiro aplicativo Android

Armazenamento de dados

TUTORIAL ANDROID ACTIVITY - CONSTRUÇÃO DE TELAS

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Desenvolvimento Android.

Linguagem de programação Java

Notification. Programação de Dispositivos Móveis. Mauro Lopes Carvalho Silva. Professor EBTT DAI Departamento de Informática Campus Monte Castelo

Universidade Federal de Uberlândia Faculdade de Computação Programação Orientada a Objetos II Prof. Fabiano Dorça. Padrão Observer (Observador)

Computação Móvel ActionBar e Temas (Ref. Cap. 5)

Introdução ao Android

Programação para Dispositivos Móveis

ALGORITMOS. Professor: Diego Oliveira. Aula 06 - Tipos Primitivos de Dados

Desenvolvimento de um aplicativo básico usando o Google Android

Introdução à Programação Android: LocationManager

Módulo 4 - Interface Gráfica Gerenciadores de Layout. Programação Orientada a Objetos Prof. Rone Ilídio - UFSJ

Linguagem de Programação II Implementação

Google Android. Broadcast Receiver

Armazenamento Persistente de Dados

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Aula 4. TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS 2014 Marcelo Henrique dos Santos -

Log, Ciclo de Vida e Diálogos. Prof. Fellipe Aleixo (fellipe.aleixo@ifrn.edu.br)

nome = n; cargo = c; salario = s; public void print() { System.out.println(nome cargo salario); public void aumento( double fator){

Computação Móvel Activity (Ref. Cap. 4)

4 TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS

Android Banco de Dados. Ivan Nicoli

Java RMI. RMI Remote Method Invocation. Chamadas Remotas de Procedimentos (RPC) RPC - Implementação

Implementando classes em C# Curso Técnico Integrado em Informática Fundamentos de Programação

CIÊNCIA DA COMPUTAÇÃO - LINGUAGEM DE PROGRAMAÇÃO II REVISÃO POO

Desenvolvimento para Android Prá9ca 2. Prof. Markus Endler

DESENVOLVIMENTO PARA DISPOSITIVOS MÓVEIS. PROFª. M.Sc. JULIANA H Q BENACCHIO

============================== Exemplo ListView MainActivity.java

Programação para Android. Aula 10: Acesso a câmera, sms e recursos do aparelho

CONCEITOS BÁSICOS DE ORIENTAÇÃO A OBJETOS PROF. ME. HÉLIO ESPERIDIÃO

JavaFX Classe de Controle e Eventos. Prof. Vicente Paulo de Camargo

Programação Java. - Herança e Polimorfismo - Marco Fagundes Marco Fagundes -

Transcrição:

Programação para a Plataforma Android Aula 17 Broadcasts O que são eventos de difusão? Como capturar eventos de chamadas telefônicas? Como verificar o estado da bateria? Como implementar receptores de eventos de difusão? O que são intenções assíncronas? O que são intenções pendentes?

Intenções de Difusão Intenções de Broadcast são entregues para todos os receptores de broadcast registrados no disposigvo Android. Por exemplo, quando uma chamada é recebida, todos os receptores desse Gpo de evento serão acordados para tratá lo. Qual a diferença entre receptores de broadcast e provedores de serviço?

Exemplos de Broadcast ACTION_BATTERY_LOW: um aviso que a bateria está quase descarregada. ACTION_HEADSET_PLUG: um fone de ouvido foi conectado (ou desconectado). ACTION_SCREEN_ON: a tela foi ligada. ACTION_TIMEZONE_CHANGED: o aparelho passou de um fuso para outro.

Recebendo Chamadas Chamadas telefônicas são capturadas como eventos de difusão (broadcast). Lendo números: Escreva uma aplicação que leia o número recebido em uma chamada, e o imprima na tela de log.

MyPhoneReceiver public class MyPhoneReceiver extends BroadcastReceiver { @Override public void onreceive(context context, Intent intent) { Bundle extras = intent.getextras(); if (extras!= null) { String state = extras.getstring(telephonymanager.extra_state); Log.w("DEBUG", state); if (state.equals(telephonymanager.extra_state_ringing)) { String phonenumber = extras.getstring(telephonymanager.extra_incoming_number); Log.w("DEBUG", phonenumber); MyPhoneReceiver.java

Broadcast Receivers não são agvidades Para usarmos nosso receptor, precisamos implementar uma agvidade. Toda aplicação possui uma agvidade. public class MainAcGvity extends AcGvity { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.acgvity_main); MainAcGvity.java Existe alguma relação entre o receptor de intenções, e essa atividade? Como "ligamos" o receptor de eventos de difusão?

O Manifesto <applicagon AndroidManifest.xml android:icon="@drawable/ic_launcher" android:label="@string/app_name" Como simular a android:theme="@style/apptheme" > <acgvity recepção de android:name=".mainacgvity" uma chamada? android:label="@string/gtle_acgvity_main" > <intent filter> <acgon android:name="android.intent.acgon.main" /> <category android:name="android.intent.category.launcher" /> </intent filter> </acgvity> <receiver android:name=".myphonereceiver" > <intent filter> <ac=on android:name="android.intent.ac=on.phone_state" > </ac=on> </intent filter> </receiver> </applicagon> <uses permission android:name="android.permission.read_phone_state" />

Controle de Emulação O plugin Android para Eclipse provê uma interface para a emissão de sinais ao emulador.

Estados de uma Chamada public class MyPhoneReceiver extends BroadcastReceiver { @Override public void onreceive(context context, Intent intent) { Bundle extras = intent.getextras(); if (extras!= null) { String state = extras.getstring(telephonymanager.extra_state); Log.w("DEBUG", state); if (state.equals(telephonymanager.extra_state_ringing)) { String phonenumber = extras.getstring(telephonymanager.extra_incoming_number); Log.w("DEBUG", phonenumber);

Encontrando seu Número public class MainAcGvity extends AcGvity { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.acgvity_main); TelephonyManager tm = (TelephonyManager) getsystemservice(telephony_service); String phonenumber = tm.getline1number(); Log.v("Phone_data", phonenumber == null? "No number" : phonenumber); MainAcGvity.java

Encontrando Informações de Operador MainAcGvity.java @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.acgvity_main); TelephonyManager tm = (TelephonyManager) getsystemservice(telephony_service); String phonenumber = tm.getline1number(); Log.v("Phone_data", phonenumber); String operatorname = tm.getnetworkoperatorname(); Log.v("Phone_data", operatorname); String operatorcode = tm.getnetworkoperator(); Log.v("Phone_data", operatorcode); String operatoriso = tm.getnetworkcountryiso(); Log.v("Phone_data", operatoriso);

Disparando Eventos de Difusão Além de receber intenções de difusão, o usuário pode também disparar esse Gpo de intenção. URIs são usados para qualificar essas intenções. Difundindo eventos: Defina um evento de difusão "br.com.dcc052. aula17" e implemente um receptor que o capture.

Registrando a Intenção no Manifesto <applicagon android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/apptheme" > <acgvity android:name=".mainacgvity" android:label="@string/gtle_acgvity_main" > <intent filter> <acgon android:name="android.intent.acgon.main" /> <category android:name="android.intent.category.launcher" /> </intent filter> </acgvity> <receiver android:name=".mybroadcastreceiver" > <intent filter> <ac=on android:name="br.com.dcc052.aula17" /> </intent filter> </receiver> </applicagon> AndroidManifest.xml Para que serve essa declaração? O que é esse nome? Como uma intenção do tipo "br.com. dcc052.aula17" Poderia ser disparada?

Difundindo uma Intenção MainAcGvity.java @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.acgvity_main); Intent intent = new Intent(); intent.setac=on("br.com.dcc052.aula17"); sendbroadcast(intent); O que está faltando implementar?

Definindo um Receptor MyBroadcastReceiver.java public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onreceive(context context, Intent intent) { Log.v("MyReceiver", intent.tostring()); O que deverá ser impresso?

Definindo um Receptor MyBroadcastReceiver.java public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onreceive(context context, Intent intent) { Log.v("MyReceiver", intent.tostring()); Como passar dados para o receptor? MyReceiver1 Intent { act=br.com.dcc052.aula17 flg=0x10 cmp=com.dcc052.aula17/.mybroadcastreceiver (has extras) }

Comunicando Dados @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.acgvity_main); Intent intent = new Intent(); intent.setacgon("br.com.dcc052.aula17"); intent.putextra("arg1", "Oi"); sendbroadcast(intent); MainAcGvity.java Será que é possível termos mais de um receptor para a mesma intenção difundida? MyBroadcastReceiver.java @Override public void onreceive(context context, Intent intent) { String arg = intent.getstringextra("arg1"); Log.v("MyReceiver0", arg);

MúlGplos Receptores Podemos registrar vários receptores para uma mesma intenção difundida. Cada receptor deve ser registrado no manifesto da aplicação. AndroidManifest.xml O que mais precisa ser implementado? <receiver android:name=".mybroadcastreceiver0" > <intent filter> <acgon android:name="br.com.dcc052.aula17" /> </intent filter> </receiver> <receiver android:name=".mybroadcastreceiver1" > <intent filter> <acgon android:name="br.com.dcc052.aula17" /> </intent filter> </receiver>

MúlGplos Receptores public class MyBroadcastReceiver1 extends BroadcastReceiver { @Override public void onreceive(context context, Intent intent) { Log.v("Receiver1", intent.tostring()); MyBroadcastReceiver1.java MyBroadcastReceiver0.java public class MyBroadcastReceiver0 extends BroadcastReceiver { @Override public void onreceive(context context, Intent intent) { String arg = intent.getstringextra("arg1"); Log.v("Receiver0", arg);

Intenções Assíncronas Algumas intenções, chamadas assíncronas (s3cky) não desaparecem tão logo são lançadas. É possível consultar a úlgma instância de uma intenção desse Gpo. Os eventos de bateria são anunciados via intenções assíncronas. Escreva uma atividade que determine o estado da bateria do dispositivo.

MainAcGvity.java Lendo o Estado da Bateria @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.acgvity_main); IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent baverystatus = this.registerreceiver(null, filter); int status = baverystatus.getintextra(baverymanager.extra_status, 1); boolean ischarging = status == BaveryManager.BATTERY_STATUS_CHARGING; Log.v("Bavery", "Estah carregando? " + ischarging); boolean isfull = status == BaveryManager.BATTERY_STATUS_FULL; Log.v("Bavery", "Estah carregado? " + isfull); int chargeplug = baverystatus.getintextra(baverymanager.extra_plugged, 1); boolean usbcharge = chargeplug == BaveryManager.BATTERY_PLUGGED_USB; Log.v("Bavery", "Estah carregando via USB? " + usbcharge); boolean accharge = chargeplug == BaveryManager.BATTERY_PLUGGED_AC; Log.v("Bavery", "Estah carregando via tomada? " + accharge);

MainAcGvity.java Lendo o Estado da Bateria @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.acgvity_main); IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent baverystatus = this.registerreceiver(null, filter); int status = baverystatus.getintextra(baverymanager.extra_status, 1); boolean ischarging = status == BaveryManager.BATTERY_STATUS_CHARGING; Log.v("Bavery", "Estah carregando? " + ischarging); Qual argumento E porque estamos boolean isfull = status == BaveryManager.BATTERY_STATUS_FULL; é esperado passando o objeto Log.v("Bavery", "Estah carregado? " + isfull); nessa posição? nulo aqui? int chargeplug = baverystatus.getintextra(baverymanager.extra_plugged, 1); boolean usbcharge = chargeplug == BaveryManager.BATTERY_PLUGGED_USB; Log.v("Bavery", "Estah carregando via USB? " + usbcharge); boolean accharge = chargeplug == BaveryManager.BATTERY_PLUGGED_AC; Log.v("Bavery", "Estah carregando via tomada? " + accharge);

MainAcGvity.java Lendo o Estado da Bateria @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); Como saber a Que informações setcontentview(r.layout.acgvity_main); quantidade de serão IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); energia que resta impressas? Intent baverystatus = this.registerreceiver(null, filter); na bateria? int status = baverystatus.getintextra(baverymanager.extra_status, 1); boolean ischarging = status == Ba\eryManager.BATTERY_STATUS_CHARGING; Log.v("Ba\ery", "Estah carregando? " + ischarging); boolean isfull = status == Ba\eryManager.BATTERY_STATUS_FULL; Log.v("Ba\ery", "Estah carregado? " + isfull); int chargeplug = ba\erystatus.getintextra(ba\erymanager.extra_plugged, 1); boolean usbcharge = chargeplug == Ba\eryManager.BATTERY_PLUGGED_USB; Log.v("Ba\ery", "Estah carregando via USB? " + usbcharge); boolean accharge = chargeplug == Ba\eryManager.BATTERY_PLUGGED_AC; Log.v("Ba\ery", "Estah carregando via tomada? " + accharge);

MainAcGvity.java Energia Restante @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.acgvity_main); Explique essa conta IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent baverystatus = this.registerreceiver(null, filter);... int level = ba\erystatus.getintextra(ba\erymanager.extra_level, 1); int scale = ba\erystatus.getintextra(ba\erymanager.extra_scale, 1); float ba\erypct = level / (float) scale; Log.v("Ba\ery", "Level = " + ba\erypct);

Intenções Pendentes É possível programar intenções para acontecer em algum momento no futuro. Esse Gpo de intenção chamase intenção pendente. Existe um controlador de eventos futuros, AlarmManager, que pode ser usado para disparar intenções pendentes. Definindo um alarme: Crie uma atividade que leia uma quantidade de segundos X, e programe uma intenção para X segundos no futuro.

alarm.xml Definindo um Layout <?xml version="1.0" encoding="u< 8"?> <LinearLayout xmlns:android="hbp://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientagon="ver3cal" > <EditText android:id="@+id/3me" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:focusable="true" android:inputtype="numberdecimal" > </EditText> <Buvon android:id="@+id/ok" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:onclick="startalert" android:text="@string/alarm_bubon_label" > </Buvon> Precisamos definir um receptor para a intenção futura. </LinearLayout>

Recebendo Intenções de Alarme MyAlarmReceiver.java public class MyAlarmReceiver extends BroadcastReceiver { @Override public void onreceive(context context, Intent intent) { Toast.makeText(context, context.getstring(r.string.alarm_fired_message), Toast.LENGTH_LONG).show(); Vibrator vibrator = (Vibrator) context.getsystemservice(context.vibrator_service); vibrator.vibrate(2000); Para que serve essa classe? Para vibrar é preciso permissão. O que esse código está buscando?

MyAlarmReceiver.java Permissão para Vibrar public class MyAlarmReceiver extends BroadcastReceiver { @Override public void onreceive(context context, Intent intent) { Como a intenção será disparada? Toast.makeText(context, context.getstring(r.string.alarm_fired_message), Toast.LENGTH_LONG).show(); Vibrator vibrator = (Vibrator) context.getsystemservice(context.vibrator_service); vibrator.vibrate(2000); AndroidManifest.xml <uses permission android:name="android.permission.vibrate" /> <receiver android:name=".myalarmreceiver" />

Criando uma Intenção Pendente public class AlarmAcGvity extends AcGvity { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.alarm); public void startalert(view view) { EditText text = (EditText) findviewbyid(r.id.gme); int i = Integer.parseInt(text.getText().toString()); Intent intent = new Intent(this, MyAlarmReceiver.class); PendingIntent pendingintent = PendingIntent.getBroadcast(this.getApplicaGonContext(), 234324243, intent, 0); AlarmManager alarmmanager = (AlarmManager) getsystemservice(alarm_service); alarmmanager.set(alarmmanager.rtc_wakeup, System.currentTimeMillis() + (i * 1000), pendingintent); Toast.makeText(this, i + getstring(r.string.alarm_started_message), Toast.LENGTH_LONG).show(); AlarmAcGvity.java Grande mistério: como/quando o método startalert é chamado? Lembra de registrar a intenção no manifesto

Mais Manifesto <acgvity android:name=".alarmacgvity" android:label="@string/gtle_acgvity_main" > <intent filter> <acgon android:name="android.intent.acgon.main" /> <category android:name="android.intent.category.launcher" /> </intent filter> </acgvity> AndroidManifest.xml

Amarração entre XML e Java <Buvon android:id="@+id/ok" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:onclick="startalert" android:text="@string/alarm_buvon_label" > </Buvon> alarm.xml AlarmAcGvity.java Como se dá a amarração entre Java e XML nesse exemplo? public class AlarmAcGvity extends AcGvity { @Override public void oncreate(bundle savedinstancestate) {... public void startalert(view view) {...

A Ordem dos Eventos public class AlarmAcGvity extends AcGvity { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.alarm); public void startalert(view view) { EditText text = (EditText) findviewbyid(r.id.gme); int i = Integer.parseInt(text.getText().toString()); Intent intent = new Intent(this, MyAlarmReceiver.class); PendingIntent pendingintent = * O que acontecerá tão logo o usuário clique no botão? * Qual a ordem dos eventos? PendingIntent.getBroadcast(this.getApplicaGonContext(), 234324243, intent, 0); AlarmManager alarmmanager = (AlarmManager) getsystemservice(alarm_service); alarmmanager.set(alarmmanager.rtc_wakeup, System.currentTimeMillis() + (i * 1000), pendingintent); Toast.makeText(this, i + getstring(r.string.alarm_started_message), Toast.LENGTH_LONG).show(); AlarmAcGvity.java

A Ordem dos Eventos public class AlarmAcGvity extends AcGvity { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.alarm); public void startalert(view view) { EditText text = (EditText) findviewbyid(r.id.gme); int i = Integer.parseInt(text.getText().toString()); Intent intent = new Intent(this, MyAlarmReceiver.class); PendingIntent pendingintent = PendingIntent.getBroadcast(this.getApplicaGonContext(), 234324243, intent, 0); AlarmManager alarmmanager = (AlarmManager) getsystemservice(alarm_service); alarmmanager.set(alarmmanager.rtc_wakeup, System.currentTimeMillis() + (i * 1000), pendingintent); Toast.makeText(this, i + getstring(r.string.alarm_started_message), Toast.LENGTH_LONG).show(); AlarmAcGvity.java

strings.xml strings.xml <resources> <string name="app_name">aula17</string> <string name="gtle_acgvity_main">mainacgvity</string> <string name="main_acgvity_label">agvidade Principal</string> <string name="alarm_buvon_label">iniciar</string> <string name="alarm_fired_message">hora de acordar!</string> <string name="alarm_started_message"> segundos para alarme disparar.</string> </resources>