# Programação de Dispositivos Móveis
# Teórica 1
## Definição de Dispositivo Móvel
* Um **dispositivo móvel** (handheld) é um aparelho eletrónico com as seguintes características:
1. **Computação:** capacidade de processar e armazenar dados;
2. **Interatividade com Utilizador:** possui dispositivos de entrada e saída de dados embutidos (ecrã, teclado, etc) que são usados para interagir com um utilizador. Dispositivos que não permitem a interatividade com um utilizador não são considerados dispositivos móveis;
3. **Portabilidade:** são sobretudo definidos pela sua capacidade de serem movidos com frequência e facilidade. Qualquer dispositivo móvel deve funcionar consistentemente quer em repouso quer em movimento, independentemente da proximidade a uma fonte de alimentação ou ligação física à Internet (possuem baterias recarregáveis);
4. **Dimensões e peso:** algumas definições de dispositivos móveis ditam que apenas os dispositivos que podem ser utilizados com uma só mão é que devem ser considerados móveis (componentes eletrónicos com maior grau de miniaturização);
5. **Comunicações sem fios:** possuem normalmente tecnologia que permite a comunicação com outros dispositivos semelhantes, computadores e sistemas, com redes de computadores ou de telecomunicações, ou com telefones portáteis. Estes dispositivos, atualmente, são capazes de acederem à Internet através de redes bluetooth e Wi-Fi.
## Razões para trabalhar na plataforma Android
* São 4 as razões que justificam a colocação de algum foco no desenvolvimento de aplicações para a plataforma Android:
* Em 1º lugar --> a plataforma Android **é gratuita**, e é simples encontrar ferramentas também gratuitas e prontamente disponíveis para desenvolvimento de aplicações.
* Em 2º lugar --> esta é atualmente a plataforma que **domina o mercado global** em termos de smartphones e tablets;
* Em 3º lugar --> esta **linguagem de programação é a mais utilizada hoje em dia**, seguida de C e de C++;
* Em 4º lugar --> a **enorme fragmentação**, quer em termos de versões de SO, quer em termos de hardware e das suas especificações, fazem do Android a plataforma ideal para ganhar alguma destreza com a programação para dispositivos móveis.
# Teórica 2
## Desenvolvimento de Interfaces de Utilizador
* Uma **Interface de Utilizador** um programa de computador,ou parte dele, que permite que o utilizador comunique com esse computador ou com outras partes do programa;
### Programas Sequênciais
* são os programas que controlam o fluxo de interação de uma forma bastante rígida. Os utilizadores esperam que o programa peça inputs para aí interagirem com o mesmo (controlo interno);
* **Pontos Positivos:**
* Funcionam sempre em linha de comandos;
* Aguentam todas as funções que quiserem (à custa de variáveis e de uma estratificação em árvore e divisão em modos).
* **Pontos Negativos:**
* Pouco intuitivos;
* Dificuldade em captar ações do utilizador fora do comportamento comum do progranma
* Funções disponíveis só após mudança de modo;
* Quem controla a interação é o programa.
### Interfaces de Utilizador Orientadas por Eventos
* Este modelo, utilizado na maior parte das aplicações móveis modernas, **permite disponibilizar um conjunto maior de funcionalidades em simultâneo e de forma intuitiva**, correspondendo ainda a uma simplificação na estrutura do programa. Neste caso, é o programa que espera pelo utilizador (controlo externo), nomeadamente que este lhe forneça um dos possíveis inputs.
* A **manipulação** destas interfaces pode ser **feita de forma direta**, um **evento** corresponde a uma ação ou ocorrência que um programa foi capaz de detetar e tratar, depende do tipo de acontecimento, por ex:
* clique de um dos botões do rato;
* a posição do cursor ou tecla pressionada;
* o programa ao qual se destina o evento, entre outros.
* **A rotina principal de captação de eventos é da responsabilidade do Sistema Operativo** (SO), que a executa constantemente e **coleciona os eventos numa pilha First In First Out** (FIFO), assegurando que estes são tratados pela ordem que chegaram;
* Na programação orientada por eventos, **um programa pode entrar no estado de sleep quando não existem eventos**, pelo que o SO pode atribuir tempo de processamento a outros programas;
* A programação baseada por eventos é feita recorrendo ao modelo de delegação de eventos, baseado nas entidades **Controlos**, **Consumidores** e **Interfaces**:
1. **Os Controlos** (widgets) serão a fonte do evento (ex: botão);
2. **Os Consumidores** (Listeners) correspondem às rotinas de tratamento desses eventos;
3. **As Interface** são a forma normalizada de comunicação entre os controlos e os consumidores.
* Aquando da implementação, o programador tem de definir os controlos e registar o conjunto de eventos que deseja escutar para cada um deles, bem como implementar a interface do evento que pretende escutar;
* A captura e reencaminhamento dos eventos é feito de forma transparente para o programador, que não precisa de se preocupar com esses detalhes;
* A programação orientada por eventos assenta em vários pressupostos:
1. A **interface gráfica é composta por vários objetos interativos** e elementos cuja localização é conhecida, e que podem ser **estruturados hierarquicamente em árvore** (MAIS IMPORTANTE);
2. A **profundidade desta hierarquia não costuma ser superior a 5 ou 6 níveis**, caso contrário também se torna difícil de gerir e desenhar, para além de **afetar negativamente a performance da mesma**.
* O comportamento das aplicações cuja programação é orientada por eventos é inteiramente definido pelas rotinas de tratamento desses eventos. Em termos de programação, são essas rotinas que definem grande parte do fluxo, lógica e funcionalidades das aplicações. O desenvolvimento da aplicação pode começar pelo planeamento da interface de utilizador e evoluir para a implementação das rotinas de tratamento;
* Existem dois tipos genéricos de elementos úteis para o desenho de interfaces de utilizador orientadas por eventos:
1. Objetos interativos de entrada ou saída;
2. Contentores: são elementos que podem conter outros contentores ou objetos interativos (botões ou caixas de texto) e permitem organizar o aspeto gráfico da aplicação.
* **Eventos mais comuns usados para construir aplicações móveis:**
1. **Botões** de pressão com rato, toque ou caneta: podem gerar eventos de clicados, premidos ou libertados e duplamente clicados;
2. **Teclado:** pode gerar eventos de tecla premida ou libertada;
3. **Movimentação do rato ou cursor:** pode gerar eventos de entrada e saída de regiões;
4. **Os controlos das janelas ou da aplicação:** podem gerar eventos de fecho, minimização, redimensionamento, etc.
* **Os objetos interativos têm acesso aos métodos de outros objetos no mesmo nível hierárquico** ou acima;
* **A comunicação entre objetos interativos pode ser feita de 3 formas:**
1. **Manipulação direta de propriedades de outros objetos**;
2. **Avisando o elemento imediatamente acima na hierarquia** acerca das alterações a fazer, sendo que este terá acesso a outros elementos do mesmo grau hierárquico;
3. **Gerando outros eventos** que são capturados e tratados pelas rotinas dos consumidores registadas pelo objeto interativo destino.
* **Fonte -->** é o objeto interativo onde o evento é gerado.
## Modelo - Visão - Controlador
* A arquitetura padrão para Aplicações Móveis é o **Modelo-Visão-Controlador** (MVC);
* A **arquitetura Modelo-Visão-Controlador é um modelo de arquitetura para desenvolvimento de software que separa a lógica da aplicação, a representação da informação e a interação do utilizador** através de 3 componentes:
1. O **modelo**;
2. A **visão**;
3. O **controlador**.
* A arquitetura **MVC** é muito popular na indústria de desenvolvimento de Aplicações Web e Móveis. Tem como **objetivos**:
* favorecer a sua escalabilidade e manutenção;
* o a portabilidade e a reutilização de código;
* permitir um maior grau de abstração por parte de cada um dos elementos da equipa de implementação e desenho.
* Implementar esta arquitetura significa normalmente dividir o projeto de uma aplicação em vários ficheiros e pastas, cada um afeto a uma destas partes:
1. Esquema de dados, e acesso e manipulação desses dados(SQL+PHP);
2. Aspeto visual da aplicação (HTML+CSS);
3. Código que liga o aspeto visual aos dados (Javascript, PHP).
### Modelo
* O Modelo é o componente central do MVC;
* Encapsula o estado interno e consiste na implementação dos objetos, métodos ou rotinas que capturam o **comportamento base da aplicação**;
* O Modelo **processa os dados ou muda o seu estado**;
* **Só** pode interagir com o componente Controlador, sendo completamente independente da interface do utilizador;
* É o Modelo que contém as classes e métodos para **aceder e manipular bases de dados** ou memória persistente, assim como toda a informação que pode ser exibida ao utilizador através de uma visão;
* No MVC, **um utilizador nunca interage diretamente com o Modelo**;
* A implementação das classes pertencentes ao Modelo da aplicação devem ser o **menos específicas possível em relação à representação dos dados**, para favorecer a **portabilidade** do código;
* A sua **interface de programação deve ser clara e consistente** ao longo do período de vida da aplicação (já que isso garante que o controlador pode comunicar corretamente com o modelo).
### Visão
* No MVC, uma Visão consiste numa possível representação dos dados da aplicação;
* É na Visão que se **definem as Interfaces de Utilizador**;
* **importante separar este componente da lógica aplicacional porque podem existir várias representações para o mesmo conjunto de dados**, por um lado, permite que a equipa de desenvolvimento seja dividida pelas várias áreas, por outro, permite que a **interface do utilizador possa ser desenvolvida em paralelo e melhorada ao longo do tempo**;
* A separação entre Modelo e Visão é crucial em aplicações Web;
* No caso das aplicações móveis, essa separação também acontece de forma vincada. Na **plataforma Android**, por ex., é permitido que **a interface do utilizador seja definida em ficheiros XML** completamente independentes do código da aplicação escrito em Java.
### Controlador
* O Controlador é o intermediário entre o Modelo, as Visões e o utlizador;
* É possível encontrar referências em que se define o Controlador como intermediário dos outros dois componentes e não do utilizador, sendo que este interage apenas com a Visão, onde são gerados os eventos;
* Apesar dos eventos poderem ser gerados sobre objetos da Visão, **é no Controlador que estão as rotinas de captura e reencaminhamento desses eventos**;
* **São procedimentos do Controlador que atualizam os objetos da Visão e que despoletam mudanças no estado da aplicação através do envio de eventos para o Modelo**;
* O Controlador tem a responsabilidade de coordenar as tarefas de uma aplicação ou a gestão do ciclo de vida de objetos;
* As **rotinas de tratamento de eventos** incluem-se no Controlador. Estas rotinas invocam métodos do Modelo, que são os que melhor sabem manipular os dados.
### Comunicação entre Componentes
1. **O utilizador interage com a aplicação através de uma ou mais Visões e do Controlador**;
* As Visões mostram a informação do Modelo ao utilizador, que interage com a interface para manipular essa informação.
2. Essa **interação gera eventos**, capturados pelo Controlador, que os processa e envia para as rotinas de tratamento definidas no Modelo;
3. O **Controlador pode imediatamente atualizar uma ou mais Visões aquando da receção de um evento**;
4. **Não existe comunicação direta entre o Modelo e as Visões**, qualquer alteração que precise ser refletida na interface tem de ser comunicada ao Controlador. A **notificação contém os dados do Modelo necessários à alteração**.