rphan; mso-hyphenate: auto" align=left>Android

Android na Prática

Aprenda a desenvolver aplicações Android

 

 

O Android é a plataforma para dispositivos móveis da Open Handset Alliance, uma aliança de 35 grandes empresas. Entre elas, destaca-se a Google (que está na liderança), a Samsung, a Motorola e a NVIDEA. Mesmo sendo uma tecnologia recente (lançada oficialmente dia 5 de novembro de 2007), já existem diversas empresas trabalhando com força total com a tecnologia, além de um desafio de US$10 milhões para o melhor aplicativo desenvolvido até meados deste ano.

Introdução ao Android

A plataforma Android possui um browser integrado, gráficos otimizados (2D e 3D), um banco de dados SQLite, suporte multimídia para áudio, vídeo e formatos de imagem (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF), suporte a telefonia GSM , bluetooth, EDGE, 3G, e WiFi, câmera, GPS, um acelerômetro, entre outros recursos (alguns dependentes de hardware).

Duas características interessantes do Android são o modo com o qual trabalha com as aplicações, e o fato de ter uma máquina virtual própria, capaz de realizar as operações requeridas pela plataforma.

Geralmente uma aplicação Android roda em seu próprio processo, com sua própria instância Dalvik (máquina virtual escrita de forma a executar várias VMs eficientemente e que roda arquivos .dex, otimizados para consumo mínimo de memória), além de os desenvolvedores possuírem total acesso ao mesmo framework utilizado pelas aplicações do sistema.

A arquitetura foi projetada de maneira a possibilitar a reutilização de recursos dispostos por outras aplicações (salvo as restrições de segurança impostas pelo framework). Maiores detalhes sobre a arquitetura do Android podem ser encontrados no artigo Android: um novo paradigma de desenvolvimento móvel publicado nesta edição da WebMobile.

Preparando um ambiente de desenvolvimento

Realize o download do SDK para o seu sistema operacional (http://code.google.com/android/download.html) e descompacte o arquivo.  Feito isso, basta adicionar o diretório tools ao PATH do seu sistema (isto possibilita rodar as ferramentas de linha de comando sem precisar especificar o caminho completo para o diretório).

Agora precisamos configurar seu ambiente de desenvolvimento. Para isto, vamos utilizar o Eclipse que possui um plug-in que adiciona suporte integrado para projetos e ferramentas Android (vale destacar que existem outras IDEs com este recurso disponível).

Para desenvolver aplicações com Android no Eclipse, você precisa instalar um plug-in chamado Android Development Tools (ADT), que adiciona suporte integrado para projetos e ferramentas Android.

Para baixar e instalar o plug-in ADT, inicie o Eclipse, selecione Help > Software Updates > Find and Install. Na janela que aparece, selecione Search for new features to install e pressione Next. Pressione New Remote Site. Entre com um nome para o site remoto (exemplo: Android Plugin) e informe como URL https://dl-ssl.google.com/android/eclipse/.Pressione OK.  Você verá o novo site adicionado e selecionado na lista de busca (selecione caso não esteja selecionado). Pressione Finish. O plug-in ADT não é assinado, mas você pode aceitar a instalação de qualquer maneira clicando em Install All. Reinicie o Eclipse. Depois de reiniciar, atualize as preferências do Eclipse para apontar para o diretório do SDK. Para tanto, selecione Window > Preferences… para abrir o painel de preferências. Selecione Android no painel da esquerda. Localize o diretório do SDK clicando em Browse… no campo SDK Location. Pressione Apply, e depois OK.

Uma aplicação Android

Toda aplicação Android utiliza uma combinação de quatro módulos essenciais: Activity, Intent Receiver, Service e Content Provider, sendo que o mais comum é o Activity (Atividade).

Uma Atividade é algo que o usuário pode fazer e geralmente é uma única tela. Atividades são implementadas como classes que estendem Activity, exibindo uma interface para o usuário, composta por Views.

Intent Receivers são utilizados quando sua aplicação precisa ser executada em reação a eventos externos, como uma ligação sendo recebida. Services são códigos que se mantêm executando sem uma interface gráfica, como um download sendo realizado. Content Providers são, como o próprio nome sugere, provedores de conteúdo e devem ser utilizados quando sua aplicação necessita compartilhar dados com outras.

Geralmente cada aplicação roda em seu próprio processo, e se mantém executando até que o usuário solicite seu término ou o sistema a encerre por necessidade de memória. Sendo assim, o ciclo de vida do processo de uma aplicação não é controlado por ela, mas sim pelo sistema, que classifica estes processos em uma hierarquia, sendo que quanto mais importante for o processo, menos chance ele tem de ser encerrado. Esta hierarquia obedece à seguinte ordem de importância:

·         Processo em primeiro plano: aquele que possui uma atividade no topo da tela com a qual o usuário está interagindo;

·         Processo visível: aquele que possui uma atividade na tela, mas não está no topo;

·         Processo de serviço: aquele que possui um serviço iniciado com o método startService(). Embora estes processos não sejam visíveis ao usuário, eles estão executando ações as quais o usuário se importa.

·         Processo de fundo: aquele que possui uma atividade que não está atualmente visível ao usuário.

·         Processo vazio: aquele que não possui nenhum componente de aplicação ativo. Utilizado como cache para quando uma determinada aplicação retornar a executar.

 

Para que o Android encerre corretamente uma aplicação e não ocorra perda de dados, deve-se implementar corretamente este ciclo de vida, definido pelos métodos de Activity, que podem ser sobrescritos para que realizem uma determinada função requerida pelo seu aplicativo. Geralmente, o caminho percorrido durante o ciclo de vida de uma atividade é definido conforme podemos observar na Nota 1.

 

Nota 1. Métodos de Activity

Método

Descrição

Próximo

onCreate()

Chamado quando a atividade é criada pela primeira vez. Aqui é aonde você deve fazer criar views, popular listas, etc. Este método proporciona um Bundle que contém o estado congelado anterior da atividade, se existir um.

Sempre é seguido de um onResume().

 

 

 

onStart()

Chamado quando uma atividade se torna visível ao usuário.

Seguida por um onResume() se a atividade foi criada pela primeira vez, ou onRestart() se estiver sendo exibida novamente depois de ter sido parada.

onRestart()

Chamado após sua atividade ter sido parada, antes de ser resumida novamente.

Seguida pelo onResume().

onResume()

Chamado quando a atividade vai começar a interagir com o usuário. Neste ponto sua atividade está no topo da pilha de atividades, com a entrada do usuário indo para ela.

Seguido por onFreeze() se outra atividade estiver sendo utilizada na frente dela, ou onPause() se esta atividade está sendo encerrada.

onFreeze()

Possibilita salvar o estado atual. Quando sua atividade tiver sido pausada e outra atividade está sendo resumida para interagir com o usuário. Após pausada, o sistema pode, a qualquer momento, precisar pará-la (ou até mesmo encerrá-la) para poder carregar os recursos para a atividade atualmente na frente da tela. Se isto acontecer, o estado que você fornecer aqui vai ser retornado ao onCreate() quando uma nova instância da sua atividade for iniciada para interagir com o usuário.

Sempre seguida por onPause().

onPause()

Chamada quando o sistema está para resumir uma atividade anterior. Isto é tipicamente utilizado para submeter alterações não salvas para a persistência, e outras coisas que possam estar consumindo CPU, etc. Implementações deste método devem ser bem rápidas por que a próxima atividade não vai ser resumida até que este método retorne.

Seguida por um onResume() se a atividade retorna para a frente ou onStop() se ela se torna invisível ao usuário.

onStop()

Chamada quando a atividade não está mais visível ao usuário por que outra atividade foi resumida e está cobrindo esta. Isso pode acontecer porque a nova atividade está sendo iniciada, uma existente está sendo trazida para frente desta ou esta está sendo destruída.

Seguida por onRestart() se esta atividade está retornando para interagir com o usuário, ou onDestroy() se esta atividade está indo embora.

onDestroy()

A chamada final que você recebe antes que sua atividade seja destruída. Isto pode acontecer porque a atividade está encerrando (alguém chamou finish()) ou porque o sistema está destruindo temporariamente esta instância para salvar espaço. Você pode distinguir estes dois cenários com o método isFinishing()).

Nada.

Estudo de caso - Agenda

Neste artigo desenvolveremos uma aplicação Android de Agenda de contatos, onde cada contato possui: identificador, nome, telefone, e-mail e endereço.

Para tanto, deve ser criado um novo projeto Android – Menu File -> New .. -> Project -> Android Project. Cada projeto é uma aplicação, e esta deve possuir uma atividade principal, que será chamada Agenda – assim como o nome da aplicação e projeto -, o package name a ser informado é webmobile.android.agenda. É importante notar que o nome do pacote que você utiliza na sua aplicação deve ser diferente de todos os pacotes instalados no sistema.

Neste momento, o ADT criou para você uma estrutura, composta pela sua atividade, uma classe denominada R (que representa um recurso da aplicação e não deve ser modificada por outro meio que não pelo plug-in), um arquivo XML nomeado AndroidManifest (que define os componentes de sua aplicação), strings.xml (que define os valores a serem utilizados como recurso) e finalmente main.xml (que define o layout da sua atividade principal).

Nossa aplicação será composta por duas Atividades, uma que lista os contatos existentes e outra que cadastra e edita contatos. Serão utilizados alguns valores que devem ser definidos no arquivo strings.xml, pois são referenciados pelos arquivos de layout. Estes valores se comportam como constantes e são utilizadas pela aplicação com um recurso String (note que é muito simples defini-los, basta adicionar um elemento <string name=”constante”>valor</string>). Modifique este arquivo para que fique conforme a Listagem 1.

 

Listagem 1. Arquivo strings.xml

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <string name="app_name">Agenda</string>

    <string name="cadastro_contato">Agenda :: Contato</string>

    <string name="nenhum_contato">Nenhum Contato</string>

    <string name="adicionar_contato">Adicionar Contato</string>

    <string name="remover_contato">Remover Contato</string>

    <string name="editar_contato">Editar Contato</string>

    <string name="confirmar">Confirmar</string>

    <string name="cancelar">Cancelar</string>

    <string name="contato_nome">Nome</string>

    <string name="contato_telefone">Fone</string>

    <string name="contato_email">E-mail</string>

    <string name="contato_endereco">Endereço</string>

    <string name="notificacao_erro">Ainda não existem contados para serem modificados ou excluídos.</string>

</resources>

 

É necessária também a modificação de main.xml, o qual definirá nossa lista de contatos (Listagem 2). Criamos assim um LinearLayout. Este alinha todos os seus filhos em uma única direção, verticalmente ou horizontalmente, dependendo de qual propriedade você definir para ele (no nosso caso a orientação é vertical). Todos os filhos são posicionados um após o outro, então uma lista vertical terá apenas um filho por linha, é o que ocorre caso tenhamos algum contato na lista, senão será exibido o TextView com a mensagem “Nenhum Contato” (especificada em strings.xml). Para definir quando temos um item na lista e quando exibimos o TextView, utilizamos as propriedades android:id="@id/android:list" e android:id="@id/android:empty" respectivamente. As propriedades de altura e largura estão especificadas de forma a ocupar o tamanho máximo disponível em tela (android:layout_width = "fill_parent" e android:layout_height ="fill_parent").

 

Listagem 2. Arquivo main.xml

<?xml version="1.0" encoding="utf-8"?>

...

Quer ler esse conteúdo completo? Tenha acesso completo