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

как из сервиса узнать, что приложение основное сейчас закрыто


fsdb

Вопрос

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

мне нужно что бы сервис не делал полезной работы пока приложение активно. после закрытия продолжал делать полезную работу

Изменено пользователем fsdb
Ссылка на комментарий

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

  • 1
  • Модераторы

очередной костыль, но он будет работать:

с приложения каждую минуту слать <hello> сервису, и сервис будет знать, что приложение работает.

если же <hello> не поступает более чем минуту, значит приложение не работает

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0
25 минут назад, Rusland сказал:

wamaco, а если приложение банально упадет/зависнет?

выход как у всех: "Перезапустить приложение!" :)))

не работает LTE, только 3G, звоню в МТС, ответ перезагрузите смартфон!

перегружаю, все работает, но раз в полгода такое случается!

плохо? - плохо! на то он и костыль!

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

Узнать, работает Служба или Приложение, можно попробовать, через методы

getRunningAppProcesses

getRunningServices

ActivityManager - getSystemService(ACTIVITY_SERVICE);

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

В приложении можно раз в секунду включать вибрацию, а в сервисе читать сенсор движения ;-) Способ шуточный, но абсолютно работоспособный :-)

А вообще в Uses SyncObjs есть TMutex и с Андроидом он дружит. Отпишитесь если удастся применить.

 

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

Вот функция для получения списка всех запущенных сервисов:

function TForm1.ServicesStarted: String;
var
  ActivityServiceManager: JObject;
  FActivityManager : JActivityManager;
  List: JList;
  Iterator: JIterator;
  ri: JActivityManager_RunningServiceInfo;
  s: String;
begin
  s:='';
  Result:='';
  ActivityServiceManager := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.ACTIVITY_SERVICE);
  FActivityManager := TJActivityManager.Wrap((ActivityServiceManager as ILocalObject).GetObjectID);
  List := FActivityManager.getRunningServices(MAXINT);
  Iterator := List.iterator;
  while Iterator.hasNext do
  begin
    ri := TJActivityManager_RunningServiceInfo.Wrap((Iterator.next as ILocalObject).GetObjectID);
    s := s+ JStringToString(ri.service.getClassName) + ' |';    
  end;
  Result:=s;    
end;

Пытаюсь подобным образом получить список запущенных приложений:

function TForm1.TasksStarted(): String;
var
  ActivityServiceManager: JObject;
  FActivityManager : JActivityManager;
  List: JList;
  Iterator: JIterator;
  //ri: JActivityManager_RunningServiceInfo;
  ra: JActivityManager_RunningAppProcessInfo;
  s: String;
begin
  s:='';
  Result:='';
  ActivityServiceManager := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.ACTIVITY_SERVICE);
  FActivityManager := TJActivityManager.Wrap((ActivityServiceManager as ILocalObject).GetObjectID);
  List := FActivityManager.getRunningTasks(MAXINT);
  
  Iterator := List.iterator;
  while Iterator.hasNext do
  begin
    ra := TJActivityManager_RunningAppProcessInfo.Wrap((Iterator.next as ILocalObject).GetObjectID);
    s := s+ JStringToString(ra.processName) + ' |'; // тут Aborted    
  end;
  b:= not b;
  Result:=s;    
end;

Получаю Aborted. В чем ошибка?

 

Если от балды заменяю строку на s := s+ JStringToString(ra.toString) + ' |';  то выдает примерно следующее:

android.app.ActivityManager$RunningTaskInfo@c2187d3|

android.app.ActivityManager$RunningTaskInfo@1db4f10|

Помогайте братцы.

 

PS. Вот еще одна ссылка по получению списка запущенных приложений (если не ошибаюсь у меня выдавал только мое приложение)

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
15 часов назад, Rusland сказал:

Получаю Aborted. В чем ошибка?

Мил человек, пиши плиз блок USES вместе с примерами кода, и глобальные и переменные класса.

Смотрю у себя пример.

UPD:

Пришлось таки GIT поставить и обертки под Adnroid тянуть. Предупреждать вообще-то надо! )))

 

Изменено пользователем Pax Beach
Ссылка на комментарий
  • 0

Виноват :)

Это вот апи скачанные с интернета: AndroidApi.zip

В uses 

  Androidapi.JNI.GraphicsContentViewText, // TJIntent (Receive Intent)
  Androidapi.JNI.JavaTypes,               // JList
  Androidapi.JNIBridge,                   // ILocalObject
  Androidapi.JNI.App,                     // TJService
  Androidapi.Helpers,                     // StringToJString
  AndroidApi.Log,                         // LOGI
  
  Androidapi.JNI.RunningServiceInfo,      // поиск запущенных приложений - https://stackoverflow.com/questions/34262554/how-to-check-if-a-service-is-running-in-delphi-10-seattle
  Androidapi.JNI.ActivityManager,         // поиск запущенных приложений - http://blog.csdn.net/flcop/article/details/17190009uses



b:boolean;

 

Ссылка на комментарий
  • 0
  • Модераторы
function TForm1.ServicesStarted: String;
var
  ActivityServiceManager: JObject;
  FActivityManager : JActivityManager;
  List: JList;
  Iterator: JIterator;
  ri: JActivityManager_RunningServiceInfo;
  s: String;
begin
  s:='';
  Result:='';
  ActivityServiceManager := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.ACTIVITY_SERVICE);
  FActivityManager := TJActivityManager.Wrap((ActivityServiceManager as ILocalObject).GetObjectID);
  List := FActivityManager.getRunningServices(MAXINT);
  Iterator := List.iterator;
  while Iterator.hasNext do
  begin
    ri := TJActivityManager_RunningServiceInfo.Wrap((Iterator.next as ILocalObject).GetObjectID);
    s := s+ JStringToString(ri.service.getClassName) + ' |';    
  end;
  Result:=s;    
end;

чем этот код не устроил? у меня все показало

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0
  • Модераторы
3 минуты назад, Pax Beach сказал:

Права никакие не надо дополнительно? Я на это думал.

нет, я не ставил

Ссылка на комментарий
  • 0
  • Модераторы
31 минуту назад, Rusland сказал:

ZuBy, а что конкретно показало? Принтскрин можно? У меня показывает запущенные сервисы, но не программы.

всего-то нужны было дописать

procedure TForm9.Button2Click(Sender: TObject);
// Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, 
// Androidapi.JNIBridge, Androidapi.JNI.App, Androidapi.Helpers, Androidapi.JNI.ActivityManager;
var
  ActivityServiceManager: JObject;
  FActivityManager: JActivityManager;
  List: JList;
  Iterator: JIterator;
  ri: JActivityManager_RunningServiceInfo;
begin
  ActivityServiceManager := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.ACTIVITY_SERVICE);
  FActivityManager := TJActivityManager.Wrap((ActivityServiceManager as ILocalObject).GetObjectID);
  List := FActivityManager.getRunningServices(MAXINT);
  Iterator := List.Iterator;
  while Iterator.hasNext do
  begin
    ri := TJActivityManager_RunningServiceInfo.Wrap((Iterator.next as ILocalObject).GetObjectID);
    with ListView1.Items.Add do
    begin
      Text := JStringToString(ri.service.getPackageName);
      Detail := JStringToString(ri.service.getClassName);
    end;
  end;
end;

ri.service.getPackageName - показывает родителя сервиса (т.е. приложение)

 

photo_2016-09-20_13-53-47.jpg

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0

Один только прикол - показывает приложения, которые с запущенными сервисами, а обычные или с остановленными сервисами нет. :)

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
46 минут назад, ZuBy сказал:

всего-то нужны было дописать

У меня падает этот пример на строчке

    ri := TJActivityManager_RunningServiceInfo.Wrap((Iterator.next as ILocalObject).GetObjectID);

монитор такое пишет:

Цитата

09-20 15:35:41.341: A/art(21319): art/runtime/java_vm_ext.cc:448] JNI DETECTED ERROR IN APPLICATION: GetMethodID received NULL jclass

09-20 15:35:41.341: A/art(21319): art/runtime/java_vm_ext.cc:448]     in call to GetMethodID
 

Может все таки права нужно? У меня телефон без рута.

Ссылка на комментарий
  • 0
  • Модераторы
1 минуту назад, Pax Beach сказал:

У меня падает этот пример на строчке


    ri := TJActivityManager_RunningServiceInfo.Wrap((Iterator.next as ILocalObject).GetObjectID);

монитор такое пишет:

Может все таки права нужно? У меня телефон без рута.

нет, не нужен рут (в коде нет запроса рут, без запроса не будет предоставлен доступ)

он же написал NULL, значит проверить

procedure TForm9.Button2Click(Sender: TObject);
var
  List: JList;
  Iterator: JIterator;
  ActivityServiceManager: JObject;
  FActivityManager: JActivityManager;
  ri: JActivityManager_RunningServiceInfo;
begin
  ActivityServiceManager := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.ACTIVITY_SERVICE);
  FActivityManager := TJActivityManager.Wrap((ActivityServiceManager as ILocalObject).GetObjectID);
  List := FActivityManager.getRunningServices(MAXINT);
  Log.d('---> ' + List.size.ToString);
  Iterator := List.Iterator;
  Log.d('---> ' + List.Iterator.hasNext.ToString(true));
  exit;
  while Iterator.hasNext do
  begin
    ri := TJActivityManager_RunningServiceInfo.Wrap((Iterator.next as ILocalObject).GetObjectID);
    with ListView1.Items.Add do
    begin
      Text := JStringToString(ri.service.getPackageName);
      Detail := JStringToString(ri.service.getClassName);
    end;
  end;
end;

лог предоставите? только не через монитор, а через встроенный

Ссылка на комментарий
  • 0
2 минуты назад, ZuBy сказал:

лог предоставите? только не через монитор, а через встроенный

Я, если честно, не понимаю, что такое встроенный лог. Как его можно получить?

Монитор говорит вот что:

Цитата

09-20 15:48:53.003: I/info(25727): FMX: ProcessList: ---> 89
09-20 15:48:53.003: I/info(25727): FMX: ProcessList: ---> -1

 

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

попробуйте вот так, переписал

var
  List: JList;
  // Iterator: JIterator;
  ActivityServiceManager: JObject;
  FActivityManager: JActivityManager;
  ri: JActivityManager_RunningServiceInfo;
  i: Integer;
begin
  ActivityServiceManager := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.ACTIVITY_SERVICE);
  FActivityManager := TJActivityManager.Wrap((ActivityServiceManager as ILocalObject).GetObjectID);
  List := FActivityManager.getRunningServices(MAXINT);
  // Iterator := List.Iterator;
  for i := 0 to List.size - 1 do
  begin
    ri := TJActivityManager_RunningServiceInfo.Wrap((List.get(i) as ILocalObject).GetObjectID);
    with ListView1.Items.Add do
    begin
      Text := JStringToString(ri.service.getPackageName);
      Detail := JStringToString(ri.service.getClassName);
    end;
  end;
  { while Iterator.hasNext do
    begin
    ri := TJActivityManager_RunningServiceInfo.Wrap((Iterator.next as ILocalObject).GetObjectID);
    with ListView1.Items.Add do
    begin
    Text := JStringToString(ri.service.getPackageName);
    Detail := JStringToString(ri.service.getClassName);
    end;
    end; }

 

Ссылка на комментарий
  • 0
35 минут назад, ZuBy сказал:

попробуйте вот так, переписал

ошибка там же, при попытке присвоить "ri":

Цитата

09-20 16:46:46.383: A/art(26142): art/runtime/java_vm_ext.cc:448] JNI DETECTED ERROR IN APPLICATION: GetMethodID received NULL jclass

09-20 16:46:46.383: A/art(26142): art/runtime/java_vm_ext.cc:448]     in call to GetMethodID
 

Тут мысль пришла. А мы одинаковую версию обертки "android.app.ActivityManager_RunningServiceInfo" используем? Я использую от API-19.

 

 

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

 

Только что, Pax Beach сказал:

Тут мысль пришла. А мы одинаковую версию обертки "android.app.ActivityManager_RunningServiceInfo" используем? Я использую от API-19.

я вот эту

3 часа назад, Rusland сказал:

Это вот апи скачанные с интернета: AndroidApi.zip

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

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

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