Fundamentos e Arquitetura do Desenvolvimento Android
Classificado em Computação
Escrito em em
português com um tamanho de 19,27 KB
Instalação do SDK e Configuração Inicial
Instale o SDK mantendo sempre o Android SDK Tools e Android SDK Platform-tools atualizados. As versões históricas incluem a primeira versão, ASTRO 1.0, a mais popular, 2.3 GINGERBREAD, a versão mais atual (na época do documento) 4.4 KITKAT, e a versão mais usada, 4.1 JELLY BEAN, que:
- Permite que o emulador simule a configuração de um celular real;
- Existe compatibilidade (e melhoramento) entre as plataformas;
- Plataformas suportam determinadas APIs (recursos);
- Uma API mais recente só funcionará em uma plataforma mais recente.
Para iniciar, instale o AVD (Android Virtual Device Manager) ou o ADT (Android Development Tools). A configuração de um AVD segue o padrão: New/avd name/device (nexus one) / target (android 2.3.3) / CPU (ARM-armeabi)...start
Arquitetura do Android
A arquitetura do Android é dividida em camadas:
1. Applications (Aplicações)
Exemplos: Home, Contacts, Phone, Browser.
- Camada de interação entre o usuário e o dispositivo;
- Funções básicas do dispositivo, como: calendário, despertador, e-mail, jogos e mapas.
2. Application Framework (Estrutura de Aplicações)
Componentes: Activity Manager, Window Manager, Content Providers, View System, Notification Manager, Package Manager, Telephony Manager, Resource Manager, Location Manager, XMPP Service.
- Camada de abstração construída para diminuir a complexidade e simplificar a reutilização;
- Disponibiliza aos desenvolvedores uma API (Application Programming Interface).
3. Libraries (Bibliotecas)
Componentes: Surface Manager, Media Framework, SQLite, OpenGL/ES, FreeType, WebKit, SGL, SSL, libc.
- Coleção de bibliotecas utilizadas pelo sistema, desenvolvidas em C/C++;
- Funcionalidades: áudio, vídeo, gráficos, banco de dados e navegador;
- Programação através da linguagem Java.
4. Android Runtime (Máquina Virtual)
Componentes: Core Libraries, Dalvik Virtual Machine.
Dalvik Virtual Machine (DVM)
- Máquina virtual Java, criada pelos engenheiros da Google, otimizada para executar em dispositivos móveis.
- Utiliza Compilação Just In Time (JIT): O processo de tradução ocorre durante a execução do aplicativo.
- Pontos importantes:
- Tempo de inicialização maior;
- Instalação de app mais rápida;
- Execução de app mais lenta;
- Maior consumo de bateria e memória.
Android Runtime (ART)
- Também é uma máquina virtual para execução de aplicativos Java no Android, disponibilizada a partir da versão 4.4 (KitKat).
- Utiliza Compilação Ahead Of Time (AOT): O processo de tradução ocorre antes da execução do aplicativo.
- Pontos importantes:
- Tempo de inicialização menor;
- Instalação de app mais lenta;
- Execução de app mais rápida;
- Menor consumo de bateria e memória.
5. Linux Kernel
Componentes: Display Driver, Camera Driver, Bluetooth Driver, Flash Memory Driver, Binder (IPC) Driver, USB Driver, Keypad Driver, Wifi Driver, Audio Drivers, Power Management.
- Gerenciamento do Hardware (memória, processos, threads, diretórios, redes e drivers);
- Aplicação -> Único Processo -> Thread dedicada;
- Cada aplicação possui um usuário, para ter acesso à sua estrutura de diretórios.
Estrutura de Diretórios de um Projeto Android
A criação de um projeto segue o fluxo: new / Android Application Project / (nome app, nome projeto, nome pacote, mínimo necessário SDK, target SDK, compile with, theme) / onde criar o projeto / ícone do app / tipo de activity / características da activity.
O plugin do Eclipse cria automaticamente a seguinte estrutura de arquivos:
- Src: Contém as classes Java.
- Gen: Contém a classe
R.java, que permite acesso aos recursos (arquivos, imagens, etc.) através das constantes dessa classe. - Assets: Arquivos opcionais ao projeto.
- Libs: Arquivos “jar” para serem adicionados ao classpath.
- Res (Resources): Recursos da aplicação: Imagens, layout de telas e arquivos de internacionalização.
- Drawable: Imagens da aplicação.
- Layout: Arquivos XML de layout para construir as telas da aplicação.
- Menu: Arquivos XML que criam os menus da aplicação.
- Values: Arquivos XML para internacionalização da aplicação (ex:
strings.xml).
Arquivos Chave
- MainActivity.java: É a classe principal da aplicação, representa sua tela inicial. Uma
Activityrepresenta uma tela do sistema e permite interação com o usuário. Um projeto pode ter váriasActivityque herdam deActionBarActivity. - Activity_main.xml: Localizado na pasta
layout, define a interface gráfica. Contém componentes de telas organizados em layouts. - Strings.xml: Contém mensagens da aplicação concentradas em um único lugar, facilitando o processo de internacionalização.
- R.java: Facilita o acesso aos recursos da aplicação, através do uso de constantes. O plugin do Eclipse gera essa classe automaticamente e esse arquivo não deve ser alterado manualmente.
Componentes Essenciais e Ciclo de Vida da Activity
A estrutura de um projeto é definida pela interação de três arquivos principais:
- Strings.xml: Arquivo XML para definir o texto que será apresentado na tela. São definidas “variáveis” e associadas mensagens.
- Layout.xml: Arquivo XML que define a organização do layout da tela e as
Viewque serão utilizadas. - Activity.java: Classe Java que define o layout de tela que será criado, as respostas do sistema aos eventos gerados na tela e o gerenciamento do ciclo de vida.
Ciclo de Vida da Activity
O ciclo de vida de uma Activity passa pelos seguintes estados:
onCreate()-> CreatedonStart()-> Started (Visible)onResume()-> Resumed (Visible)onPause()-> Paused (Partially Visible) (Pode voltar paraonResume()ou ir paraonStop())onStop()-> Stopped (Hidden) (Pode voltar paraonRestart(),onStart()ou ir paraonDestroy())onDestroy()-> Destroyed
Padrão MVC e Vinculação de Componentes
Link Activity/Layout: É necessário declarar os componentes que serão manipulados pela Activity. Esses componentes serão vinculados aos componentes da tela através da classe R. Ao ser criada, a Activity deverá resgatar esses componentes da tela, através do serviço findViewById, informando o Id do componente que será resgatado.
Uma vez resgatados/vinculados os componentes da tela, é possível adicionar um serviço que será chamado quando determinado evento for gerado. Padrão: Observer.
Tratamento de Exceções e Diálogos
Atenção: O usuário poderá não fornecer um número, o que pode gerar uma exceção NumberFormatException. Se a aplicação não estiver preparada para tratar essa exceção, o sistema será fechado e uma mensagem pouco amigável será apresentada ao usuário.
Dialog
- São janelas de diálogos configuráveis;
- A construção dessas janelas segue o padrão “builder”.
Definição de Activity
- Classe Java que herda de
android.app.Activity, ou subclasse dela; - Geralmente representa uma tela do sistema;
- Controla os eventos da tela e define qual interface será construída.
Exemplo: classeCriadaActivity extends Activity. O método obrigatório onCreate(Bundle savedInstanceState) é responsável por inicializar o que for necessário para executar a aplicação, contendo setContentView(R.layout.activity_classe_criada), que define a interface (XML com layout) da aplicação que será construída pela View.
Atenção: Toda Activity do sistema deve, obrigatoriamente, ser declarada no arquivo AndroidManifest.xml.
ListActivity e Intents
ListActivity
- É uma subclasse de
Activity; - Possui um
ListView (android.widget.ListView), que gerencia a exibição de uma lista (com vários itens) dispostos na vertical, com barra de rolagem; - Encapsula vários métodos para exibição dos itens na tela;
- Em resumo, a programação não precisa se preocupar com a View (layout já está definido) e sim, apenas informar os dados que irão preencher a lista.
Exemplo de Alteração da Activity para ListActivity:
- A classe deve herdar de
ListActivity; - Não deve “carregar” o layout sugerido;
- Define a lista que deve ser exibida;
- Constrói um objeto
ListAdapter, definindo que este deve utilizar layout pré-definido pelo Android.
ListAdapter
- É uma interface que define o comportamento da lista de objetos que será exibida.
- Exemplos:
ArrayAdapter,SimpleAdapter.
Intents
Intents definem uma mensagem broadcast, que é enviada para o Sistema Operacional decidir qual aplicação (Activity) será responsável por realizar aquela determinada operação.
- Permite a integração entre aplicações distintas no Android, sem ser necessário se “conhecerem”.
- Mensagem enviada pela aplicação para o Android iniciar uma
Activity(uma aplicação é umaActivity). - Uma aplicação pode oferecer recursos para o Sistema Operacional, como também, consumir recursos.
- A chamada pode ser explícita (determina a classe que deverá ser executada) ou implícita (não determina a
Activityque deve ser chamada).
Uma Intent pode ser usada para, por exemplo:
- Abrir o browser, informando um determinado endereço;
- Solicitar uma chamada telefônica;
- Abrir o Google Maps, informando um determinado endereço, ou solicitar uma rota;
- Executar procedimentos em segundo plano;
- Abrir outra janela (Activity) da aplicação.
Para definir um Intent, é necessário:
- Instanciar a Intent (com respectivos parâmetros);
- Iniciar a Activity (indicando que aplicativo deverá executar, filtro).
Exemplos de Intents Implícitas
1. Abrir o Browser:
Intent it = new Intent(Intent.ACTION_VIEW, endereco)2. Realizar uma Ligação:
Intent it = new Intent(Intent.ACTION_CALL, uri)3. Enviar E-mail: Utiliza getPackageManager() para executar a caixa postal.
4. Abrir Localização no Google Maps:
Uri uri = Uri.parse(“geo:”+this.campi.get(escolha));Intent com Resposta
Uma Intent pode ser chamada indicando que uma resposta será retornada, utilizando startActivityForResult(Intent, Código).
- Parâmetros: Intent que será chamada e Código associado ao chamado.
- O código informado na inicialização da Activity será utilizado para recuperar sua execução (inclusive valores).
Boas Práticas
- É considerada uma boa prática de programação declarar constantes (int) responsáveis pela execução de cada Activity.
- A partir dessa definição, fica mais simples observar qual Activity saiu da pilha de execução e retornou para a
MainActivity.
onActivityResult
Uma Activity que chama outra(s) Activity(s) e espera uma resposta, deve implementar o serviço onActivityResult.
Parâmetros do serviço onActivityResult:
requestCode: Código da Activity que foi chamada.resultCode: Status de execução da Activity (RESULT_CANCELEDeRESULT_OK).Intent: Intent que pode receber os parâmetros (bundle) da execução da Activity chamada.
Tipos de Intents
- Explícita: Informando a classe da Activity.
Intent i = new Intent(this, App.class); - Implícita: Informando a ação.
Uri u = Uri.parse("http://www.google.com"); Intent i = new Intent(Intent.ACTION_VIEW, u);
Intent com ACTION_VIEW: Uma mensagem broadcast é enviada para o Sistema Operacional para execução de uma determinada tarefa. O Sistema Operacional se encarrega de verificar quais das aplicações (Activity) estão aptas para resolver aquele determinado tipo de problema.
Identificando Ações (Intent-Filter)
Toda aplicação tem um arquivo de configuração (AndroidManifest.xml) que determina o padrão de execução. Ao definir que uma Activity está sendo disponibilizada, é possível associar uma ação e uma categoria, através dos intent-filter.
- Android consulta os
intent-filterpara determinar quais aplicativos estão disponíveis para executar determinada ação. - Intent-filter: É uma forma de interceptar chamadas realizadas por uma Intent.
- Para cada Activity pode ser especificada zero ou várias ações.
- Ao determinar uma ação, obrigatoriamente, deve associar uma categoria.
Observação: Ao executar uma Activity, caso não tenha sido vinculada uma categoria, a Intent automaticamente associa com a categoria DEFAULT.
BroadcastReceiver
É uma classe abstrata utilizada para responder a determinados eventos enviados por uma Intent.
Características
- Roda em background;
- Não possui interface gráfica;
- Não é recomendada para interações com o usuário;
- Executa tarefas rápidas (menos de 10 segundos).
Alguns Eventos Monitorados
ACTION_BATERY_LOW: Bateria com pouca carga.ACTION_HEADSET_PLUG: Fone de ouvido (des)conectado.ACTION_SCREEN_ON: Tela do dispositivo é ligada.NEW_OUTGOING_CALL: Nova chamada telefônica.BOOT_COMPLETE: Boot inicial (telefone liga).ACTION_POWER_CONNECTED: Carregador conectado.ACTION_POWER_DISCONNECTED: Carregador desconectado.
Configuração do BroadcastReceiver
- Estática: Sempre disponível após sua instalação no dispositivo, configurada via
AndroidManifest.xml. - Dinâmica: Em tempo de execução, ou seja, enquanto uma determinada Activity estiver executando, configurada via aplicação. Ao fechar a aplicação, o Receiver também é encerrado.
Notification
É a exibição de uma notificação na barra de status do dispositivo. Permite exibir o resultado de uma operação que foi realizada em segundo plano.
Ao ser disparada, o usuário poderá: Ignorar, Ver a Notification ou Interagir com a aplicação (exemplo: abrir uma activity).
Quando usar Notification?
- Quando é necessário comunicar que “algo” aconteceu no dispositivo.
- A notificação não deve interromper a atual tarefa que o usuário está realizando.
Dica Importante: Trabalhar com a biblioteca de compatibilidade (NotificationCompat.Builder), pois a implementação de Notification evoluiu ao longo do tempo.
Alternativas para Compatibilidade:
- Verificar qual é a versão que está executando a aplicação e chamar o método que implementa aquele serviço (deprecated);
- Usar a API de compatibilidade (
NotificationCompat.Builder).
Recomendação: É recomendado que aplicações que executem em segundo plano sempre utilizem notificações para se comunicar com o usuário. Exibir alertas na tela, ou pior ainda, abrir uma tela diretamente sem a permissão do usuário é fortemente desaconselhado.
AlarmManager
É um serviço do Android que permite a programação de um determinado recurso para executar em um determinado tempo. Esse recurso também pode ser programado para executar repetidas vezes, em determinados períodos, ou seja, agendamento de serviços.
- A tarefa será executada na data/hora programada.
- Se o telefone estiver em “modo de espera”, a tarefa será executada da mesma forma.
- Ao reiniciar o dispositivo, os agendamentos são automaticamente cancelados.
Para configurar um alarme, é necessário definir:
- Recurso (por exemplo, Activity) que será executado;
PendingIntent;- Momento para executar;
- Instanciar o
AlarmManager.
Para cancelar a execução de um alarme: É necessário recuperar a Intent que está em execução (código), instanciar o AlarmManager e chamar o serviço “cancel”, informando o código do alarme que deseja cancelar.
Banco de Dados (SQLite)
Banco de dados disponível na plataforma Android.
- Não precisa de um processo servidor.
- O banco (tabelas, views, índices e triggers) fica registrado em um arquivo.
- Um aplicativo que faz uso de uma base de dados cria em sua estrutura uma pasta
databases. - Essa base está disponível para ser acessada apenas pelas classes dessa aplicação.
- Quando uma aplicação é desinstalada, os dados também são removidos.
A classe SQLiteDatabase está disponível no Android. É interessante a adoção de uma interface gráfica que facilite a construção/manipulação do banco/dados.
Elementos que podem ser criados: Tabelas, Views, Índices e Gatilhos.
Formas de Inserir a Base de Dados no Dispositivo:
- Copiando o arquivo “.db” para o dispositivo (requer permissão de “root”).
- Inserindo código SQL nas rotinas do aplicativo para criar uma tabela (método mais recomendado).