Перейти к содержанию
Fire Monkey от А до Я
  • 0

Android Service


YuraProff

Вопрос

Добрый день в поиске копался, адекватных ответов не нашел.

Хотел бы поинтересоватся: есть Android Local Service, есть Multi-Device Application, как с приложения сервису передать параметры?

Например строку или число.

 

Спасибо

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

в демке все показано, общение идёт через Intent

DownloadServiceDemo просто не работает, не передается там intent в сервис, и даже дебагер не заходит в функцию AndroidServiceStartCommand. Делаю все по инструкции из файла readme.txt.

Ссылка на комментарий
  • 0

YuraProff, сам пример DownloadServiceDemo у меня тоже не работает, но в нем есть то что в вам нужно - вызов сервиса делается не стандартным способом типа:

TLocalServiceConnection.StartService('DownloadService');

а вот так:

procedure TForm1.Button1Click(Sender: TObject);
var
  LIntentService: TIntentServiceHelper;
  LURL: string;
  LFilename: string;
begin
  LURL := Edit1.Text;
  LFilename := Edit1.Text.Substring(Edit1.Text.LastIndexOf('/') +1);
  LIntentService := TIntentServiceHelper.Create('DownloadService', 0, LURL + '|' + LFilename);
  TAndroidHelper.Activity.startService(LIntentService.Intent);
end;

то есть мы не просто вызываем сервис, но и передаем параметры через Intent.

 

В сервисе принимаем и разбираем строку:

  LTIntentService := TIntentServiceHelper.Create(Intent);

  LData := LTIntentService.Data.Split([Char('|')]);
  if Length(LData) = 2 then
  begin
    URL := LData[0];
    LFileName := LData[1];
Ссылка на комментарий
  • 0

 

YuraProff, сам пример DownloadServiceDemo у меня тоже не работает, но в нем есть то что в вам нужно - вызов сервиса делается не стандартным способом типа:

TLocalServiceConnection.StartService('DownloadService');

а вот так:

procedure TForm1.Button1Click(Sender: TObject);
var
  LIntentService: TIntentServiceHelper;
  LURL: string;
  LFilename: string;
begin
  LURL := Edit1.Text;
  LFilename := Edit1.Text.Substring(Edit1.Text.LastIndexOf('/') +1);
  LIntentService := TIntentServiceHelper.Create('DownloadService', 0, LURL + '|' + LFilename);
  TAndroidHelper.Activity.startService(LIntentService.Intent);
end;

то есть мы не просто вызываем сервис, но и передаем параметры через Intent.

 

В сервисе принимаем и разбираем строку:

  LTIntentService := TIntentServiceHelper.Create(Intent);

  LData := LTIntentService.Data.Split([Char('|')]);
  if Length(LData) = 2 then
  begin
    URL := LData[0];
    LFileName := LData[1];

 

Именно это и не работает. То-есть стандартным способом все хорошо, а вот именно через intent сам пример не работает. То-есть я взял пример, выполнил требования все пункты файла readme.txt, заливаю на устройство (Планшет Sumsung) в Debug и все тишина, то-есть сам пример не работает почему-то, может я что то не так делаю, но использовал другие устройства, пересматривал что я не так делаю 20 раз, результата ноль. Этот пример у всех работает нормально?

Ссылка на комментарий
  • 0

YuraProff, попробуйте создать новый проект, добавить к нему новый сервис, прописать вызов как я написал в предыдущем сообщении и поставить breakpoint на строке if Length(LData) = 2 then

Ссылка на комментарий
  • 0
  • Администраторы

Вообще можно напрямую вызывать методы сервиса. Так как они находятся в одной области памяти и имеют прямой доступ друг к другу. Для этого достаточно создать TLocalServiceConnection, установить связь с сервисом через BindService и получить прямой доступ к сервису через TLocalServiceConnection.LocalService

Ссылка на комментарий
  • 0

Вообще можно напрямую вызывать методы сервиса. Так как они находятся в одной области памяти и имеют прямой доступ друг к другу. Для этого достаточно создать TLocalServiceConnection, установить связь с сервисом через BindService и получить прямой доступ к сервису через TLocalServiceConnection.LocalService

Можно какой-нибудь пример для ясности?

Ссылка на комментарий
  • 0
В 17.02.2016 в 21:32, Brovin Yaroslav сказал:

Вообще можно напрямую вызывать методы сервиса. Так как они находятся в одной области памяти и имеют прямой доступ друг к другу. Для этого достаточно создать TLocalServiceConnection, установить связь с сервисом через BindService и получить прямой доступ к сервису через TLocalServiceConnection.LocalService

Расскажите по подробнее пожалуйста

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...