Por que eu devo ler este artigo:Este artigo apresenta uma importante forma de integração entre processos (Inter-Process Communication) existente no Android, a AIDL (Android Interface Definition Language). Sua utilização é pouco difundida, porém se torna uma excelente opção quando o assunto é comunicação entre aplicativos.

AIDL é particularmente útil quando diferentes aplicativos necessitam se comunicar entre si para troca de informações através de uma interface bem definida e com suporte a Multithreading. Diferentemente do uso de Messenger com Bound Services, com AIDL você é obrigado a criar um arquivo .aidl que contém a declaração da interface de integração, o que ajuda as aplicações clientes a saberem quais operações estão disponíveis bem como seus respectivos argumentos e retornos.

A plataforma Android é rica em recursos quando o assunto é integração entre aplicativos, por exemplo: Intents, Broadcast Receivers e Services. Este último é interessante quando existir a necessidade de executar um processamento longo em background, é dessa forma que inúmeras aplicações realizam suas operações mais pesadas sem interferir na interface com o usuário.

No Android é possível criar serviços de dois tipos: Started e Bound. O primeiro é quando um componente da aplicação inicia o serviço chamando o método startService() e o segundo tipo é quando um componente da aplicação chama bindService().

Os serviços Started e os serviços Bound possuem usos distintos, por exemplo, quando se deseja executar uma única operação em background sem retornar uma resposta ao componente que iniciou o serviço, o mais indicado é um serviço do tipo Started.

Por outro lado, quando se deseja uma interação maior com o serviço, ou seja, enviar e receber parâmetros ou até mesmo realizar chamadas IPC, o tipo mais adequado é o serviço do tipo Bound.

Apesar das diferenças de uso, no nível da programação independente de qual o tipo que está sendo criado, ambas as classes de serviço devem herdar direta ou indiretamente de android.app.Sevice (Figura 1) e possuir a declaração no arquivo AndroidManifest.xml (Listagem 1).

Figura 1. Herança a ser obedecida.

Listagem 1. Declaração de um serviço no AndroidManifest.xml.


  <manifest ... >
    ...
    <application ... >
        <service android:name=".MyService" />
        ...
    </application>
  </manifest>

E se tratando de comunicação por meio de serviços do tipo Bound, um método que merece atenção é o onBind(), da classe android.app.Service, a qual retorna uma instância da interface IBinder. Essa é uma abstração da API para uma importante função do sistema operacional Linux que o Android encapsula, as chamadas IPC.

Felizmente no Android existe um framework chamado Binder Framework (veja a Figura 2) que possui uma estrutura montada especificamente para abstrair importantes passos da comunicação entre processos do Linux.

Figura 2. Android Binder Framework.

Sobre os principais elementos do Binder Framework, podemos citar:

· Binder Driver - Driver no nível do kernel que encapsula a comunicação entre os processos;

· Binder Protocol - Protocolo de baixo nível (baseado no ioctl) usado para se comunicar com o Binder Driver;

· IBinder Interface - Conjunto de comportamentos bem definidos que os objetos Binder devem implementar;

· AIDL ...

Quer ler esse conteúdo completo? Tenha acesso completo