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!







Fiz tudo igual ao Post.. mas quando inicio o Serviço a aplicação trava e para de responder.
O que posso fazer?
Olá Alexandre! Seja bem vindo!
O ideal seria fazer uma revisão no projeto, qual versão Android e que aparelho você está utilizando?
Estou editando o post e adicionando um link para download do exemplo.
Baixe lá!
Obrigado por sua participação e até a próxima!
Muito bom Landerson.
Mas como faço para colocar uma notificação no android service a cada 5 minutos?
Olá Rubens… bem vindo!
Eu conversei um dos desenvolvedores participantes deste processo, o mesmo me reportou ainda não estaria o Serviço comportando o componente TTimer… isso momentaneamente impossibilitaria essa ação.
Até lá vamos aguardar novidades por parte da Embarcadero, essa funcionalidade seria muito boa hein?!
Obrigado por sua participação, grande abraço e até a próxima.
Parabéns pelo post.
Me permita uma pergunta fora deste post.
Estou usando em uma app xe7. O componente web browser observei que ele não tem supporte flash.
Como solução provisória chamei de um botão atraves de uma. Intent um browser com suporte a flash(dolphin) deu certo…mas a pagina é aberta no browser e não na aplicacção.
Alguma sugestão para fazer isso na propria app, ou seja utilizando webbrowser ?
Olá Marcos, bem vindo!
Realmente não sei como proceder… lamento não conseguir ajudá-lo na situação, mas talvez uma busca nos foruns da Embarcadero possa te trazer algum progresso.
Desde já agradeço sua participação!
Boa tarde,
Percebi que você exibe um push com mais de uma linha em seu exemplo.
Como consigo fazer isso, em minha aplicação quando a notificação é longa aparece somente uma linha.
Olá Gustavo… bem vindo!
Existe nos exemplos do Delphi o ListView Multi Deatail… dá uma olhadinha no link pode ajudá-lo.
Antes disso eu mandava o comando de quebra de linha… mas agora está mais fácil!!!
Espero tê-lo ajudado.
Obrigado por sua participação e até a próxima!
Olá Landerson, bom dia. Estou tentando montar um serviço que avisa quando tiver mensagens no servidor, para o usuário abrir o app. Fiz do jeito que você indicou e deu certo, mas quando coloco um restclient ele trava, indicando um erro: activity not found, maybe you are in a service. Já tentei de várias formas e nada.
O que preciso fazer?
Olá Marcio… na verdade a situação citada acaba sendo bem superficial… precisaria visualizar o que está acontecendo e acompanhar para tentar entender já que não tenho conhecimento sobre o projeto aí.
Por essa questão do Serviço ainda ser algo bem novo, ainda teremos alguns testes até conseguirmos adaptá-lo às diversas possibilidades que cada um de nós vislumbra em nossos cotidianos não é mesmo?!
Bem, se possível mantenha-me atualizado sobre seu progresso aí.
Grande abraço e mais uma vez obrigado por sua participação.
Olá Landerson, obrigado pela resposta. Na verdade não achei nada que me ajudasse. Tentei colocar um componente trestclient pra puxar umas mensagens de um servidor e ele dá essa mensagem de erro. Não funciona. Já tentei de várias formas, mas sempre retorna a mensagem : activity not found, maybe you are in a service. Vi que o timer nao rola mesmo, ai coloquei em thread com sleep, mas empaca nessa bendita mensagem de erro. Para simular esse problema, coloca o TrestClient em um service e tenta, por ele, puxar um json de um servidor. Já dá erro ao instanciar o serviço
Excelente post, justamente o que eu estava procurando, funcionou perfeitamente. Como teste tentei colocar um timer pra dar uma notificacao a cada 10 segundos , porém nada acontece, o que pode ser?
Olá Leonardo!
Bem infelizmente, o TTimer ainda não está compatível com o Serviço em Android… conversei com um desenvolvedor participante do projeto e o mesmo me passou que estão trabalhando nisso… até lá nos cabe aguardar esse recurso que será incrível pra nós hein?!
Grande abraço e até a próxima!
Olá Landerson, boa tarde.
Na verdade, isso é mais um desabafo do que uma dúvida. Estou me sentindo meio enganado com relação a essa nova versão do delphi, quando se trata de serviços. Todo lugar que se procura sempre achamos o mesmo exemplo. Qualquer outra coisa que se faça, dá erro no programa e não encontramos respostas. Já pesquisei e perguntei em vários sites e na embarcadero e ninguém responde nada. Eu só preciso que dentro do meu serviço, eu coloque um componente TRestClient e esse acesse um webservice pra verificar se há mensagens, de tempos em tempos. Não roda nem a pau. Aparece o erro que descrevi acima.
Já existe na embarcadero uma pergunta no link https://forums.embarcadero.com/thread.jspa?threadID=117951, como perguntado no último comentario. Vc teria uma ideia ou venderam pra gente uma falsa promessa? Porque em nenhum lugar encontra-se essas limitações..
Olá Márcio realmente não sei informar e nem sanar sua questão. Eu tentei efetuar o mesmo processo di serviço, quando consegui acesso a um post e perguntei lá sobre a questão e a resposta foi essa. Sugeriria contato direto com a Embarcadero Brasil, e peça uma orientação.
Realmente não tenho muito como auxiliá-lo neste caso.
Grande abraço
Ola, Eu tenho uma solução
https://www.youtube.com/watch?v=u9x8VqjQXmQ
Amigo, muito bom o post. Fiz deu certinho. Agora, uma pergunta. Vc sabe me dizer como levantar esse serviço automaticamente quando o celular é ligado?
Olá Luis, pretendo abordar o assunto numa postagem futura… mas para ir tentando algo aí sugiro um estudo sobre: BOOT_COMPLETED.
Desde já agradeço sua participação e até a próxima!
Pois é, como fazer agora para o serviço iniciar automaticamente no boot do celular. Se alguém tiver alguma sugestão publica ai.
Olá Junior, bem vindo! Como respondido no comentário acima você precisa estudar sobre BOOT_COMPLETED.
Precisará da permissão no serviço para e também dessa ACTION no arquivo de manifesto.
Pretendo futuramente publicar algo sobre o assunto, mas ainda não tenho previsão.
Obrigado por sua particpação!
Olha, eu pesquisei um blog que fala sobre o autoboot do aplicativo delphi, realmente funcionou comigo, você tem que recompilar o dex, eu já to a dias fazendo testes pra anexar a compilação desta classes junto com o dex do aplicativo, o problema e que o delphi faz isso quando usa o serviço, por isso, parece que ele substitui o dex quando compila, bom, eu percebi que na compilação do serviço o delphi pega os templates em java e compila, eu acho que e neste ponto que podemos inserir o comportamento do BOOT_COMPLETED, por que não adianta somente adicionar permissão e no manifesto precisa de class BrodCast publicada para que ele entenda, eu estou apanhando. Eu consigo fazer a aplicação autoiniciar, pelo boot, mas não consigo, mas compilando por fora ele perde o serviço no dex, com isso não fica serviço ativo. Veja o histórico de compilação que o delphi gera, temos que fazer aquilo que ele faz por arquivo bat de em algum momento compilar nossas class de boot. Se eu conseguir envio noticias para vocês.
Ótimas observações Euler, eu iniciei estudos e um exemplo aqui, no meu caso ele entra em execução no boot_completed mas exibe a mensagem que precisa ser fechada. Ainda estou evoluindo e estudando, vou pedir ajuda aos grandes mestres lá da Embarcadero matriz pra saber onde estou errando. Assim que conseguir alvo estarei compartilhando como sempre. Obrigado pela participação!
Landerson Gomes, juro por deus, que consegui fazer! CARA, FICOU TOP!
Me manda seu e-mail, que vou lhe mandar umas instruções por e-mail e o projeto exemplo, eu não tenho tempo para fazer uma publicação, mas você faz uma publicação sobre o tópico e da os meus direitos de créditos se não se importar.
Bom, agora posso iniciar meus aplicativos, por que tudo pra min depende de webservice, thread e autoboot, e a piramide de qualquer software.
Que show garoto!!!
Publico aqui de boa… sem problemas e os créditos são mais que seus,
Já te mandei o e-mail, conversamos mais por lá!
E parabéns, vencer um desafio desses é gostoso demais não é?!
Parabéns e sucesso aí com o aplicativo.
Amigo, manda pra mim também. Preciso urgente. Luiscamargobr@gmail.com
Amigo ja lhe enviei e para Landerson tbm. Ele tem a manhã de criar uma publicação e disponibilizar pra todos. Abraço!
Manda pra mim tbm, por gentileza.
Envia pra mim tbm, por gentileza.
luanivys@hotmail.com
Obrigado
Olá Amigo!
favor manda pra mim também. juniorba@live.com
Grato.
ae grande Landerson…
estou passando por um problema no meu app com o D10, em todos os meus Forms utilizo o componente VertScrollBox, para deslizar a tela, obviamente. Ao tentar deslizar a tela, ela não desliza e após alguns, vários, segundos ela pula para outro ponto, e tranca a aplicação, isso em todos os Forms, quando consigo ir para outro Form. Até agora não tentei refazer todos os meus Forms porque vai dar um trabalho grande. Você tem alguma dica quanto a isso?
Quando volto para o XE8, segue tudo normal.
Abraços.
ae Landerson, blz?
Consegui uma solução para este problema que relatei no Delphi Seattle. Depois de muitas tentativas percebi que o problema está no alinhamento dos componente inseridos no VertScrollBox. A maioria dos componentes estava alinhado com a opção horizontal (Align = Horizontal), ao tirar este alinhamento, passando para None, voltou tudo ao normal. Tive que fazer os alinhamentos via programação determinando o Position.X e o Width de cada componente. Isto deve ser um bug, como eu disse funciona normalmente no XE8 e, para reforçar que é um bug, no iOS funciona normal, é só no Android. Então se você tiver interesse de verificar e relatar para a Embarcadero, fica ai uma dica.
Abraços.
O Delphi 10 Seattle, ainda não suporte nada no serviço.
Se você coloca um timer, um outro componente, dá erro.
Ohhh Delphi, passou mel na boca e tirou .. 🙁
Olá Maurício Serviço sendo suportado perfeitamente, o que ficou claro ao ler a documentação e informar-me por fontes oficiais é que há um esforço para fazê-lo aceitar componentes antes apenas de VCL, na verdade Timer pode ser substituído por uma Trhead.
Enfim, pelo menos pra mim o mel continua… e a busca por esse conhecimento pode inclusive deixá-lo com mesmo sabor!
Seja muito bem vindo, obrigado por sua participação e até a próxima!
Landerson, boa tarde.
Seguindo este exemplo, consegui criar um serviço tranquilamente.
Porem, no meu caso, preciso gravar a Localização do usuário através do serviço de tempos em tempos, porem, apenas colocando o componente “LocationSensor” na Tela, o serviço apresenta erro ao rodar “Segmentation fault (11)”.
Me deu a impressão de ser permissão do Android, fui na aba “User Permission” e marquei todos (sim, foi medida de desespero após varias tentativas) os acessos, tanto para o Serviço, quanto para a Aplicação Hospedeira, porem não surtiu efeito, continuei com o erro.
Alguém já passou por isso?
Como solução alternativa, pensei em criar um serviço que, caso a aplicação hospedeira esteja fechada, reabre a aplicação, e ai gravo a posição do GPS na aplicação hospedeira. É possível abrir a aplicação hospedeira através do Serviço? Não consegui achar um exemplo disso.
Desde já agradeço,
Ricardo bem vindo!
No Embarcadero Developer Skill Sprint da última terça-feira o Jim Mckeeth abordou um exemplo que pode ser o que você está procurando.
Confira aí http://embt.co/sprint-android-services
Espero que ajude.
Até a próxima e obrigado por sua participação!
Amigo, o serviço nao suporta qualquer componente!
Olá Maurício essa é uma questão, não necessariamente isso precisa ocorrer.
Consegui ver 3 projetos utilizando serviços essa semana que não teriam a menor chance de funcionar sem que fossem englobados no RAD Studio.
Ali percebi, que ele funcionará bem para a grande maioria dos casos… obviamente ainda há o que evoluir, mas alguns que pesquisaram um pouco mais já conseguiram via Delphi Android Services, por exemplo atualizar localização e postar via REST… você deve estar pensando, como se tudo é componente??? Na verdade tudo é TObject, a gente só precisa interpretar e analisar fora da caixa amigo!
Eu procurei por TTimer, talvez um TLocationSensor no DataModule do Serviço… alguém pensou por fora, veja esse exemplo de alguém que não aguardou o Delphi suportar o “componente no Serviço”
function TAndroidServiceDM.AndroidServiceStartCommand(const Sender: TObject;
const Intent: JIntent; Flags, StartId: Integer): Integer;
var
LocationManagerService: JObject;
location : JLocation;
begin
Result := TJService.JavaClass.START_STICKY;
LogI(‘Service started’);
if not Assigned(FLocationManager) then
begin
LocationManagerService := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.LOCATION_SERVICE);
FLocationManager := TJLocationManager.Wrap((LocationManagerService as ILocalObject).GetObjectID);
if not Assigned(locationListener) then
locationListener := TLocationListener.Create(self);
FLocationManager.requestLocationUpdates(TJLocationManager.JavaClass.GPS_PROVIDER, 5000, 10, locationListener, TJLooper.JavaClass.getMainLooper);
end;
location := FLocationManager.getLastKnownLocation(TJLocationManager.JavaClass.GPS_PROVIDER);
PostLocation(location);
LogI(‘Location created’);
// Use a task to push the sleep into a new thread
T := TTask.Run (procedure begin
while true do
begin
sleep(10000);
FLocationManager.requestLocationUpdates(TJLocationManager.JavaClass.GPS_PROVIDER, 5000, 10, locationListener, TJLooper.JavaClass.getMainLooper);
end;
end);
Enfim, fica como uma ideia a seguir, é exatamente o que eu pretendo fazer também!
Obrigado por sua participação e até a próxima!
Landerson, tem um problema novo se você ou alguem souber resolver fico grato.
Estou colocando um componente TNotificationCenter e realizando as operações para criar uma notificação.
Fiz toda operação e funcionou no aplicativo corretamente. Quando levei o codigo para o Serviço ele simplesmente não funciona.
Se eu instanciar o datamodulo AndroidServiceDM pelo aplicativo instanciando a classe com create o processo funciona normal. Mas rodando o servicos pelo contexto de inicialização que você passou a notificação não funciona. Mas o processo que falei instância a classe do serviço no app e guando fecha mata. Então não adianta. Tem que iniciar como você faz para o serviço continuar ativo.
Em pesquisas verifiquei que o problema ta no contexto. O contexto iniciado pelo serviço não e um activity, então comandos como showmessage que interage visualmente não funcionam e o mesmo acontece para o componente de notificação.
Estou a dois dias pesquiando em todos os lugares. Sei que existe a possibilidade de realizar isso pelo java. Vi códigos na internet não testei. Mas em delphi parece não ter pq nao consigo manipular o componente pelo comandos em java.
Então sera que tem como fazer o serviço enviar uma msg para o aplicativo usando intent para que ele possa disparar a notificação? Assim o aplicativo faria essa função, o aplicativo usa activity, tendo acesso a interface.
Bom e isso preciso roda uma notificação a partir do serviço.
Abraço valeu pela atenção.
Consegui fazer o sistema reiniciar o serviço perfeitamente no boot do celular e compilando sem gerar erro no delphi.
O único problema em anexar o arquivo BootService.jar e que você precisa remover a tag do template do manifest
e colocar a tag que foi criada no manifest do “android/debug”,
por que ele gera um vazio quando adicionamos um class JAR no projeto do Aplicativo. Funcionou sem problemas o compile e build do projeto.
Consegui fazer funcionar a notificação de mensagem no serviço, mas somente usando o projeto do exemplo, não consegui fazer funcionar em um projeto novo, não sei onde esta a diferença, se souberem me informe.
Os componentes que testei e são suportados no DataModule do “ServicoDM” são estes:
1. TNotificationCenter
2. TClientDataSet
3. NetHttpClient
Para caso tente usar o webservice, componente HTTPRIO e SoapImport Wizard não vai funcionar. Por isso usar o NetHTTPCliente pra criar toda comunicação com servidor.
Não pode usar o TTimer, tem que usar um Thread ou um TTask.Run dentro do procedimento colocar loop infinito (while true do) com o sleep para segurar o tarefador ou a thread, assim não precisa mais do TTimer, com TTask funcionou perfeitamente.
Agora posso iniciar toda estrutura de comunicação, caso encontre problemas ou novas sugestões informo.
Abraço a todos!
Euler, você tem um exemplo dessa aplicação para iniciar o serviço junto com o boot?
meu email: gsbarizao@gmail.com
Pessoal fiz uma video aula:
https://www.youtube.com/watch?v=2nTDl95ts2Q
Como criar o serviço e como colocar o boot_completed nele.
Abraço!
Euler vou ver o vídeo e depois vou divulgar, pode?
O post removeu a tag…
remover to template este
%service%
e colocar o que foi gerado no “android/debug”
service android:exported=”false” android:name=”com.embarcadero.services.ServiceJogadaCombinada” /
Euler, bom dia.
Teria como você montar um exemplinho de como restartar o servido do android depois do boot? Se puder me enviar por email, eu agradeceria demais.
mctenreiro@hotmail.com
Vlw cara. obg mesmo!!!
é possível fazer consulta em um banco de dados e enviar notificações a partir de um serviço?
estou fazendo um aplicativo de compra online e gostaria de notificar o cliente quando o produto mudar de status.
Reni, bem vindo!
Na verdade os serviços Android ainda estão engatinhando… possível, dê uma olhada neste Embarcadero Developer Skill Sprint, nele Jim Mckeeth faz todas as explicações necessárias à utilização dos Serviços com o Delphi 10 Seattle… cheguei a conversar com o desenvolvedor responsável por essa inclusão no Delphi, e devemos ter mais facilidades nas próximas versões.
Espero que tenha sido útil.
Desde já agradeço sua participação!
Criei um serviço com notificação porém ele não lança a notificação.
O Android do meu celular é o 4.4. Tem alguma coisa a ver ?
Olá Mário, seja bem vindo!
Existem muitas variáveis a serem consideradas além da versão, e sinceramente não acredito que seja a versão em si o problema. Talvez a forma com que a notificação seja controlada, o que o seu serviço faz efetivamente…
Sugiro que de uma olhada nesse Embarcadero Developer Skill Sprint, com Jim Mckeeth… com certeza vai esclarecer bastante o caminho.
Desde já agradeço sua participação!
Até a próxima!
Estou, como sempre, reproduzindo seus exemplos. Isso tem me ajudado muito. Obrigado.
Agora, não está reconhecendo “uses System.Android.Service;”
Tem ideia do que está faltando?
Ainda não entendi como fazer um Serviço Funcional. Esse exemplo acima é muito básico. Mas não codificou nada para demonstração. Nem um Showmessage se quer.
Olá Mário, primeiramente seja muito bem vindo!
Este post é a primeira referência em Android Service com Delphi Seattle, enfim, conseguir funcionar era o desafio. Daí por diante surgiram questões como a sua, erros também… o Android Service via Delphi não interage com nenhum componente visual, este foi meu segundo erro, o primeiro foi tentar usar um TTimer para disparar o serviço rsrs. Enfim, com o passar do tempo as coisas foram evoluindo.
Sugiro assistir o exemplo do Jim Mckeeth, que meses depois apresentou Skill Sprint: Android Services for Background Execution.
Espero que seja útil.
Obrigado por sua participação e até a próxima!
Landerson,
Muito bom o artigo.
Fiz e funcionou.
Porém, eu fiz um aplicativo onde coloquei um ttimer que de 5 em 5 minutos verifica no webservice se tem novas mensagens.
Tudo funciona. Mas depois de 20 minutos com o celular ocioso as mensagens param de chegar. Parece que ele desativa a aplicação.
Voce tem alguma dica?
Implementei o exemplo todo no meu app, não deu certo. Notei 2 coisas: vc disse que tem que rodar os 2 projetos em modo Release certo? Quando rodo em release, dá o erro “Project raised exception class Segmentation fault (11).”. Se rodo em Debug, não dá o erro, mas o serviço também não funciona. Segunda coisa que notei, é que na pasta Libraries, a referência para o pacote apk-expansion.dex.jar está quebrada. O que pode estar acontecendo?
Boa tarde, Landerson! Gostaria de saber se este serviço pode ser utilizado também para IOs. Estou na fase final de um projeto que irá rodar tanto em Android como no IOs e estou com um problema seríssimo quando recebo fotos do servidor JSON, as vezes demora demais e trava a aplicação, foi onde pensei em criar um serviço a parte para fazer essa função, acredito que será a solução definitiva do meu problema.
Olá Eduardo, bem vindo!
O serviço Android não vai rodar no iOS, porém me recordo de há muito tempo ter visto algo sobre, procure por “bakcground suporte delphi ios”, alguma coisa nesse sentido… minha exepriência no mundo Apple é 0. Sugiro também dar uma olhada no TDevRocks e no canal do Victory Fernandes no YouTube, eles têm bastante material envolvendo a Apple.
Espero tê-lo ajudado.
Fica dando Programa parou, meu celular J7 com android 5.1.1
Olá Roberto, seja bem vindo!
Tente dar uma revisada nas permissões, a mensagem é muito genérica e acaba não permitindo ser mais objetivo.
Obrigado por sua participação e até a próxima!
Bom dia a todos !
Estou precisando urgente de uma ajuda. Fiz um serviço que executa um procedimento de x em x segundos. Porém não consigo fazer o mesmo acessar o banco. Uso o procedimento que funciona normalmente no APP ” TPath.Combine(TPath.GetDocumentsPath, ‘Banco.sqlite’)” porém no serviço não deu certo. Coloquei no Deploy etc e nada.
Alguém pode me ajudar ?
Abraços !
Amigo, eu tive mesmo problema resolvi passando o path por completo…
/storage/emulated/0/nome_do_app/banco.sqlite
Funcionou comigo!
Amigo, já instalei Delphi Berlim, esse problema foi resolvido nele. GetPath funciona!
Instala o Delphi Berlgim que vai funcionar!