fbpx

Android Service com Delphi 10 Seattle

Serviço Android com Delphi 10 Seattle

No último dia 31 de agosto foi lançado oficialmente a nova versão do Delphi. E a meu ver uma das novidades que mais causou inovação foi a possibilidade de criação de Serviços no Android.

A nova versão foi batizada de Delphi 10 Seattle. Acredito eu que nunca um lançamento de versão foi tão comentado como esse. São várias inovações e nesta postagem demostrarei a criação de um serviço para Android, isso nos permitirá rodar nossa aplicação em segundo plano. Vamos começar!

Definições Importantes

Um Serviço Android é uma aplicação sem interface de usuário que executa tarefas em segundo plano.

Existem essencialmente dois tipos de serviço:

  • Start Service: Este serviço é iniciado por um aplicativo Android. O serviço pode ser executado em segundo plano por tempo indeterminado, mesmo se o aplicativo é fechado. Este tipo de serviço geralmente executa uma única tarefa e pára automaticamente depois de terminar.
  • Bind Service: Este serviço só funciona enquanto ele estiver ligado a um aplicativo Android. Existe uma interação entre a aplicação e o serviço, e permanece ativo até que o aplicativo libera. Mais do que uma aplicação pode ligar-se ao mesmo serviço.

Agora que já temos algumas definições básicas vamos ao novíssimo RAD Studio 10 Seattle.

Criando o Android Service Delphi Project

Crie um novo projeto Delphi, acessando File -> New -> Other e repare que passamos a contar com a opção Android Service, vamos selecionar esta opção, como na imagem abaixo:

Selecione Android Service no Delphi X

Selecionada esta opção precisamos definir qual opção de serviço a ser criado, no nosso caso vamos escolher Local Service, abordaremos cada uma das opções mais adiante.

Opção de Android Service Local ou Remote

Após este processo, o projeto será carregado na IDE, vamos no Project Manager (Ctrl + Alt + F11) renomear nosso projeto para ServicoPost e a Unit aberta para AndroidServiceDMUnt. No AndroidServiceDM vamos adicionar em sua cláusula uses da seção implementation a seguinte linha:

implementation

{%CLASSGROUP 'FMX.Controls.TControl'}

{$R *.dfm}
uses Androidapi.JNI.App;

Para finalizarmos vamos definir o comportamento do nosso serviço quando inciado.

Vamos de Start Service

Basicamente existem 2 tipos de inicialização de serviços Start Service:

  • START_STICKY é utilizada para serviços que são explicitamente iniciados e parados, conforme necessário.
  • START_NOT_STICKY é usada para serviços que só deve permanecer em execução durante o processamento de todos os comandos enviados a eles.

Vamos optar nessa postagem pela inicialização START_STICKY, assim nosso serviço será iniciado e permanecerá em execução mesmo que a aplicação seja fechada. Para isso vamos inserir a seguinte linha no OnStartCommand:

function TAndroidServiceDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
  Result := TJService.JavaClass.START_STICKY; // Manterá o Serviço Executando

end;

Agora vamos criar a aplicação que irá hospedar nosso serviço.

Criando a Aplicação Hospedeira

Bem, no Project Manager selecione a opção Add New Project e selecione New -> Multi-Device Application, em seguida selecione Blank Application, assim automaticamente a IDE passará a trabalhar com o Grupo de Projetos, contendo o Serviço criado anteriormente e a aplicação hospedeira que iremos codificar a partir de agora. Ainda no Project Manager renomeie a o segundo projeto para AplicacaoPost, e sua unit para frmAplicacaoUnt. Vamos salvar todo o Grupo de Projetos, chamado aqui de ArtigoServicoAndroid, selecionando File -> Save All (Shift + Ctrl + S) .

Nota: Como trata-se de um grupo de projeto particularmente costumo criar um diretório para o Grupo do Projeto e internamente a este um diretório para cada projeto, e os arquivos são salvos nos diretórios de seus projetos respectivos. Veja na imagem como ficou a minha visualização de arquivos/diretórios:Diretórios Grupo de Projeto

Antes de mais nada, vale lembrar que para nosso 2 projetos abertos a Target Plattform será Android e as  suas Debug Options de ambos devem ser Release.

Compilando e disponibilizando o serviço

Agora dê um Build no projeto libServicoPost.so e vamos torná-lo disponível a nossa aplicação executando os seguintes passos:

No Project Manager selecione o projeto AplicacaoPost,  clique com o botão direito sobre a Android SDK e selecione a opção Add Android Service.

Adicionando o Serviço à aplicação

Em seguida será exibido uma janela para que você informe a localização do diretório contendo seu serviço.

Nota: Este deve ser o diretório que contém os subdiretórios gerados após o Build/Compilação do Servico:  Android e JavaClasses. (No nosso caso devemos selecionar o diretório ServicoPost).

Feito isso clique no botão Next e se tudo deu certo a imagem abaixo será exibida:

Confirmar Diretório do Serviço Android

Agora clique em Finish e repare que o Projeto  AplicacaoPost passa a ter “acesso” ao serviço gerado pelo Projeto ServicoPost, carregando-o em suas bibliotecas.  Confira o resultado final no Project Manager:

Serviço Android com Delphi X

Vamos codificar nossa aplicação!

Codificando a Aplicação Hospedeira

Na cláusula uses seção Interface da Unit frmAplicacaoUnt declare a seguinte namespace após as já existentes:  System.Android.Service.

interface

uses
  ...,
  //Adicionado para ter acesso ao Servico
  System.Android.Service;

Na seção private do Form vamos adicionar uma conexão com o Local Service:

private
 { Private declarations }
 ConexaoServico : TLocalServiceConnection;

Com isso já temos o processo necessário, agora só precisamos acioná-lo.

Vamos inserir no form da aplicação um botão que irá iniciar o Serviço, altere sua propriedade Text para Iniciar. E no seu evento OnClick vamos codificar o seguinte:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ConexaoServico := TLocalServiceConnection.Create;
  ConexaoServico.StartService('ServicoPost');
end;
Nota: O método StartService() recebe como parâmetro o nome do Serviço, ou seja, do nosso projeto LibServicoPost.so devemos retirar o "Lib" e o ".so" para obtermos o nome do Serviço: ServicoPost.

Apenas para ilustrar vamos inserir no form uma imagem a seu gosto, ao final a interface de sua aplicação será parecida com a imagem abaixo:

Interface da Aplicação Usando Serviço Android

Executando a aplicação com o Serviço

Salve novamente o Grupo de Projeto e execute a aplicação para ver o resultado. Abaixo disponibilizei  dessa aplicação e serviço dessa postagem, Confira e mais adiante as explicações sobre os modelos de Serviço disponibilizados no Wizard do Delphi.

Vídeo do Grupo de Projetos desenvolvido nesta postagem

Serviço Local ou Remoto?

Existem 2 possibilidades de execução dos Serviços :

  • Local Service (Serviço Local) Selecione esta opção para criar um serviço local. Esta é a situação mais comum em que o aplicativo Android interage diretamente com o serviço, estando em execução no mesmo processo. A seleção dessa opção inclui a seguinte linha no arquivo Android Manifest da aplicação Android ligada ao serviço Android:
<service android:exported="false" android:name="com.embarcadero.services.<service_name>" />
  • Remote Service (Serviço Remoto) Selecione esta opção para criar um serviço remoto, este pode ser utilizado por outras aplicações para além da que hospeda o serviço. A seleção dessa opção inclui a seguinte linha no arquivo Android Manifest da aplicação Android ligada ao serviço Android:
<service android:exported="true" android:name="com.embarcadero.services.<service_name>" />

 Tanto Local Service quanto Remote Service, cada uma das opções incluem um DataModule com a classe TAndroidService da unit System.Android.Service, com os eventos necessários.

Conclusão: Ficou 10! Delphi 10!

Enfim, ficou muito simples a criação de aplicações Android capazes de rodar em segundo plano com o novo Delphi 10 Seattle! Para maiores detalhes sobre a ferramenta acesse o site.

Mais informações sobre a criação de Serviços no Android acesse na Embarcadero Docwiki.

Webinar: Novidades do Delphi 10 Seattle

Lembrando que na próxima quinta-feira, dia 10 de setembro, vai rolar o webinar gratuito de lançamento do RAD Studio 10 Seattle. Inscreva-se e conheça todas as novidades:

• Incrível suporte a Windows 10
• IDE com o dobro de poder para grandes projetos
• Mudanças e aperfeiçoamentos de qualidade, estabilidade e documentação
• RAD C++ para Windows 10
• …e muito mais!

Inscreva-se!

Embarcadero Conference 2015

Vem aí a EMBARCADERO CONFERENCE 2015! Edição histórica de comemoração a 20 anos de Delphi! Desenvolvimento multidispositivo, Beacons, Internet das Coisas, Windows 10, Dicas truques e técnicas de programação e muito mais novidades no maior encontro de desenvolvedores da América Latina.

As inscrições já estão abertas, aproveite os preços promocionais, já estamos no segundo lote de credenciais, reserve sua vaga e faça sua inscrição aqui.

Nos vemos lá!

Link para download: Faça o download do exemplo com os fontes aqui!


Comente