Перейти к содержанию

Вопросы

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

Хотел бы поинтересоватся: есть 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 эмодзи.

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

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

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


  • Похожий контент

    • От gutalin79
      Почему при добавлении MapView в пример Android Service, приложение перестает работать?
      AndroidSimpleService.zip
       
       
       
      Пример делал по этому видео: 
       
    • От Pax Beach
      Создан проект в RAD Studio 10.1 Berlin (Delphi), в приложении прилинкован сервис. При компиляции проекта в AndroidManifest.xml появляется строчка:
      <service android:exported="true" android:name="com.embarcadero.services.MyService" /> А мне нужна строчка:
      <service android:exported="true" android:name="com.embarcadero.services.MyService" android:label="Этот замечательный сервис создан вручную"/> Ни где не нашел такое свойство. В Project->Options->Version info есть свойство Label только для самого Host приложения.
      Помогите пожалуйста советом.
    • От Pax Beach
      Я реализовал пример работы с микрофоном и таймером в Android сервисе, как указано в теме вопроса.
      Каждый раз, когда вы отправляете в сервис StartCommand или сервис перезапускается, включается запись с микрофона, и сохраняется в каталог с музыков в файл "myrecord.3gp".
      Надеюсь, мой пример поможет вам создать новые полезные решения. В этом случае пожалуйста делитесь ими с участниками нашего сообщества.
      Для отладки своих программ на Android используйте запись в LOGI и чтение при помощи monitor.bat (PlatformSDKs\android-sdk-windows\tools).
       
      uses ... AndroidApi.JNI.Media, // JMediaRecorder AndroidApi.Timer, // Timer ...; Const TimerInterval = 1000; TimerCounterSecLimit = 10; type TDM = class(TAndroidService) ... private FTimerHandle: Integer; FRecording: Boolean; procedure StartRecord; procedure StopRecord; procedure StartTimer; procedure StopTimer; public FAudioRec: JMediaRecorder; end; procedure Log(const Fmt: string; const Params: array of const); overload; var Msg: string; M: TMarshaller; begin Msg := Format(Fmt, Params); LOGI(M.AsUtf8(Msg).ToPointer); end; procedure Log(const Source: string); overload; var M: TMarshaller; begin LOGI(M.AsUtf8(Source).ToPointer); end; procedure TDM.AndroidServiceCreate(Sender: TObject); begin FTimerHandle := 0; FTimerCounter := 0; FRecording := false; end; procedure TDM.AndroidServiceDestroy(Sender: TObject); begin StopTimer; StopRecord; end; function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; begin if Intent.getAction.equalsIgnoreCase(StringToJString('StopIntent')) then begin StopTimer; StopRecord; Result := TJService.JavaClass.START_NOT_STICKY; // don't reload service Log('- service stoped', []); end else begin if not FRecording then begin Log('... sound record to be started', []); StartRecord; StartTimer; end; Result := TJService.JavaClass.START_STICKY; // rerun service if it stops Log('+ Service started', []); end; end; procedure TDM.StartRecord; begin StopRecord; FAudioRec := TJMediaRecorder.Create; FAudioRec.setAudioSource(TJMediaRecorder_AudioSource.JavaClass.MIC); FAudioRec.setOutputFormat(TJMediaRecorder_OutputFormat.JavaClass.THREE_GPP); FAudioRec.setAudioEncoder(TJMediaRecorder_AudioEncoder.JavaClass.AMR_NB); FAudioRec.setOutputFile(StringToJString(TPath.Combine(TPath.GetSharedMusicPath, 'myrecord.3gp'))); try FAudioRec.Prepare(); FAudioRec.start; FRecording := True; Log('+ Start record to %s', [TPath.Combine(TPath.GetSharedMusicPath, 'myrecord.3gp')]); except on E: Exception do Log('- Error in mic recording: %s', [E.Message]); end; end; procedure TDM.StopRecord; begin if Assigned(FAudioRec) then begin if FRecording then begin FRecording := false; try FAudioRec.stop(); FAudioRec.release(); Log('- Mic recording is stoped'); except on E: Exception do Log('- Error in mic stop recording: %s', [E.Message]); end; end; end else begin FRecording := false; end; end; procedure TDM.WaitComplete(TimerId: Integer); begin if FTimerCounter < TimerCounterSecLimit then begin Log('+++ Timer is triggered %d time.', [FTimerCounter]); inc(FTimerCounter); end else StopTimer; end; procedure TDM.StartTimer; begin FTimerCounter := 0; if FTimerHandle = 0 then begin FTimerHandle := AndroidTimerCreate; AndroidTimerSetInterval(FTimerHandle, TimerInterval); end; AndroidTimerSetHandler(WaitComplete); Log('+ Timer started', []); end; procedure TDM.StopTimer; begin if FTimerHandle > 0 then begin Log('... MIC recording to be stopped'); StopRecord; AndroidTimerSetHandler(nil); Log('- Timer stoped', []); end; end; end.  
    • От YuraProff
      Добрый день!
       
      Ситуация следующая есть сервис который работает в фоне. Он каждых 10 секунд обращается на сервер и забирает данные через TidUDPServer. Если устройство разблокировано, то все нормально каждые 10 сек идет обмен данными, если устройство заблокировать через кнопку Power то первые 20 сек все работает нормально, потом просто напросто пакеты начинают ходить каждые 1-2 минуты, иногда дольше иногда быстрее. Предполагаю что когда телефон блокируется он переходит в состояние экономии энергии, но телефонная звонилка нормально живет и остальные приложения тоже, хотя наверно там немного другая организация. 
       
            Вопрос у меня такой: можно ли повысить уровень приоритета сервиса, или еще каким нибудь способом заставить его нормально работать, и не тормозить на токае длительное время. 
       
      Спасибо.
    • От Alexander616
      Собрал сервис по туториалу



      Но к сожалению не работает, может ктонибудь посдказать в чём проблема?
      стандартно запускается программа, но после её закрытия в запущенных апликациях сервиса не видать.

      По туториалу:
      В ивенте сервиса AndroidServiceStartCommand
      пишу : Result := TJService.JavaClass.START_STICKY;

      При создании формы основной программы: FService := TLocalServiceConnection.Create; FService.StartService('RADService');
        Сервис регистрирую в основной программе как показано в туториале.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

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