Anda di halaman 1dari 66

´

Indice

1.1 Introdu¸c˜ao

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

1

1.2 Objectivos

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

2

1.3 Avalia¸c˜ao

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

2

1.4 Instala¸c˜ao Ambiente Desenvolvimento Android

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

2

1.4.1 Lista de Software a instalar

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

3

1.4.2 Windows 7 Pro 64 bits: Instalar JDK 1.6.0 64 bits + Eclipse 64 bits + Android SDK 32 bits + ADT Plugin + MoSync 32 bits + JRE 1.7.0 32 bits

4

1.4.3 Mac OS X 64 bits: Instalar Eclipse 64 bits + Android SDK + ADT Plugin

 
 

+ MoSync .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

7

1.4.4 Actualiza¸c˜oes Outubro 2011 .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

7

1.4.5 APIs do Android

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

8

1.4.6 Configurar o Eclipse para criar uma aplica¸c˜ao Android

 

9

 

1.4.6.1

Threads

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

10

1.5 Arquitectura das Aplica¸c˜oes Android

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

12

1.5.1 Hello World em Android .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

15

 

1.5.1.1 Hello World em Android mas sem usar o estilo do Android .

.

.

.

15

1.5.1.2 Hello World no estilo Android

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

16

1.5.2 Utiliza¸c˜ao do Log do Android .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

17

1.5.3 GUIs em Android

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

19

1.5.4 O ciclo de vida das aplica¸c˜oes Android

 

22

1.5.5 Tarefas Ass´ıncronas em Android

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

22

1.5.6 Thread que executa c´alculos em background com indicador de progresso

 

26

1.6 Bases de Dados

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

36

1.7 Ler e Escrever Ficheiros

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

43

1.8 GUI widgets .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

44

1.8.1 ListView, Spinner, GridView

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

44

1.8.2 ExpandableListView (´arvore com 2 n´ıveis)

 

48

1.8.3 ActionBar (tabs)

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

48

1.8.4 Criar activities com sub-activities .

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

49

1.9 Escrever e ler de um Ficheiro de Texto

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

52

1.10 Aplica¸c˜ao de Manuten¸c˜ao

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

59

´

1.11 Indice de Fragmentos de C´odigo

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

61

1.12 Bibliografia

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

64

´

1.13 Indice de Ficheiros

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

65

´

1.14 Indice Remissivo

 

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

66

Vers˜ao: $Id:

androidDevel.nw,v

1.89

2013/11/13

20:46:31

avs

current

$

NOTA: partes do documento por completar ou desenvolver est˜ao marcadas com a palavra FIXME.

1.1

Introdu¸c˜ao

Este documento serve de apoio aos alunos da unidade curricular de Computa¸c˜ao M´ovel, que ´e dada em conjunto a alunos provenientes do terceiro ano de Sistemas de Informa¸c˜ao e Software, Redes de Comunica¸c˜ao e Telecomunica¸c˜oes, e Tecnologias de Comunica¸c˜ao Multim´edia (op¸c˜ao de Internet e Computa¸c˜ao M´ovel ). Dependendo da proveniˆencia, estes alunos nos anos anteriores aprenderam a programar em C#, Java, ActionScript e/ou Python. Este documento vai estar em permanente actualiza¸c˜ao (pelo que s´o raramente deve ser im- presso). A ultima´ vers˜ao pode ser descarregada de http://portodigital.pt/avs/cm2012-2c35/.

1

2

Computa¸c˜ao M´ovel

Em termos da bibliografia as referˆencias principais para a mat´eria abordada nesta unidade curricular s˜ao [Ableson et al. 2011], [Darcey e Conder 2011], [Mednieks et al. 2011], [Steele e To 2011], [Collins et al. 2012] e [Neil 2012].

1.2 Objectivos

S˜ao estes os objectivos desta unidade curricular:

1. (objectivo principal) Conseguir que o aluno crie programas para dispositivos m´oveis, es- tando ciente das suas diferen¸cas, vantagens e limita¸c˜oes face a aplica¸c˜oes para computadores desktops

2. (objectivo principal) Conseguir que o aluno consiga a partir da descri¸c˜ao de um problema ou da especifica¸c˜ao de um programa, n˜ao muito complexo mas tamb´em n˜ao trivial, pr´oprio para uma aplica¸c˜ao m´ovel, criar no sistema operativo Android um programa com algumas dezenas a poucas centenas de linhas de c´odigo que permita resolver esse problema ou implementar o pretendido;

3. (objectivo secund´ario) Familiarizar o aluno com as classes existentes nas bibliotecas stan- dards do Android;

4. (objectivo secund´ario) Familiarizar o aluno com o uso do ambiente de desenvolvimento in- tegrado 1 Eclipse para escrever c´odigo, compilar, fazer a depura¸c˜ao (debug), e pesquisar na documenta¸c˜ao das bibliotecas do Android.

1.3 Avalia¸c˜ao

FIXME avalia¸c˜ao cont´ınua, trabalhos individuais, etc

1.4 Instala¸c˜ao Ambiente Desenvolvimento Android

Esta sec¸c˜ao fornece instru¸c˜oes sobre onde ir buscar e como instalar dois ambientes de desenvol- vimento para Smartphones ou Tablets com o sistema operativo Android. Ambos os sistemas de desenvolvimento s˜ao baseados no Eclipse, mas um deles utiliza uma vers˜ao normal do Eclipse para desenvolvimento na linguagem de programa¸c˜ao Java (isto ´e, funciona `a custa da instala¸c˜ao de um Plugin), enquanto que o outro utiliza uma vers˜ao especial do Eclipse que j´a vem inclu´ıda no ficheiro de instala¸c˜ao e permite desenvolver para Android utilizando a linguagem de programa¸c˜ao C/C++.

A vantagem do primeiro sistema de desenvolvimento (disponibilizado pela Google) ´e que re-

presenta a maneira standard de desenvolver software para Android (usando Java), a vantagem do segundo sistema de desenvolvimento (disponibilizado pela MoSync AB) ´e que permite escrever programas em C/C++ que depois s˜ao convertidos para Java (de modo a poderem ser executados no Android), permitindo igualmente que a partir do mesmo c´odigo fonte se crie programas para outros tipos de Smartphones (iPhone, Symbian, etc.) As duas sec¸c˜oes que se seguem, criadas em 1 de Outubro 2012 pelo que se referem `as vers˜oes

de software existentes nessas datas, possuem objectivos distintos. A primeira apresenta a lista do software a instalar, consoante a vers˜ao do sistema operativo da m´aquina de desenvolvimento (Windows de 32 bits, Windows de 64 bits, Mac OS X, Linux), e a segunda sec¸c˜ao apresenta em detalhe o modo de instalar ambos os sistemas de desenvolvimento em Windows 7 Professional de 64 bits (o sistema operativo instalado na maioria dos computadores do ISMAI).

A sec¸c˜ao 1.4.4 sintetisa a informa¸c˜ao sobre novas vers˜oes do software que tenham sa´ıdo ap´os 1

de Outubro 2012 e chama a aten¸c˜ao para eventuais problemas, incompatibilidades ou diferen¸cas de comportamento.

1 IDE, Integrated Development Environment

$Id:

androidDevel.nw,v

1.89

2013/11/13

20:46:31

avs

current

$

ISMAI

Computa¸c˜ao M´ovel

3

1.4.1 Lista de Software a instalar

Para criar software para Smartphones ou Tablets com o sistema operativo Android, usando o am- biente de desenvolvimento Eclipse, ´e necess´ario obter e instalar nesta ordem, em fun¸c˜ao do sistema operativo e da arquitectura (32 bits ou 64 bits) da m´aquina utilizada para o desenvolvimento:

1. JDK (java development kit) 1.7.0_7 2

Windows XP, Vista ou 7 (32 bits): jdk-7u7-windows-i586.exe

Windows Vista ou 7 (64 bits): jdk-7u7-windows-x64.exe

Mac OS X (Lion e Mountain Lion): jdk-7u7-macosx-x64.dmg

Mac OS X (Snow Leopard 10.6.8): aparentemente o jdk-7u7-macosx-x64.dmg n˜ao fun- ciona nesta vers˜ao, utilizar o software update (actualiza¸c˜oes do sistema operativo) para automaticamente obter a ultima´ vers˜ao do JDK (1.6.0_35), n˜ao tentar instalar ou descarregar o software de outra forma. Para verificar a vers˜ao do Java instalada abrir o Terminal (Applications/Utilities/Terminal) e escrever “javac -version”, deve-se obter como resposta “javac 1.6.0_35

Linux 32 bits:

jdk-7u7-linux-i586.tar.gz

(ou

jdk-7u7-linux-i586.rpm

se

for para

um sistema que suporte RPMs)

Linux 64 bits:

jdk-7u7-linux-x64.tar.gz (ou jdk-7u7-linux-x64.rpm se for para um

sistema que suporte RPMs)

2. Eclipse 3 (tem de ser Eclipse 3.6.2 ou superior, podendo ser o Eclipse Classic, ou o Eclipse IDE for Java Developers, ou o Eclipse IDE for Java EE Developers 4 ):

Windows XP, Vista ou 7 (32 bits): eclipse-SDK-4.2.1-win32.zip (Eclipse Classic) ou eclipse-java-juno-SR1-win32.zip (Eclipse IDE for Java Developers)

Windows Vista ou 7 (64 bits): eclipse-SDK-4.2.1-win32-x86_64.zip (Eclipse Clas- sic) ou eclipse-java-juno-SR1-win32-x86_64.zip (Eclipse IDE for Java Developers)

Mac OS X Snow Leopard 10.6.8:

eclipse-SDK-4.2.1-macosx-cocoa-x86_64.tar.gz

(Eclipse Classic 64 bits) ou eclipse-SDK-4.2.1-macosx-cocoa.tar.gz (Eclipse Clas- sic 32 bits) ou eclipse-java-juno-SR1-macosx-cocoa-x86_64.tar.gz (Eclipse IDE for Java Developers 64 bits) ou eclipse-java-juno-SR1-macosx-cocoa.tar.gz (Eclipse IDE for Java Developers 32 bits)

Linux 32 bits:

Linux 64 bits:

3. Android SDK 5

eclipse-SDK-4.2.1-linux-gtk.tar.gz

eclipse-SDK-4.2.1-linux-gtk-x86_64.tar.gz

Windows XP, Vista ou 7 (32 bits): installer_r20.0.3-windows.exe

Windows Vista ou 7 (64 bits): installer_r20.0.3-windows.exe (idˆentico vers˜ao 32 bits)

Mac OS X Snow Leopard 10.6.8: android-sdk_r20.0.3-macosx.zip

Linux 32 bits (pode ser de 64 bits mas com capacidade para correr aplica¸c˜oes de 32 bits):

android-sdk_r20.0.3-linux.tgz

FIXME 4-oct-2012: below not yet updated

2 http://www.oracle.com/technetwork/java/javase/downloads/jdk7u7-downloads-1836413.html

3 http://www.eclipse.org/downloads/

4 E prefer´ıvel n˜ao se escolher o Eclipse IDE for Java EE Developers j´a que n˜ao se vai utilizar as funcionalidades

da Enterprise Edition do Java, de resto tanto faz, pode-se escolher o Eclipse Classic ou o Eclipse IDE for Java Developers

´

5 http://developer.android.com/sdk/index.html

ISMAI

$Id:

androidDevel.nw,v

1.89

2013/11/13

20:46:31

avs

current

$

4

Computa¸c˜ao M´ovel

4. Android Development Tools (ADT), plugin para o Eclipse:

(a)

Arrancar com o Eclipse, seleccionar Help > Install New Software

(b)

Clicar Add no canto superior direito

(c)

Na janela de di´alogo “Add Repository” que aparece colocar “ADT Plugin” no Name e na URL da Location colocar: https://dl-ssl.google.com/android/eclipse/ (se isto der problemas trocar https por http)

5. SDK tools, documenta¸c˜ao, duas plataformas Android, exemplos, e APIs espec´ıficas da Go- ogle e da Samsung:

(a)

Android SDK Platform-tools

(b)

Documentation for Android SDK

(c)

SDK Platform Android 2.3.4 (API Level: 10)

(d)

SDK Platform Android 3.1 (API Level: 12)

(e)

Samples 6 for SDK API 10

(f)

Samples for SDK API 12

(g)

Third party add-ons:

i. Google Inc. add-ons (dl-ssl.google.com), necess´ario para usar Google Maps ii. Samsung Electronics add-ons (innovator.samsungmobile.com)

6. Instalar o MoSync 7 2.5, que permite escrever um programa em C/C++ e automaticamente converter o mesmo para este poder ser executado em iOS (iPhone / iPad /iPod Touch), Android 1.5, 1.6, 2.1, Java ME MIDP 2, Symbian S60 (2nd, 3rd, 5th editions), Windows Mobile 5.0-6.5, Windows Pocket PC 2003, ou Windows Smartphone 2003. Espera-se 8 que at´e ao fim do ano de 2011 o Mosync passe a ter suporte para Blackberry e Windows Phone 7 (WP7).

Note-se que esta ´e uma forma alternativa de desenvolver software para o Android. Neste caso utiliza-se a linguagem de programa¸c˜ao C/C++ em vez de Java embora depois o c´odigo seja convertido 9 para Java pelo que corre nativamente no Android (e o mesmo c´odigo ´e como que convertido para a linguagem de programa¸c˜ao Objective C de modo a correr no iPhone).

Windows XP, Vista ou 7 (32 bits): MoSyncWindows-2.5.exe

Windows Vista ou 7 (64 bits): MoSyncWindows-2.5.exe (Nota: ´e prov´avel que depois de instalado n˜ao funcione a n˜ao ser que se instale um Java Run-time Environment (JRE) de 32 bits)

Mac OS X Snow Leopard 10.6.8: MoSyncOSX-2.5.dmg

Linux 32 bits: pode-se tentar criar o MoSync a partir do c´odigo fonte mas nem tudo ´e suportado 10 , pelo que n˜ao ´e aconselhado o uso do MoSync em Linux (excepto dentro de uma m´aquina virtual a correr Windows)

1.4.2 Windows 7 Pro 64 bits: Instalar JDK 1.6.0 64 bits + Eclipse 64 bits + Android SDK 32 bits + ADT Plugin + MoSync 32 bits + JRE 1.7.0 32 bits

A instala¸c˜ao em Windows 7 vers˜ao de 64 bits introduz alguns problemas visto que nem todas as ferramentas s˜ao de 64 bits (algumas s˜ao de 32 bits) pelo que ´e necess´ario resolver alguns problemas

6 Exemplos de c´odigo

7 http://www.mosync.com/download

8 http://www.mosync.com/content/mosync-roadmap

9 http://www.mosync.com/documentation/manualpages/runtime-architecture http://www.mosync.com/documentation/manualpages/building-mosync-source-linux

10

$Id:

androidDevel.nw,v

1.89

2013/11/13

20:46:31

avs

current

$

ISMAI

Computa¸c˜ao M´ovel

5

adicionais de modo a conseguir que elas fiquem a funcionar correctamente. O que ´e descrito abaixo foi testado numa m´aquina virtual criada especificamente para permitir efectuar este teste, pelo que se forem seguidos (nesta ordem) os passos aqui indicados o sistema deve ficar a funcionar correctamente:

1. Instala¸c˜ao de Windows 7 Professional com o Service Pack 1, vers˜ao de 64 bits, numa m´aquina virtual (neste caso o VMware Fusion 3.1.3 que suporta o Windows 7 Service Pack 1 de 64 bits, a correr em Mac OS X 10.6.8). Foi usada a vers˜ao inglesa do Windows 7 mas n˜ao h´a raz˜ao para se esperar problemas com a utiliza¸c˜ao da vers˜ao portuguesa.

2. Aplicar todas as actualiza¸c˜oes ao sistema operativo Windows 7 Pro e instalar um antivirus (neste caso foi usado o Microsoft Security Essentials 11 )

3. Em 28 de Julho 2011 a Oracle disponibilizou a nova vers˜ao do java, o Java Development Kit (JDK) 1.7.0. Embora de uma forma geral o JDK 1.7.0 seja compat´ıvel com o JDK 1.6.0_26 existe uma diferen¸ca ao n´ıvel do c´odigo gerado 12 (byte codes para a m´aquina virtual java) na medida em que a vers˜ao do ficheiro .class gerado pelo JDK 1.7.0 ´e a 51 (devido `a introdu¸c˜ao do invokedynamic byte code), e a vers˜ao dos ficheiros criados pelo JDK 1.6.0 ´e a 50 13 . Isto significa que nalgumas circunstˆancias se bem que n˜ao existam problemas em usar o Java Run-Time 1.7 para correr c´odigo de vers˜oes anteriores do Java podem existir problemas se se compilar com o JDK 1.7 e se executar com vers˜oes mais antigas do JRE. Assim sendo, para evitar problemas optou-se por se instalar a ultima´ vers˜ao do JDK 1.6 de 64 bits e, para resolver um problema de incompatibilidade entre 32 e 64 bits ao n´ıvel de carregar bibliotecas dinˆamicas (DLLs), instalar-se igualmente a vers˜ao 1.7 do JRE de 32 bits.

Instalar o JDK 1.6.0_26 escolhendo a vers˜ao de 64 bits 14 : jdk-6u26-windows-x64.exe

Se o JDK estiver instalado mas n˜ao estiver definida a vari´avel de ambiente JAVA_HOME algum software pode n˜ao encontr´a-lo. Para que isso n˜ao aocnte¸ca e para que a partir da linha de comando sem se colocar o caminho completo se possa executar o compilador de java (javac.exe) ´e necess´ario actualizar o PATH e criar o JAVA_HOME:

Control Panel / System and Security / System / Advanced system settings / Environ-

adicionar ao fim desta

algo de semelhante a “;c:\program files\java\jdk1.7.0_7\bin” (n˜ao esquecer de co- locar o ponto e v´ırgula como separador, muita cautela para n˜ao estragar o que j´a estava no Path, sen˜ao o computador pode deixar de funcionar correctamente). Criar igualmente uma nova vari´avel de ambiente chamada JAVA_HOME e colocar nela o valor “c:\program files\java\jdk1.7.0_7” (isto ´e, n˜ao tem o ponto e v´ırgula nem tem o subdirect´orio bin).

4. Instalar o 7-Zip 15 de modo a se ter uma ferramenta de linha de comando que permita descomprimir arquivos ZIP, e adicionar a localiza¸c˜ao do bin´ario do 7z e dos bin´arios do JDK ao PATH 16

ment Variables / System variables / seleccionar Path / Edit

11 http://www.microsoft.com/en-us/security_essentials/default.aspx

12 http://www.oracle.com/technetwork/java/javase/compatibility-417013.html

13 JDK 1.1 cria classes com a vers˜ao 45, JDK 1.2 vers˜ao 46, JDK 1.3 vers˜ao 47, JDK 1.4 vers˜ao 48, JDK 1.5 vers˜ao 49, JDK 1.6 vers˜ao 50, JDK 1.7 vers˜ao 51.

14 http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-download-400750.html

15 http://www.7-zip.org,

seleccionar a vers˜ao de 64 bits: 7z920-x64.msi

16 Abrir o pain´el de controle, seleccionar Systam and Security, System, Advanced System Settings, Environment Variables, System variables, seleccionar a vari´avel Path (pode ser necess´ario fazer scroll para a ver na lista de

vari´aveis do sistema), escolher Edit

j´a um no fim do texto, seguido do caminho completo para o direct´orio onde o 7-Zip foi instalado (se se acei- tou o valor do local fornecido por omiss˜ao para a instala¸c˜ao do programa este ficou instalado em “c:\Program Files\7-Zip”), outro ponto e v´ırgula, e o caminho completo para o direct´orio onde o JDK ficou instalado (se se aceitou o valor do local fornecido por omiss˜ao para a instala¸c˜ao do programa este ficou instalado em “c:\Program Files\jdk1.6.0_26” e os bin´arios est˜ao no subdirect´orio bin), pelo que se deve adicionar ao Path a string “;c:\program files\7-Zip;c:\Program Files\jdk1.6.0_26\bin”.

e adicionar ao fim do Variable value um ponto e v´ırgula se n˜ao existir

ISMAI

$Id:

androidDevel.nw,v

1.89

2013/11/13

20:46:31

avs

current

$

6

Computa¸c˜ao M´ovel

5. Descarregar o Eclipse 3.7.0 Classic 17 para Windows 64 bit: eclipse-SDK-3.7-win32-x86_64.zip. Mover o ficheiro zip para o direct´orio onde se pretende instalar o software (por exem- plo c:\Program Files) e descomprimir o ficheiro usando por exemplo o comando “7z x eclipse-SDK-3.7-win32-x86_64.zip”, isto cria o sub-direct´orio eclipse. Para correr o eclipse executar o programa “c:\Program Files\eclipse\eclipse.exe

6. Instalar o SDK do Android 18 : installer_r12-windows.exe.

NOTA IMPORTANTE: ´e muito prov´avel que ao instalar o SDK do Android dˆe o erro de

que n˜ao consegue encontrar o JDK, nesse caso basta seleccionar o bot˜ao de Back no wizard,

e a seguir voltar a seleccionar o bot˜ao de Next que na segunda passagem j´a encontra o JDK

(isto parece acontecer quando se mistura vers˜oes de 64 bits com vers˜oes de 32 bits, existem outras solu¸c˜oes para este problema mas esta ´e a mais simples 19 ).

Ao acabar a instala¸c˜ao aceitar a op¸c˜ao de deixar correr o SDK Manager do Android SDK Tools para instalar as imagens das plataformas que interessarem, ele selecciona automatica- mente um conjunto de plataformas, adicionar a essas j´a pr´e-seleccionadas as seguintes (basta clicar no nome do lado esquerdo e depois seleccionar o radio button Accept):

Google APIs by Google Inc., Android API13, revision 1

Google USB Driver Package, revision 4

Isto instala um total de 23 pacotes.

7. Instalar o Android Development Tools (ADT), plugin para o Eclipse:

(a)

Arrancar com o Eclipse, seleccionar Help > Install New Software

(b)

Clicar Add no canto superior direito

(c)

Na janela de di´alogo “Add Repository” que aparece colocar “ADT Plugin” no Name e na URL da Location colocar: https://dl-ssl.google.com/android/eclipse/ (se isto der problemas trocar https por http). Instalar os 6 pacotes embora s´o os 4 primei- ros sejam relevantes: Android DDMS, Android Development Tools, Android Hierarchy Viewer, Android Traceview, Tracer for OpenGL ES, Android Native Development To- ols. Ao instalar aceitar a licen¸ca e aceitar instalar conte´udo n˜ao assinado, depois de se rearrancar com o Eclipse em Help / About / Installation details no tab Installed software aparecem esses 4 ou 6 nomes ao lado do Eclipse SDK

8. No Eclipse seleccionar Window /Preferences, escolher Android do lado esquerdo, e colocar o direct´orio do SDK do Android, se ele ficou instalado no local sugerido por omiss˜ao trata-se de C:\Program Files (x86)\Android\android-sdk (aten¸c˜ao que como este local consiste num nome que tem espa¸cos embebidos isto pode originar um erro, ver Sec¸c˜ao 1.4.6)

A partir de agora j´a deve ser poss´ıvel ir ao Eclipse e seleccionar, File / New Project, expandir

a entrada Android, seleccionar Android Project, fazer Next, e deve ser vis´ıvel a possibilidade

de criar o projecto para um conjunto alargado de vers˜oes da API do Android (desde a 1.5

at´e `a 3.2)

9. Instalar o MoSync 20 2.5: MoSyncWindows-2.5.exe

NOTA IMPORTANTE: Muito provavelmente depois de se instalar o MoSync este d´a erro ao arrancar, algo do g´enero de n˜ao conseguir carregar uma biblioteca (apesar do fi-

cheiro existir no caminho indicado na mensagem de erro): “Failed to load the JNI shared li-

Trata-

brary ”C:\Program Files\Java\jdk1.6.0_26\bin\

se muito provavelmente do problema de se estar a usar o JRE que veio junto com o JDK e que portanto ´e de 64 bits e o MoSync estar `a espera de um JRE de 32 bits.

\jre\bin\server\jvm.dll”.

17 http://www.eclipse.org/downloads/

18 http://developer.android.com/sdk/index.html

19 http://stackoverflow.com/questions/4382178/android-sdk-installation-doesnt-find-jdk

20 http://www.mosync.com/download

$Id:

androidDevel.nw,v

1.89

2013/11/13

20:46:31

avs

current

$

ISMAI

Computa¸c˜ao M´ovel

7

A

melhor solu¸c˜ao para este erro ´e instalar agora (isto ´e, n˜ao instalar antes mas somente

se

e quando este erro aparece) a vers˜ao de 32 bits do Java Run-time Environment (JRE)

1.7.0. Ao se escolher esta vers˜ao facilita-se conseguir-se distinguir mais facilmente entre as 2 vers˜oes do Java, isto ´e, o JDK 1.6.0 + JRE 1.6.0 de 64 bits e o JRE 1.7.0 de 32 bits, j´a que se pode usar os comandos “java -version” ou “javac -version” para, respectivamente, se saber a vers˜ao do run-time e a vers˜ao do compilador de Java. Portanto neste caso instala-se o JRE 1.7.0 de 32 bits 21 : jre-7-windows-i586.exe

Ap´os o JRE 1.7.0 de 32 bits estar instalado voltar a tentar arrancar o MoSync e este erro deve

ter desaparecido e o programa deve arrancar normalmente.

E agora necess´ario proceder ao

registo do software criando um username e uma password e fornecendo um email, recebendo depois por email o link que activa o MoSync.

´

1.4.3 Mac OS X 64 bits: Instalar Eclipse 64 bits + Android SDK + ADT Plugin + MoSync

Usar as explica¸c˜oes detalhadas apresentadas na Sec¸c˜ao 1.4.2, adaptando-as ao ambiente Mac OS X:

1. Instalar o Eclipse IDE for Java Developers (vers˜ao para Mac OS X 64 bits) 22

2. Instalar o SDK do Android. Por exemplo descarregar o ficheiro com a ultima´

vers˜ao do

SDK 23 , abrir um terminal (/Applications/Utils/Terminal.app) e executar os seguintes

comandos:

7 Mac OS X: instalar o Android SDK 7

cd /

mkdir

cd /Developer2

unzip

/Developer2

~/Downloads/android-sdk_r15-macosx.zip

estando isto feito tem-se acesso ao SDK Manager. Escolheu-se instalar em /Developer2 para o caso de se ter instalado o Xcode da Apple em /Developer. Em Mac OS X o SDK Manager ´e o programa /Developer2/android-sdk-macosx/tools/android

3. Usando o SDK Manager instalar as imagens das plataformas que interessarem

4. Instalar o Android Development Tools (ADT), plugin para o Eclipse

5. No Eclipse seleccionar Eclipse / Preferences

/Android, e colocar em “SDK location” o

direct´orio onde se instalou o SDK, neste caso trata-se de /Developer2/android-sdk-macosx

6. Instalar o MoSync

1.4.4 Actualiza¸c˜oes Outubro 2011

A vers˜ao instalada nos computadores do ISMAI baseou-se no conte´udo da Sec¸c˜ao 1.4.2, que foi escrita em 31 de Julho 2011. Entretanto sairam novas vers˜oes de software:

Em 16 de Setembro 2011 foi disponibilizada a vers˜ao de produ¸c˜ao do MoSync 2.6; inclui 24 actualiza¸c˜oes da API (nomeadamente m´aquina fotogr´afica, manipular os contactos, fontes nativas e sensores, e uma API multi-plataforma para o Facebook); suporta a utiliza¸c˜ao de emuladores nativos (isto ´e, usar o emulador do iOS ou do Android em vez do MoRE); e suporta profiling 25 no MoRE.

21 http://www.oracle.com/technetwork/java/javase/downloads/java-se-jre-7-download-432155.html

22 http://www.eclipse.org/downloads

23 http://dl.google.com/android/android-sdk_r15-macosx.zip

24 http://www.mosync.com/documentation/manualpages/whats-new-mosync-26-pyramid

25 Ver gloss´ario

e seleccionar eclipse-java-indigo-SR1-macosx-cocoa-x86_64.tar.gz

ISMAI

$Id:

androidDevel.nw,v

1.89

2013/11/13

20:46:31

avs

current

$

8

Computa¸c˜ao M´ovel

Em 25 de Outubro 2011 foi disponibilizada a vers˜ao de produ¸c˜ao do MoSync 2.7; inclui 26 suporte para HTML5, suporte para a C++ Standard Template Library (STL), e suporte para a NFC (Near Field Communication) API

Em 22 de Setembro 2011 foi disponibilizado o SDK r13 do Android que inclui o SDK platform Android 3.2 (API level 13).

Em 19 de Outubro 2011 foi disponibilizado o SDK r14 do Android que inclui o SDK platform Android 4.0 (API level 14), e em 28 de Outubro o SDK r15 (bug fixes do r14)

Apesar disso originar software ligeiramente diferente do dispon´ıvel no ISMAI, nos computadores pessoais de cada aluno n˜ao parece haver problema em actualizar o MoSync da vers˜ao 2.5 para a 2.7 nem em usar o SDK Android r15, desde que no Android tamb´em se instale as APIs 2.3.4 (API level 10), 3.1 (API level 12) e os Samples (exemplos) relativos ao SDK API 10 e API 12.

1.4.5 APIs do Android

O API level identifier no Android serve para identificar qual ´e a vers˜ao mais alta da framework

que ´e suportada pelo dispositivo, permite que as aplica¸c˜oes digam qual ´e a vers˜ao da framework que necessitam, e permite que o sistema operativo controle que n˜ao sejam instaladas no disposi- tivo aplica¸c˜oes que necessitem de vers˜oes da framework Android que n˜ao sejam suportadas nesse dispositivo. As aplica¸c˜oes no ficheiro manifest.xml podem usar o elemento <uses-sdk> para dizer qual

´e a vers˜ao m´ınima da framework que suportam (android:minSdkVersion), a vers˜ao da fra- mework para a qual a aplica¸c˜ao foi desenhada (android:targetSdkVersion, s´o passou a existir a partir da API 4), e a vers˜ao m´axima da framework na qual a aplica¸c˜ao consegue funcionar (android:maxSdkVersion, s´o passou a existir a partir da API 4), esta ultima´ deve ser usada com bastante cautela porque pode originar que uma aplica¸c˜ao desapare¸ca do telem´ovel logo a seguir

ao sistema operativo ser actualizado e as frameworks do Android s˜ao concebidas para serem com-

pat´ıveis com as vers˜oes anteriores. Devido a isto vers˜oes do Android superiores `a 2.0.1 deixaram de obedecer a android:maxSdkVersion durante a instala¸c˜ao ou actualiza¸c˜ao de software, somente o Android Market ´e que continua a utilizar este atributo como um filtro ao apresentar as aplica¸c˜oes dispon´ıveis para download. Eis a lista das vers˜oes do SDK, da API e da vers˜ao do SQLite3 utilizada, e as respectivas datas

de disponibiliza¸c˜ao:

19-Ago-2008: Android SDK 0.9 Beta

25-Set-2008: Android SDK 1.0 R1

8-Dez-2008: Android SDK 1.0 R2 (vers˜ao 1.0 base, API 1)

7-Mar-2009: Android SDK 1.1 R1 (vers˜ao 1.1 base 1 1, API 2)

15-Abr-2009: Android SDK 1.5 Pre

28-Abr-2009: Android SDK 1.5 R1

26-Jun-2009: Android SDK 1.5 R2

17-Jul-2009: Android SDK 1.5 R3 (vers˜ao 1.5 cupcake, API 3), SQLite 3.5.9

16-Set-2009: Android SDK 1.6 Release 1 (vers˜ao 1.6 donut, API 4), SQLite 3.5.9

28-Out-2009: Android SDK 2.0 Release 1 (vers˜ao 2.0 eclair, API 5), SQLite 3.5.9

4-Dez-2009: Android SDK 2.0.1 Release 1 (vers˜ao 2.0.1 eclair 0 1, API 6), SQLite 3.5.9

26

http://www.mosync.com/documentation/manualpages/whats-new-mosync-27-pyramid

$Id:

androidDevel.nw,v

1.89

2013/11/13

20:46:31

avs

current

$

ISMAI

Computa¸c˜ao M´ovel

9

13-Mai-2010: Android SDK R5

21-Mai-2010: Android SDK R6

6-Dez-2010: Android SDK R7 (vers˜ao 2.1.x eclair MR1, API 7), SQLite 3.5.9

6-Dez-2010: Android SDK R8 (vers˜ao 2.2.x froyo, API 8), SQLite 3.6.22

27-Jan-2011: Android SDK R9 (vers˜ao 2.3, 2.3.1, 2.3.2 gingerbread, API 9), SQLite 3.6.22

23-Fev-2011: Android SDK R10 (vers˜ao 2.3.3 e 2.3.4 gingerbread MR1, API 10), SQLite 3.6.22

16-Jul-2011: Android SDK R11 (vers˜ao 3.0.x honeycomb, API 11), SQLite 3.7.4

16-Jul-2011: Android SDK R12 (vers˜ao 3.1.x honeycomb MR1, API 12), SQLite 3.7.4

23-Set-2011: Android SDK R13 (vers˜ao 3.2 honeycomb MR2, API 13), SQLite 3.7.4

19-Out-2011: Android SDK R14 (vers˜ao 4.0.1 ice cream sandwich, API 14), SQLite 3.7.4

28-Nov-2011: Android SDK R15 (vers˜ao 4.0.2 ice cream sandwich, API 15), SQLite 3.7.4

16-Dez-2011: Android SDK R16 (vers˜ao 4.0.3 ice cream sandwich, API 15), SQLite 3.7.4

Mar-2012: Android SDK R17

Apr-2012: Android SDK R18

Apr-2012: Android SDK R19

9-Jul-2012: Android SDK R20 (vers˜ao 4.1.2 jelly bean, API 16)

13-Nov-2012: Android SDK R21 (vers˜ao 4.2 jelly bean, API 17)

24-Jul-2013: Android SDK R22 (vers˜ao 4.3 jelly bean, API 18)

??-Out-2013: Android SDK R2? (vers˜ao 4.4 kit kat, API 19)

Detalhes das principais funcionalidades associadas a cada vers˜ao do SDK podem ser obtidas das release notes 27 , detalhes das principais funcionalidades associadas a cada n´ıvel da API podem ser obtidas de http://developer.android.com/guide/appendix/api-levels.html

1.4.6 Configurar o Eclipse para criar uma aplica¸c˜ao Android

Depois de se instalar o software de desenvolvimento para Android (ver Sec¸c˜ao 1.4.2 ou Sec¸c˜ao 1.4.3) ´e necess´ario configurar o Eclipse para que este permita criar programas em Android. Sendo assim deve-se efectuar a seguinte sequˆencia de passos:

1. Criar um novo Workspace no caso do workspace do Eclipse que estivermos a usar j´a conter

” e

c´odigo de outras aplica¸c˜oes Java. Para isso usa-se “File / Switch workspace / Other escolhe-se um novo nome.

2. Embora neste momento j´a se possa escolher “File / New / Android project”, a verdade ´e que n˜ao conseguimos terminar o wizard (isto ´e, s´o podemos premir cancel ) porque n˜ao conseguimos seleccionar um SDK target

27

http://mac.softpedia.com/progChangelog/Google-Android-SDK-Changelog-31208.html

ISMAI

$Id:

androidDevel.nw,v

1.89

2013/11/13

20:46:31

avs

current

$

10

Computa¸c˜ao M´ovel

3. Para que um ou mais SDK targets estejam dispon´ıveis ´e necess´ario ir a “Window / Preferen-

ces / Android ” (em Mac OS X ´e “Eclipse / Preferences para o SDK Location.

Note-se que se estivermos numa m´aquina Windows 7 de 64 bits e o SDK for instalado no local seleccionado por omiss˜ao ele fica em “C:\Program Files (x86)\Android\android-sdk”, e isso origina problemas devido ao caminho possuir espa¸cos embebidos. Embora se possa premir o bot˜ao Apply e mal isso seja feito apare¸ca a lista com as diversas vers˜oes do SDK que est˜ao instalados, se depois criarmos uma aplica¸c˜ao Android usando “File / New / Android Project”, se depois se tentar compilar e correr essa aplica¸c˜ao obt´em-se o erro:

/Android ) e preencher o caminho

10 erros: erro se o Android SDK foi instalado num local com espa¸cos no nome 10

[2011-10-30

22:11:36

-

lixo1]

Launching

a

new

emulator

with

Virtual

Device

’Avs1’

[2011-10-30

22:11:36

-

Emulator]

invalid

command-line

parameter:

Files.

[2011-10-30

22:11:36

-

Emulator]

Hint:

use

’@foo’

to

launch

a

virtual

device

named

’foo’.

[2011-10-30

22:11:36

-

Emulator]

please

use

-help

for

more

information

note-se que o erro “invalid command-line parameter: Files.” adv´em do local de instala¸c˜ao ser “C:\Program Files (x86)\Android\android-sdk”, isto ´e, o Files da mensagem de erro ´e a parte do nome que vem logo a seguir ao espa¸co. A solu¸c˜ao ´e no “Windows / Preferences / Android ” alterar o caminho passando a usar o nome curto do direct´orio (nome com um m´aximo de 8 caracteres e que n˜ao possui espa¸cos). Para saber qual ´e o nome curto de um direct´orio ir para uma consola (linha de comando) do Windows e executar o comando “dir /x c:\”, isto deve dizer algo do g´enero que o nome curto de Program Files (x86) ´e PROGRA~2, nesse caso no “Windows / Preferences / Android ” substituir “C:\Program Files (x86)\Android\android-sdk” por “C:\PROGRA~2\Android\android-sdk”. A partir da´ı j´a se consegue compilar e executar no emulador programas Android.

1.4.6.1 Threads

Hoje em dia a maioria dos programas que aceitam interac¸c˜oes com o utilizador j´a n˜ao se podem dar ao luxo de serem single-threaded, isto ´e, s´o terem um fluxo ou sequˆencia de execu¸c˜ao, e tˆem de ser multi-threaded, isto ´e, possuem mais do que uma sequˆencia de execu¸c˜ao a executar simultaneamente 28 . Uma thread ´e um processo mais leve, isto ´e que utiliza muito menos recursos do que criar um novo processo. Todas as threads existem dentro do mesmo processo, pelo que partilham recursos incluindo a mem´oria e os ficheiros abertos. A desvantagem ´e que qualquer outra thread pode potencialmente ter acesso aos dados de uma thread e se algo correr mal numa thread o processo pode fazer crash, o que termina todas as threads. Cada thread est´a associada com uma instˆancia da classe Thread. Uma aplica¸c˜ao cria uma thread e fornece o c´odigo que deve ser executado nessa thread. Existem duas maneiras de fazer isto:

Criar um objecto que implemente o interface Runnable. O interface Runnable define um unico´ m´etodo, run() que ´e suposto conter o c´odigo que ´e para ser executado na thread. O objecto que implementa o interface Runnable ´e passado ao construtor da classe Thread.

Criar uma subclasse de Thread. Como Java n˜ao suporta heran¸ca m´ultipla ´e normalmente prefer´ıvel a primeira op¸c˜ao, isto ´e, a nossa classe implementar o interface Runnable em vez de ser uma subclasse de Thread, desta forma pode herdar de quem quiser

O exemplo que se segue cria 3 threads, cada uma delas dorme, respectivamente, durante 300,

Note-se que pode ocorrer a excep¸c˜ao

200 e 400 milisegundos antes de acordar e continuar.

28 Mesmo em sistemas com processadores s´o com um core utiliza-se programas multi-threaded, nesses casos quando uma thread ´e interrompida ou executa at´e ao fim da unidade de tempo que lhe foi atribu´ıda outra thread fica com o controle do CPU.

$Id:

androidDevel.nw,v

1.89

2013/11/13

20:46:31

avs

current

$

ISMAI

Computa¸c˜ao M´ovel

11

InterruptedException que ´e lan¸cada pelo sleep quando outra thread tenta interromper esta thread enquanto sleep est´a activo. Este programa origina o seguinte output:

Hello

da

thread

um,

vou

dormir

durante

300

milisegundos

Hello

da

thread

dois,

vou

dormir

durante

200

milisegundos

Hello

da

thread

tr^es,

vou

dormir

durante

400

milisegundos

Hello

outra

vez

da

thread

dois,

acordei

Hello

outra

vez

da

thread

um,

acordei

 

Hello

outra

vez

da

thread

tr^es,

acordei

11 version/androidDevel/HelloNumaThread.java 11

import

java.lang.InterruptedException;

 

public

class

HelloNumaThread

implements

Runnable

{

protected

String

nome;

 

protected

int

duracaoDoSono;

public

HelloNumaThread(String

s,

int

tempo)

{

nome

=

s;

duracaoDoSono

=

tempo;

}

public

void

run()

 

{

System.out.println("Hello

da

thread

"

+

nome

+

",

vou

dormir

durante

"

+

 

duracaoDoSono

+

"

milisegundos");

 
 

try

{

 
 

Thread.sleep(duracaoDoSono);

 
 

}

catch

(InterruptedException

e)

{

 

System.out.println("Hello

outra

 

vez

da

thread

 

"

+

nome

+

",

fui

acordada");

 

}

System.out.println("Hello

outra

vez

da

thread

"

+

nome

+

",

acordei");

}

public

static

void

main(String

args[])

{

 

Thread

t1,

t2,

t3;

t1

=

new

Thread(new

HelloNumaThread("um",

300));

t2

=

new

Thread(new

HelloNumaThread("dois",

200));

t3

=

new

Thread(new

HelloNumaThread("tr^es",

400));

t1.start();

t2.start();

t3.start();

}

}

This code is written to file version/androidDevel/HelloNumaThread.java. Defines:

HelloNumaThread,

Uses main().

never

used.

ISMAI

$Id:

androidDevel.nw,v

1.89

2013/11/13

20:46:31

avs

current

$

12

Computa¸c˜ao M´ovel

1.5 Arquitectura das Aplica¸c˜oes Android

As aplica¸c˜oes Android recorrem `a utiliza¸c˜ao de um conjunto de 6 classes principais (Intent, IntentFilter, Activity, Service, BroadcastReceiver, e ContentProvider), e `a utiliza¸c˜ao de um conjunto de 3 ficheiros XML principais (AndroidManifest.xml, main.xml, e strings.xml). Eis o contexto da sua utiliza¸c˜ao e as suas caracter´ısticas principais:

1. Classe Intent: representa aquilo que temos a inten¸c˜ao de fazer (por exemplo ver o conte´udo de um registo dos contactos, abrir um site internet, mostrar uma dada factura). Desta forma um Intent deve ser visto como uma declara¸c˜ao de uma necessidade que necessita de ser satisfeita (por um IntentFilter).

O atributo ac¸c˜ao (action) de um Intent ´e normalmente um verbo, por exemplo VIEW, PICK, ou EDIT. Para ver o conte´udo de um registo podia-se por exemplo usar android.content.Intent.ACTION_VIEW

O atributo dados (data) de um Intent ´e uma URI. Por exemplo para ver todos os contactos usa-se content://contacts/people, e para ver o contacto 18 usa-se

content://contacts/people/18

Para por exemplo obter os registos dos contactos usar-se-ia algo do g´enero de:

12a

Android: ver os registos da base de dados de contactos 12a

Intent

pickIntent

=

new

Intent(

Intent.ACTION_PICK,Uri.parse("content://contacts/people"));

startActivity(pickIntent);

A identifica¸c˜ao do IntentFilter que deve ser usado ´e efectuada em run-time (em vez de em compile time). H´a a possibilidade de se substituir funcionalidade standard do Android substituindo um IntentFilter (mas n˜ao esquecer que isto torna mais dif´ıcil por exemplo o suporte t´ecnico remoto j´a que deixa de se ter a certeza de numa dada situa¸c˜ao qual ´e o comportamento efectivo do dispositivo m´ovel em quest˜ao)

2. Classe IntentFilter: declara¸c˜ao da capacidade e interesse em disponibilizar uma dada fun-

cionalidade para quem dela necessite (um Intent). Os IntentFilter’s tˆem de ser registados, esse processo ´e feito `a custa do ficheiro AndroidManifest.xml

3. Classe Activity: embora uma aplica¸c˜ao Android n˜ao tenha de ter um GUI, se o tiver ent˜ao ter´a obrigatoriamente pelo menos um Activity. Normalmente existe uma rela¸c˜ao de um para um entre um Activity e um ecr˜a vis´ıvel. Um Activity efectua o display de um interface gr´afico e responde a eventos iniciados pelo sistema e pelos utilizadores. Uma das tarefas principais efectuadas pela classe Activity ´e efectuar o display dos elementos do interface gr´afico (que s˜ao implementados na forma de Views) e s˜ao definidos em ficheiros XML com o layout. Normalmente a interac¸c˜ao ´e ass´ıncrona (isto ´e, n˜ao se fica bloqueado `a espera do resultado), mas se se quiser uma interac¸c˜ao s´ıncrona ela ´e poss´ıvel (utilizando o m´etodo startActivityForResult())

12b

Android: exemplo de uma Activity 12b

package

com.msi.manning.chapter1;

 

import

android.app.Activity;

 

import

android.os.Bundle;

public

class

Activity1

extends

Activity

{

@Override

public

void

onCreate(Bundle

savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

}

Uses onCreate() 27.

$Id:

androidDevel.nw,v

1.89

2013/11/13

20:46:31

avs

current

$

ISMAI

Computa¸c˜ao M´ovel

13

4. Classe Service: se a aplica¸c˜ao ´e suposto ter um tempo de execu¸c˜ao longo (por exemplo uma tarefa de backup) ent˜ao ela deve ser colocada num servi¸co. Os servi¸cos devem ser iniciados periodicamente ou quando forem necess´arios sendo nesse caso iniciados como reac¸c˜ao a um alarme do sistema, e devem terminar a execu¸c˜ao (de modo a libertar recursos) quando a tarefa estiver terminada. Os servi¸cos n˜ao possuem um GUI [Ableson et al. 2011, p´ag. 18]

13 Android: exemplo de um Service 13

package

com.msi.manning.chapter1;

 

import

android.app.Service;

 

import

android.content.Intent;

 

import

android.os.IBinder;

 

import

android.util.Log;

 

public

class

Service1

extends

 

Service

implements

Runnable

{

public

static

final

String

tag

=

"service1";

 

private

int

counter

=

0;

@Override

 

protected

void

onCreate()

{

super.onCreate();

 

Thread

aThread

=

new

Thread

(this);

 

aThread.start();

}

public

void

run()

{

while

(true)

{

try

{

 

Log.i(tag,

"service1

firing

:

#

"

+

counter++);

Thread.sleep(10000);

 
 

}

catch(Exception

ee)

{

 

Log.e(tag,ee.getMessage());

 
 

}

}

}

@Override

 

public

IBinder

onBind(Intent

 

intent)

{

return

null;

 

}

}

Uses onCreate() 27.

ISMAI

$Id:

androidDevel.nw,v

1.89

2013/11/13

20:46:31

avs

current

$

14

Computa¸c˜ao M´ovel

5. Classe BroadcastReceiver: aplica¸c˜oes que pretendem reagir a um evento global (como por exemplo a recep¸c˜ao de uma mensagem ou o telefone tocar). O registo pode ser feito de 2 maneiras diferentes [Ableson et al. 2011, p´ag. 19]:

(a)

Colocando uma tag <receiver> no AndroidManifest.xml que descreve o nome da classe BroadcastReceiver e enumera os seus <IntentFilter>’s. Neste caso a aplica¸c˜ao n˜ao necessita de estar a executar para ser chamada a lidar com um evento global

(b)

Registando-se em run-time (isto ´e quando estiver a correr) usando o m´etodo registerReceiver

Os BroadcastReceiver n˜ao possuem um GUI e devem demorar um tempo muito curto

a executar (semelhante ao tempo associado a um interrupt handler ). Se a tarefa pode

demorar bastante tempo a executar ent˜ao o BroadcastReceiver deve ´e iniciar um Service para executar a funcionalidade pretendida

6. Classe ContentProvider: para a aplica¸c˜ao gerir dados (ver Sec¸c˜ao ??)

7. Ficheiro AndroidManifest.xml: existe uma rela¸c˜ao de um para um entre um destes ficheiros

e a aplica¸c˜ao correspondente. Eis um exemplo:

14 Android: exemplo de um AndroidManifest.xml 14

<?xml

<manifest

version="1.0"

encoding="utf-8"?>

xmlns:android="http://schemas.android.com/apk/res/android"

package="com.msi.manning.unlockingandroid">

<uses-permission

android:name="android.permission.RECEIVE_SMS"

/>

<application

android:icon="@drawable/icon">

<activity

android:name=".Activity1"

android:label="@string/app_name">

<intent-filter>

<action

<category

</intent-filter>

android:name="android.intent.action.MAIN"

/>

android:name="android.intent.category.LAUNCHER"

</activity>

<receiver

android:name=".MySMSMailBox"

<intent-filter>

>

/>

<action

android:name="android.provider.Telephony.SMS_RECEIVED"

</intent-filter>

</receiver>

</application>

</manifest>

/>

8. Ficheiro main.xml: usado para descrever o layout dos componentes do interface gr´afico. No Eclipse pode ser editado directamente em modo texto ou manipulado graficamente, podendo misturar-se os dois tipos de edi¸c˜ao

9. Ficheiro strings.xml: usado para se colocar strings (texto, etiquetas, mensagens, etc) que possam necessitar de ser localizadas ou adaptadas consoante o idioma da aplica¸c˜ao. No Eclipse pode ser editado directamente em modo texto ou manipulado recorrendo a um in- terface gr´afico, podendo misturar-se os dois tipos de edi¸c˜ao

$Id:

androidDevel.nw,v

1.89

2013/11/13

20:46:31

avs

current

$

ISMAI

Computa¸c˜ao M´ovel

15

1.5.1 Hello World em Android

Apresentam-se aqui duas vers˜oes da aplica¸c˜ao Hello World em Android, a primeira baseada so- mente em dois ficheiros (HelloAndroid1.java e AndroidManifest.xml) mas utilizando um estilo de programa¸c˜ao que se bem que mais simples n˜ao ´e o aconselh´avel j´a que lhe falta flexibili- dade, e a segunda baseada em quatro ficheiros (HelloAndroid2.java, strings.xml, main.xml, AndroidManifest.xml) recorrendo `a t´ecnica normal que deve ser utilizada para criar aplica¸c˜oes Android.

1.5.1.1 Hello World em Android mas sem usar o estilo do Android

15a

version/androidDevel/helloWorld1/HelloAndroid1.java 15a

 
 

package

pt.ismai.cm2011;

 

import

android.app.Activity;

import

android.os.Bundle;

import

android.widget.TextView;

public

class

HelloAndroid1

extends

Activity

{

 

@Override

public

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

 

TextView

tv

=

new

TextView(this);

tv.setText("Hello

World

em

Android,

vers~ao

simplificada");

setContentView(tv);

}

 

}

This code is written to file version/androidDevel/helloWorld1/HelloAndroid1.java. Defines:

 

HelloAndroid1,

used

in chunk 15b.

 

Uses onCreate() 27.

 
 

´

E importante a coloca¸c˜ao do “.” no in´ıcio do “<activity android:name”.

15b

version/androidDevel/helloWorld1/AndroidManifest.xml 15b

 
 

<?xml

version="1.0"

encoding="utf-8"?>

 

<manifest

xmlns:android="http://schemas.android.com/apk/res/android"

package="pt.ismai.cm2011"

android:versionName="1.0">

android:versionCode="1"

<uses-sdk

<application

android:minSdkVersion="3"

/>

android:icon="@drawable/ic_launcher"

android:label="@string/app_name">

<activity

android:name=".HelloAndroid1"

android:label="@string/app_name">

<intent-filter>

<action

<category

</intent-filter>

android:name="android.intent.action.MAIN"

/>

android:name="android.intent.category.LAUNCHER"

/>

</activity>

</application>

</manifest>

This code is written to file version/androidDevel/helloWorld1/AndroidManifest.xml. Uses HelloAndroid1 15a.

Para criar este projecto em Eclipse fazer:

1. File / New / Android Project

2. Colocar HelloAndroid1 no Project Name

ISMAI

$Id:

androidDevel.nw,v

1.89

2013/11/13

20:46:31

avs