sábado, 24 de março de 2012

Android, listando os sensores do celular ou tablet

 Você sabe quais sensores o seu aparelho celular ou tablet tem?
 Se não sabe mas quer saber, duas linhas de código resolvem!
 Vamos usar o serviço do SensorManager e chamar o seu método getSensorList que nos retornará uma lista com os sensores disponíveis no aparelho.



 Dessa lista eu monto uma arrayList com os nomes dos sensores para mostrar na listView.

 Vamos aos códigos:

 Do ListActivity: TesteSensoresActivity.java

Do XML para o ListView: list_item.xml

E ao executar:



 Abraços!

terça-feira, 20 de março de 2012

Android, comunicação Service-Activity via BroadcastReceiver

 O objetivo deste post-tutorial é implementar um exemplo de uma aplicação que faz a comunicação entre um service e uma activity usando a técnica de enviar os dados por broadcast.
 Para isso vamos continuar usando os dados do GPS (como nos exemplos anteriores) recebidos no service e via intents mensageiras entregá-las à activity através de broadcasts.
 Vamos usar um worker bound service em que implementamos um LocationListener para receber os Locations do GPS Provider, cada location é colocado numa intent com um putExtra e enviado por meio do método sendBroadcast.
 Na activity, definimos um objeto da classe BroadcastReceiver, que receberá cada intent com o location enviado pelo service. No método onReceive recuperamos os dados do location via getParcelableExtra e enviamos para uma linkedList com o autoexplicativo nome de filaUltimosLocations e desta para a tela. Para avisar o Android que a activity está apta para receber os broadcasts registramos o broadcast por meio de um registerReceiver e "unregistramos" com o unregisterReceiver.
 O código é simples, mas a idéia que engloba o mecanismo é poderosa. É só soltar as rédeas da imaginação e ver este esquema sendo usado em uma app de pedidos, de notícias, ou uma que mostra eventos de um esporte on line.
 Mas vamos voltar para a realidade.
 Seguem os códigos.

Do Service:




Da Activity:



Do List Adapter:



Da tela: main.xml

Das linhas do ListView: linhalista.xml

E finalmente uma cópia da tela:

Bons códigos!

domingo, 4 de março de 2012

Android, processamento concorrente, threads

 O objetivo principal deste post é mostrar um exemplo de processamento concorrente no Android, com compartilhamento simultâneo de dados.
 Para isso vamos usar threads, sincronização, variável volatile e interrupt. Aproveitando o teste, também usamos um ListAdapter customizado do BaseAdapter e as classes: Bundle, Message e Handler.
 Vamos inicialmente montar um projeto que consiste em utilizar um objeto para controlar um contador sequencial, uma thread para usar o contador e enviar mensagens com o último número gerado no contador para a activity, esta receberá as mensagens e mostrará os números em uma ListView.
 Vamos começar pelas telas. A tela main.xml, consiste em uma linha de status, dois botões de start e stop e a ListView que vai ser populada com o linhalista.xml que contém dois TextViews.

main.xml

 

 linhalista.xml

 

 Os dados que estamos tratando são o nome da Thread e o valor do contador. Usamos a classe Bundle para passar esses dois campos, e a classe Message para transferir o Bundle da thread para a activity via sendMessage da classe Handler. Na activity, o handler via handleMessage envia o Bundle para a lista e daí para a ListView.

 Segue o ListAdapter: MyListAdapter.java




E o contador: ContadorSequencial.java



Na thread, é importantíssimo notar que a variável workThread é definida como volatile. Ela deve ser definida dessa forma para garantir que ao ser alterada por outra thread ela seja visível para a thread com as alterações, caso contrário a thread pode não encerrar nunca!

 Segue a Thread: MyThread.java



Segue a activity: TesteThread03Activity.java



Ao executar temos a seguinte imagem:



 Vamos fazer as seguintes alterações na activity:

Acrescentar essas variáveis:

Incluir no final do onCreate:

Incluir no iniciarThreads:

Incluir no pararThreads:

E testar, e ver algo assim:

Vemos que cada thread está usando um contador separado, cada um com sua própria sequencia.

E se pretendermos que seja uma contagem única? O quê precisamos fazer?

Primeiramente, devemos alterar a classe do contador para permitir compartilhamento seguro entre Threads, colocando a palavra synchronized nos métodos que acessam a variável contador. Isso vai garantir que quando estivermos acessando a variável por uma thread, uma outra que tentar acessar vai esperar a outra liberar.
Depois alterar a activity, e passar a mesma referência do objeto contador para as três threads.

ContadorSequencial.java


O método iniciarThreads, fica assim:



E testando:



Pronto!

Abraços







sábado, 3 de março de 2012

Android: Conexão bi-direcional, Activity-Service via um CallBack

 Este tutorial foi publicado no Portal Android.

 Estou publicando uma serie de estudos no meu blog Agorandroid. Este tutorial é sobre uma cópia do projeto que publiquei lá (aqui GPS), com a diferença de que o serviço de coleta aqui será feito por um service.
 O projeto é bem simples, o objetivo é mostrar a técnica de conexão. O app coleta os dados do provedor de GPs, essa coleta é feita por uma classe filha de service e transfere para a activity que mostra alguns campos do Location recebido. Isso é só para poder acompanhar visualmente. Normalmente gravariamos os dados num banco local ou remoto. Este tutorial trata da conexão entre Activity e Service. Mas não da maneira tradicional, vamos usar uma técnica muito usada no Android chamada de CallBack (via um Listener). Com ela recebemos os avisos dos eventos ocorridos no service diretamente logo após ocorrerem. Como isso é feito? Primeiro pegamos uma referência do objeto que pretendemos ter acesso, depois, nos cadastramos para recebermos os retornos do objeto conectado. Para isso usaremos uma interface muito simples com apenas um método declarado.
 Nome: OnLocListener.java
 Através da implementação dessa interface na activity vamos receber os dados do service. Vamos usar um bound service, que é um serviço que fica conectado ao componente que o chamou através do
bindService.

Não vou comentar muito sobre essa parte do bind porque isso está muito bem documentado no Dev Guide do Android. Os seguintes métodos do service são utilizados pela activity: startColeta, stopColeta e setOnLocListener.
 O fragmento de código seguinte lembra algum outro?
 Registramos o listener logo após a conexão ser completada. Através dos botões fazemos start e stop da coleta dos dados do GPS. No service registramos o listener pelo nome da interface na variável:
 E passamos os dados assim, usando o listener setado antes:
 Só para lembrar, o tutorial não é sobre o GPS. Ele foi usado devido ao fato de que serve muito bem ao propósito de mostrar os dados fluindo de um componente ao outro; sem ser de uma maneira artificial já que os dados são reais. Já que falei do GPS, não esqueçam de incluir a permissão no manifest.

 Vamos aos códigos.

OnLocListener.java

TesteGPS_xxActivity.java

TesteGPS_xxService.java


 main.xml


Bons códigos!

Desenvolvedor Android - como começar

  A plataforma Android continua crescendo velozmente.
  Nada mais natural que chame atenção de desenvolvedores ou aspirantes a. Então, tomei a liberdade de escrever algumas recomendações básicas para quem estiver interessado em ingressar na comunidade de desenvolvedores Android.

- Se você já tem um bom conhecimento em Java, vá para o passo 7;
- Se você tem um conhecimento intermediário em Java, vá para o passo 6;
- Se você tem um conhecimento básico de Java, vá para o passo 4 para reforçar conhecimento;
- Se você não conhece Java, mas conhece uma linguagem OO, vá para o passo 4 e 5 para equalizar conhecimentos e estude sério a partir do passo 6;
- Se você não conhece Java, mas conhece uma linguagem não OO, vá para o passo 4;
- Se você não conhece nem uma linguagem, comece pelo passo 1;

 Passos:
 1. Introdução à Computação: hardware e software, sistema operacional, linguagens de programação
 2. Lógica Computacional e Algoritmos
 3. Arquivos
 4. Linguagem Java básico
 5. Java OO
 6. Java Frameworks
 7. Introdução à plataforma Android
 8. Componentes de uma APP Android:  Activity, BroadcastReceiver, Service, Content Providers
 9. Componentes Visuais Android:  Views e Layouts
 10. Ciclo de vida das activities
 11. Broadcast Receiver
 12. Alarme
 13. Service
 14. Intent, intent-filter
 15. Thread, handler, AsyncTask
 16. Android IO: Arquivos, Preferences, SqLite, Content Providers
 17. GPS e Mapas
 18. Áudio e Vídeo
 19. Web Services
 20. Games
 21. Não vamos nos esquecer de acrescentar alguns conhecimentos em design, projetos, análise, DBA, engenharia de software e cultura geral.

 Materiais:
- Livros
- Site Android Developers
- Cursos

 Materiais de apoio:
 -Tutoriais
 -Apostilas
 -Vídeos

Sites:
- Android Developers
- Portal Android
- GUJ
- StackOverflow

 Conselhos:
 -Se tiver dificuldades em um passo, retorne para o passo mais adequado.
 -Nada substitui o trabalho pesado: ler, pesquisar, testar.
 -Não tente saltar etapas, construir uma base sólida de conhecimentos é fundamental.
 -Compartilhe códigos, evite ser vítima de uma falha de programação!