A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Curso de Android Fevereiro de 2011 Cristiano Expedito Ribeiro Fabrício Firmino de Faria.

Apresentações semelhantes


Apresentação em tema: "Curso de Android Fevereiro de 2011 Cristiano Expedito Ribeiro Fabrício Firmino de Faria."— Transcrição da apresentação:

1 Curso de Android Fevereiro de 2011 Cristiano Expedito Ribeiro Fabrício Firmino de Faria

2 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

3 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

4 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"> 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

5 IntentFilter - Exercício 17 Volte ao projeto LayoutSamples Abra o AndroidManifest.xml Remova o elemento 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 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

6 Ações de Intent úteis Lembra das ações nativas do Android? 6 ActionURI - chamar Uri.parse(uri)Descrição ACTION_VIEW http://www.gmail.comAbre 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_PICKContactsContract.Contacts.CONTENT_URI Abre lista de contatos do celular ACTION_SET_WALLPAPER - Abre lista para escolha de papéis de parede

7 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

8 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 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

9 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: Os métodos setData() e setType() são antagônicos, ou seja, chamar um deles implica em limpar o outro. 9 Método da IntentDescriçã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.

10 Substituindo ações nativas Tecla Home Tecla discar (call) Intent.ACTION_SEARCH Intent.ACTION_WEB_SEARCH 10

11 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

12 Ações e categorias próprias e filtragem Para criar as próprias ações e categorias, faça: Configurá-las no manifest usando 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

13 Ações próprias e filtragem – Exercício 21 No manifest de IntentFilterNativeSubst 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

14 Intent filter e permissões Caso um não seja definido para uma activity apenas a própria aplicação poderá iniciá-la Mas é possível exportá-la... 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 no manifest exporta a activity automaticamente Usar setClassName() ou setComponentName() para iniciar uma activity não exportada lançará uma SecurityException 14

15 Intent filter e permissões É possível criar sua própria permissão <permission android:label="@string/..." android:name="application_package.PERMISSION_NAME" /> <activity... android:exported="true" android:permission="application_package.PERMISSION_NAME" > Se uma aplicação diferente quiser acessar esta activity será necessário usar um elemento para a permissão definida pela aplicação 15

16 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 BroadcastReceivers apropriados Definido pelos 16

17 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) 17 Evento Mensagem BroadcastReceiver1 BroadcastReceiverN...

18 Configurando um receiver É necessário adicionar o elemento dentro de no AndroidManifest.xml 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

19 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

20 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

21 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 serão mostrados em breve 21 android.intent.actionCondiçã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

22 Mensagens broadcast do sistema ** Não podem ser usados com serão mostrados em breve 22 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

23 Broadcast de sistema – Exercício 23 Adicione mais um receiver no projeto ReceiverTest 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

24 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

25 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

26 Exemplo de aplicação multithread 26

27 Classe Thread e Interface Runnable Thread.sleep Thread.start Thread.join Runnable.run() Thread.isAlive() 27

28 Criação de threads 28

29 Threads e interfaces gráficas 29

30 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 Caso se queira iniciar o serviço de outra aplicação sem um deve-se usar android:exported="true" 30

31 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) 31 MétodoDescriçã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

32 Ciclo de vida de um serviço 32

33 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

34 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

35 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

36 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

37 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 dentro de 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

38 Serviços e threads – Exercício 25 Thread no serviço 38

39 Serviços e permissões – Exercício 26 Permissoes proprias 39

40 Uso de serviços acoplados 40

41 Notificações 41

42 AlarmManager 42

43 Handler 43


Carregar ppt "Curso de Android Fevereiro de 2011 Cristiano Expedito Ribeiro Fabrício Firmino de Faria."

Apresentações semelhantes


Anúncios Google