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 Activity representa uma tela do sistema e permite interação com o usuário. Um projeto pode ter várias Activity que herdam de ActionBarActivity.
  • 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 View que 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() -> Created
  • onStart() -> Started (Visible)
  • onResume() -> Resumed (Visible)
  • onPause() -> Paused (Partially Visible) (Pode voltar para onResume() ou ir para onStop())
  • onStop() -> Stopped (Hidden) (Pode voltar para onRestart(), onStart() ou ir para onDestroy())
  • 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:

  1. A classe deve herdar de ListActivity;
  2. Não deve “carregar” o layout sugerido;
  3. Define a lista que deve ser exibida;
  4. 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 é uma Activity).
  • 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 Activity que 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:

  1. Instanciar a Intent (com respectivos parâmetros);
  2. 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_CANCELED e RESULT_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-filter para 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:

  1. Verificar qual é a versão que está executando a aplicação e chamar o método que implementa aquele serviço (deprecated);
  2. 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).

Entradas relacionadas: