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:
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.
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:
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.
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:
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:
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:
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!
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!