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

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


fsdb

Вопрос

Опубликовано (изменено)

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

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

Изменено пользователем fsdb

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

  • 0
Опубликовано

простейший костыль: пиши при запуске флажок в папку при запуске приложения, при выгрузке приложения снимай его, в сервисе проверяй!

  • 1
  • Модераторы
Опубликовано (изменено)

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

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

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

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

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

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

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

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

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

  • 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
  • Модераторы
Опубликовано (изменено)
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 пользователей онлайн

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