Pular para o conteúdo principal

Antes do hello world um pouco de teoria (Android)

Eu sei que o legal de desenvolver é pular a parte chata (documentação e teoria) e ir direto para o desenvolvimento, fazendo de cara o bom e velho hello world, ok sem problema, mas depois é bom dar uma olhada nos fundamentos para ter noção das possibilidades da plataforma.

 

Um aplicativo dentro do sistema Android

As aplicações Android são codificadas em Java, depois de tudo compilado, código e recursos são colocados em um pacote, com extensão .apk, esse é o “instalador” da apicação desenvolvida.

Depois de instalado, a aplicação fica em seu próprio “sand box”:

  • O Android é um SO baseado em Linux, cada aplicação é tratada como um usuário distinto;
  • Cada aplicação recebe um ID de usuário único, onde apenas esse usuário possui permissão de acesso aos arquivos da aplicação;
  • Cada processo tem sua própria máquina virtual (VM), então o código de um aplicativo é executado isoladamente de outras aplicações.
  • Cada aplicativo é executado em seu próprio processo, que inicia quando um dos componentes da aplicação precisa ser executada e encerra caso contrário para a liberação de memória;

Desta forma, o sistema Android implementa o princípio de privilégio mínimo. Ou seja, cada aplicação, por padrão, só tem acesso aos componentes que ele necessita para fazer o seu trabalho e nada mais. Isso cria um ambiente muito seguro em que um aplicativo não pode acessar partes do sistema para o qual não é dado a permissão.

Porém existem maneiras de compartilhar dados com outras aplicações ou mesmo acessar outros serviços:

  • É possível configurar duas aplicações com o mesmo ID, de forma que ambas podem compartilhar seus recursos;
  • Um aplicativo pode solicitar permissão para acessar os dados do dispositivo, como contatos do usuário, mensagens SMS, o armazenamento (cartão SD), câmera, Bluetooth e outros. Todas as permissões devem ser concedidas pelo usuário no momento da instalação.

 

Componentes de aplicação

São os blocos de construção de uma aplicação, onde cada um permite uma maneira de entrada do sistema para a aplicação. Nem todos os componentes são pontos de entrada real para o usuário e alguns dependem uns dos outros, mas cada um existe como uma entidade própria e desempenha um papel específico, cada um é um bloco único que ajuda a definir o comportamento global da aplicação.

Existem quatro tipos diferentes de componentes de aplicação. Cada tipo serve a um propósito diferente e tem um ciclo de vida distinto que define como o componente é criado e destruído, são eles:

Activity

O activity representa uma tela de inteface com o usuário, uma aplicação pode conter várias activitys cada uma com seu propósito e a aplicação pode iniciar de qualquer uma delas se assim for permitido. Um exemplo poderia ser um activity de login, outro de menu e outro de cadastro, a menos que exista algum controle é perfeitamente possível iniciar a aplicação de qualquer uma delas.

Services

Os serviços não possuem interface com o usuário, possuem como propósito executar operações em segundo plano, mesmo quando a aplicação não esta ativa, como por exemplo realizar verificações para a aplicação quando o usuário estiver em outra ou tocar uma música por exemplo

Content provider

Sua função é gerenciar dados do aplicativo, como arquivos ou banco de dados. Ele também é capaz de permitir que outros aplicativos acessem esses dados, um exemplo disso é o content provider do Android que fornece informações de contatos do usuário.

Broadcast receivers

É o componente que recebe mensagens de sistema, como por exemplo desligamento de tela ou bateria fraca, também podem ser usados para criar notificações para o usuário. É comumente usado para iniciar serviços.

 

Ativando componentes

Três dos quatro tipos de componentes activitys, services e broadcast receivers são ativados através de uma mensagem assíncrona chamado intent. Intents são componentes individuais que se ligam uns aos outros em tempo de execução.

Para as activityse services, o intent define a ação a ser executada (por exemplo, para "ver"ou "mandar" alguma coisa), e pode especificar o URI dos dados para agir sobre (entre outras coisas que o componente a ser iniciado necessita de saber ).

Para broadcast receivers, o intent simplesmente define a mensagem a ser (por exemplo, uma transmissão para indicar a bateria do dispositivo é reduzido inclui apenas uma seqüência de ação que indica "a bateria está baixa").

O content provider, não é ativado por intents, ele é ativado por um pedido de ContentResolver. O content resolver manipula todas as operações diretas com o content provider. Isso deixa uma camada de abstração entre o content provider e as informações sobre o componente requerente (por segurança).

 

O arquivo manifest

Para que o Android possa iniciar um componente de nosso aplicativo, ele precisa antes de mais nada conhece-lo, por isso todos os componentes devem ser declarados no AndroidManifest.xml (fica na raiz de nossa aplicação). Além de nossos componentes também devem ser declarados os recursos do aparelho que serão utilizados, como acesso ao cartão SD ou navegação na internet, bibliotecas utilizadas, nivel de API entre outras coisas.

Recursos

Em geral as aplicações são formadas por muito mais do que código, como imagens, sons, estilos, definições de layout, cores, enfim uma infinidade de outras coisas.

Com recursos fica mais fácil realizar uma mudança no estilo das telas por exemplo sem a necessidade de alterar o código da aplicação, para acessar os recursos basicamente é necessário apenas que se conheça seu ID.

Um novo projeto Android vem com três grupos diferentes de recursos, drawable (aqui ficariam as imagens usadas pelo sistema), layout (aquios arquivos XML que definem as telas do sistema) e values (arquivos XML no estili INI, com nome e um valor).

Encerrando

Bom era isso, se você chegou até aqui tenho certeza que agora possui uma ótima noção de como as coisas funcionam no Android, para ver na integra o documento de fundamentos sobre o Andoird (sem tradução meia boca) é só acessar aqui.

Comentários

  1. Interessante!!!

    É por isso que o pessoal escreve um "Bye bye World" após o "Hello World" já que não sabem bem como as coisas funcionam.

    ResponderExcluir
  2. como faço para criar uma função armazenada cujo o parametro é um número decimal de no maximo tres algarismos e que retorne seu valor por extenso?
    P.S se puder me ajudar ficarei muito grato.
    obrigado e até mais.

    ResponderExcluir
  3. Olá Amaury nunca precisei fazer nada nesse sentido, mas encontrei um site onde fizeram (http://pedroabs.wordpress.com/2011/05/24/projeto-extenso-121-cento-e-vinte-e-um/), lá ele explica a lógica e também disponibiliza o código.

    ResponderExcluir

Postar um comentário

Obrigado por Participar do programero, fique a vontade para agradecer, retificar, perguntar ou sugerir.

Postagens mais visitadas deste blog

Iniciar e Parar Serviços do Windows (Delphi)

Em certas ocasiões nos deparamos com a necessidade de manipular determinadas atividades do SO, como iniciar ou parar um banco de dados, ou qualquer outro serviço que esteja funcionando no momento. Segue abaixo um código que encontrei na Internet para tal finalidade (não me recordo à fonte, assim que eu a encontrar colocarei).
Iniciar Serviço:

uses WinSvc;
//
// start service
//
// return TRUE if successful
//
// sMachine:
//   machine name, ie: \SERVER
//   empty = local machine
//
// sService
//   service name, ie: Alerter
//
function ServiceStart(
  sMachine,
  sService : string ) : boolean;
var
//
  // service control
  // manager handle
  schm,
//
  // service handle
  schs   : SC_Handle;
//
  // service status
  ss     : TServiceStatus;
//
  // temp char pointer
  psTemp : PChar;
//
  // check point
  dwChkP : DWord;
begin
  ss.dwCurrentState := -1;
// connect to the service
  // contr…

Alterar cores do PageControl (Delphi)

O padrão Windows todo cinza não é muito atraente, por isso quando nos utilizarmos do PageControl podemos alterar suas cores e fontes da seguinte maneira:
Em primeiro lugar devemos alterar a propriedade OwnerDraw para TRUE;
Depois implementar seu método DrawTab da seguinte maneira: //pinta a fonte
Control.Canvas.Font.Color:=clBlack;
//
// pinta a paleta / aba
Control.Canvas.brush.Color:=clSkyBlue;

PageControl1.Canvas.Rectangle(Rect);
Control.Canvas.TextOut(Rect.left+5,Rect.top+3,PageControl1.Pages[tabindex].Caption);
// pinta a parte interna (tabsheet)
PageControl1.Pages[TabIndex].brush.Color := Control.Canvas.brush.Color;
PageControl1.Pages[TabIndex].Repaint;

Caso a intenção seja manter cada aba com seu próprio estilo basta adicionar um CASE filtrando o índice das abas: case TabIndex of
  0: Control.Canvas.Font.Color:=clBlack;
  1: Control.Canvas.Font.Color:=clWindow;
  2: Control.Canvas.Font.Color:=clRed;
en…

Listar arquivos existentes em diretório (Delphi)

Mostraremos uma maneira simples e prática para listar o conteúdo de um diretório com a opção de incluir nessa listagem os arquivos de seus subdiretórios. No exemplo abaixo temos um Edit para receber o diretório a ser pesquisado um CheckBox para indicar se os subdiretórios entrarão na pesquisa um botão para efetuar a pesquisa e um Memo para listar os arquivos encontrados, no final um Edit que receberá o cálculo final (em bytes) da soma do tamanho dos arquivos. procedure TForm1.Button1Click(Sender: TObject);
begin
  tamanhoTotal := 0;
  memLista.Lines.Clear;
  ListarArquivos(edtDiretorio.Text, chkSub.Checked);
  Edit1.Text := IntToStr( tamanhoTotal );
end;
procedure TForm1.ListarArquivos(Diretorio: string; Sub:Boolean);
var
  F: TSearchRec;
  Ret: Integer;
  TempNome: string;
begin
  Ret := FindFirst(Diretorio+'\*.*', faAnyFile, F);
try
while Ret = 0 do
begin
if TemAtributo(F.Attr, faDirectory) then
begin
if (F.Name <> '.') And (F.Name &l…