Перейти к содержанию
  • 0
Евгений Корепов

Выполнение регулярных операций в сервисе - статистика

Вопросы

Провел небольшое исследование поведения таймера Posix в сервисе. Результаты не очень. Таймер ведет себя так же как и в приложении, главное отличие - не умирает окончательно, но рассчитывать на него не стоит.

Перед экспериментом было отключено энергосбережение, экономия трафика во сне (телефон работал через wifi), т.е. созданы все условия для долгой и стабильной работы.

2017-02-24 23:22:51 - телефон ушел в сон. Таймер начал работать эпизодически, с провалами до получаса.

2017-02-25 07:24:58 - я проснулся и разблокировал телефон. Таймер опять нормально заработал.

В следующей серии попробую протестировать сервис с AlarmManager, что то у меня подозрения что результаты будут не лучше.

2017-02-25 07:27:58	Posix-таймер в сервисе. Запрос раз в 60 сек. № 108
2017-02-25 07:26:58	Posix-таймер в сервисе. Запрос раз в 60 сек. № 107
2017-02-25 07:25:58	Posix-таймер в сервисе. Запрос раз в 60 сек. № 106
2017-02-25 07:24:58	Posix-таймер в сервисе. Запрос раз в 60 сек. № 105
2017-02-25 07:21:05	Posix-таймер в сервисе. Запрос раз в 60 сек. № 104
2017-02-25 07:14:00	Posix-таймер в сервисе. Запрос раз в 60 сек. № 103
2017-02-25 07:01:59	Posix-таймер в сервисе. Запрос раз в 60 сек. № 102
2017-02-25 06:46:33	Posix-таймер в сервисе. Запрос раз в 60 сек. № 101
2017-02-25 06:24:50	Posix-таймер в сервисе. Запрос раз в 60 сек. № 100
2017-02-25 06:13:58	Posix-таймер в сервисе. Запрос раз в 60 сек. № 99
2017-02-25 05:51:32	Posix-таймер в сервисе. Запрос раз в 60 сек. № 98
2017-02-25 05:30:07	Posix-таймер в сервисе. Запрос раз в 60 сек. № 97
2017-02-25 05:16:28	Posix-таймер в сервисе. Запрос раз в 60 сек. № 96
2017-02-25 05:07:28	Posix-таймер в сервисе. Запрос раз в 60 сек. № 95
2017-02-25 05:00:41	Posix-таймер в сервисе. Запрос раз в 60 сек. № 94
2017-02-25 04:41:01	Posix-таймер в сервисе. Запрос раз в 60 сек. № 93
2017-02-25 04:21:19	Posix-таймер в сервисе. Запрос раз в 60 сек. № 92
2017-02-25 04:00:40	Posix-таймер в сервисе. Запрос раз в 60 сек. № 91
2017-02-25 03:41:33	Posix-таймер в сервисе. Запрос раз в 60 сек. № 90
2017-02-25 03:16:59	Posix-таймер в сервисе. Запрос раз в 60 сек. № 89
2017-02-25 03:02:01	Posix-таймер в сервисе. Запрос раз в 60 сек. № 88
2017-02-25 02:44:54	Posix-таймер в сервисе. Запрос раз в 60 сек. № 87
2017-02-25 02:23:49	Posix-таймер в сервисе. Запрос раз в 60 сек. № 86
2017-02-25 02:10:28	Posix-таймер в сервисе. Запрос раз в 60 сек. № 85
2017-02-25 01:52:11	Posix-таймер в сервисе. Запрос раз в 60 сек. № 84
2017-02-25 01:32:57	Posix-таймер в сервисе. Запрос раз в 60 сек. № 83
2017-02-25 01:28:26	Posix-таймер в сервисе. Запрос раз в 60 сек. № 82
2017-02-25 01:27:26	Posix-таймер в сервисе. Запрос раз в 60 сек. № 81
2017-02-25 01:26:26	Posix-таймер в сервисе. Запрос раз в 60 сек. № 80
2017-02-25 01:25:27	Posix-таймер в сервисе. Запрос раз в 60 сек. № 79
2017-02-25 01:10:59	Posix-таймер в сервисе. Запрос раз в 60 сек. № 78
2017-02-25 01:00:27	Posix-таймер в сервисе. Запрос раз в 60 сек. № 77
2017-02-25 00:38:59	Posix-таймер в сервисе. Запрос раз в 60 сек. № 76
2017-02-25 00:19:22	Posix-таймер в сервисе. Запрос раз в 60 сек. № 75
2017-02-25 00:01:27	Posix-таймер в сервисе. Запрос раз в 60 сек. № 74
2017-02-24 23:51:15	Posix-таймер в сервисе. Запрос раз в 60 сек. № 73
2017-02-24 23:30:37	Posix-таймер в сервисе. Запрос раз в 60 сек. № 72
2017-02-24 23:22:51	Posix-таймер в сервисе. Запрос раз в 60 сек. № 71
2017-02-24 23:21:51	Posix-таймер в сервисе. Запрос раз в 60 сек. № 70
2017-02-24 23:20:51	Posix-таймер в сервисе. Запрос раз в 60 сек. № 69
2017-02-24 23:19:51	Posix-таймер в сервисе. Запрос раз в 60 сек. № 68
2017-02-24 23:18:51	Posix-таймер в сервисе. Запрос раз в 60 сек. № 67
2017-02-24 23:17:52	Posix-таймер в сервисе. Запрос раз в 60 сек. № 66
2017-02-24 23:16:52	Posix-таймер в сервисе. Запрос раз в 60 сек. № 65

 

Отредактировал Евгений Корепов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

  • 0

Скорей всего режим Doze Mode (Android 6.0+) не будет нормально давать работать, что в принципе и правильно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
4 часа назад, Равиль Зарипов (ZuBy) сказал:

Скорей всего режим Doze Mode (Android 6.0+) не будет нормально давать работать, что в принципе и правильно

Тестировал на 5 андроиде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Попробовал AlarmManager. Интервал 30 секунд.

Запускал сервис следующим образом:

procedure TFormMain.InitServiceAlarmManager;
var Intent: JIntent;
    PendingIntent: JPendingIntent;
    ATimerInterval : Integer;
begin
  ATimerInterval:=30;
  Intent := TJIntent.Create;
  Intent.setClassName(TAndroidHelper.Context, StringToJString('com.embarcadero.services.ServiceTest090Service'));
  PendingIntent := TJPendingIntent.JavaClass.getService(TAndroidHelper.Context, 1, Intent, 0);
  TAndroidHelper.AlarmManager.&setRepeating(TJAlarmManager.JavaClass.RTC_WAKEUP, getTimeAfterInSecs(ATimerInterval),
    ATimerInterval * 1000, PendingIntent);
end;

procedure TFormMain.FormCreate(Sender: TObject);
begin
  InitServiceAlarmManager;
//  FService:=TLocalServiceConnection.Create;
//  FService.StartService('ServiceTest090Service');
end;

function TFormMain.getTimeAfterInSecs(Seconds: Integer): Int64;
Var Calendar: JCalendar;
begin
  Calendar := TJCalendar.JavaClass.getInstance;
  Calendar.add(TJCalendar.JavaClass.SECOND, Seconds);
  Result := Calendar.getTimeInMillis;
end;

end.

Результат - та же хрень, вид сбоку:

2017-02-25 21:35:40	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:35:40	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:34:40	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:34:40	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:33:38	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:33:10	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:32:45	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:32:10	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:32:10	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:31:06	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:30:59	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
А тут я заблокировал телефон кнопкой и началось....
2017-02-25 21:30:06	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:29:36	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:29:06	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:28:36	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:28:06	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:27:36	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:27:06	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:26:36	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:26:07	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:25:36	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-25 21:25:06	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.

Оставлю на ночь, посмотрим что будет....

Отредактировал Евгений Корепов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

А вообще, я как-то заморачивался с похожей проблемой и вроде нашёл то ли флаг, то ли ещё что-то. Смысл был в том, чтобы будить устройство, но не включать дисплей.

Кстати, HTC точно надо принудительно будить, у них ОСь так устроена.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Результаты ночного теста получились удивительными! AlarmManager отработал на ура (И кстати на HTC). Результаты можно посмотреть здесь http://kayfolom.ru/index.php?cmd=read&api_key=androidservicetest089

Правда есть некие странности, но думаю это проблемы моего кода. 

Некоторые вызовы удваиваются и утраиваются вот так (должно быть раз в 60 сек): 

2017-02-26 01:28:43	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-26 01:27:43	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-26 01:26:43	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-26 01:26:11	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-26 01:25:11	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-26 01:24:11	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-26 01:24:11	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.
2017-02-26 01:24:11	195.22.104.13	AlarmManager в сервисе. Запрос раз в 0 сек.

Я читал что при некоторых флагах возможен экономичный вызов будильников - ближайшие по времени будильники вызываются в одно время, дабы не будить устройство лишний раз. Может тут как раз такой случай.

Вот код сервиса:

function TDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: Integer): Integer;
begin
  SendRequest;
  Result:=TJService.JavaClass.START_NOT_STICKY;
end;

procedure TDM.SendRequest;
Var Query : String;
    AMessage,AAPIKey : String;
begin
  AAPIKey:='androidservicetest089';
  AMessage:='AlarmManager в сервисе. Запрос раз в '+TimerInterval.ToString+' сек.';
  Query:='http://kayfolom.ru/index.php?cmd=write&api_key='+AAPIKey+'&message='+AMessage;
  FHTTPThread:=THTTPThread.Create(Query);
end;

Поток с   FreeOnTerminate:=True;

Вроде все нормально...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
11 часов назад, Andrey Efimov сказал:

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

А вообще, я как-то заморачивался с похожей проблемой и вроде нашёл то ли флаг, то ли ещё что-то. Смысл был в том, чтобы будить устройство, но не включать дисплей.

Кстати, HTC точно надо принудительно будить, у них ОСь так устроена.

Я знаю как на этом форуме относятся к идеям заставить мобильное устройство что то мониторить круглые сутки - начинаются крики "Ересь! Это не возможно! Сжечь его на костре пока не поздно!" :-)

Но я считаю что в нашей области нужно ограничиваться только фантазией и не слушать запретителей и ограничителей.

Задача у меня следующая - есть несколько моих приложений мониторинга майнинга криптовалюты, нужно добавить туда возможность мониторить круглые сутки воркеров (на человеческом языке это комп с 5-6 видеокартами, так называемая "ферма", или аппаратный модуль майнинга). В ответ на "сожрет батарею нафик" - одна ферма может зарабатывать от нескольких сотен рублей, до нескольких тысяч долларов в сутки, и понятно что человеку имеющему шанс потерять много денег, лучше узнать вовремя о зависании фермы в 23:15, чем обнаружить это утром и потерять деньги. С ужасной трагедией в виде севшего на 20% больше чем обычно аккумулятора телефона он, после многолетнего посещения психотерапевтов, думаю смирится.

Ответ на "Пуши наше все - поднимай сервер, пусть он мониторит и отсылает пуши"  - на одном майнинговом пуле может быть несколько тысяч майнеров (людей) и у каждого по несколько десятков или сотен ворекров (ферм). Если проверять с периодичностью в 10 минут, то нужно будет отослать за этот период несколько десятков тысяч запросов, обработать их (хранить историю каждого). Если не договорится с пулом, он за такое забанит. Если произойдет сбой - я понесу вину за потерю пользователями больших денег.

При мониторинге с телефонов (а теперь ясно что это работает и достаточно стабильно) каждый сможет включать эту функцию по желанию, и мониторить только нужные (проблемные) фермы. 

 

По поводу флага - метод RTC_WAKEUP вроде так и работает, будит телефон для выполнение задачи, но экран не включается. По крайней мере в варианте getService. У меня экран телефона всю ночь был выключен, запросы шли стабильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, Евгений Корепов сказал:

Я знаю как на этом форуме относятся к идеям заставить мобильное устройство что то мониторить круглые сутки - начинаются крики "Ересь! Это не возможно! Сжечь его на костре пока не поздно!" :-)

:D Ну, не знаю как остальным, мне просто была интересна сама задача. И задачка интересная :)

1 час назад, Евгений Корепов сказал:

При мониторинге с телефонов (а теперь ясно что это работает и достаточно стабильно) каждый сможет включать эту функцию по желанию, и мониторить только нужные (проблемные) фермы.

Только ещё не помешает мониторить перезагрузку телефона. А то пользователь перезагрузит устройство и всё, сломается его мониторинг (до момента пока он не перезапустит мониторинг)... Это если хочется почти нон-стоп и в автоматическом режиме.

1 час назад, Евгений Корепов сказал:

По поводу флага - метод RTC_WAKEUP вроде так и работает, будит телефон для выполнение задачи, но экран не включается. По крайней мере в варианте getService. У меня экран телефона всю ночь был выключен, запросы шли стабильно.

Да, точно. Видимо, я перепутал с другой задачей и другой реализацией, давно это было. (надо будет освежить знания по этой теме)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
36 минут назад, Andrey Efimov сказал:

Только ещё не помешает мониторить перезагрузку телефона. А то пользователь перезагрузит устройство и всё, сломается его мониторинг (до момента пока он не перезапустит мониторинг)... Это если хочется почти нон-стоп и в автоматическом режиме.

С этим согласен. Но тут нужен java класс, компиляция его в jar, подключение jar к проекту - вот на это все у меня жуткая аллергия. Вчера пытался воспользоваться вашим bat-файлом, потом просто отдельными строками, в итоге психанул и все удалил :-) Особенно тяжело мне дается неясная необходимость во вложенных папках для класса, не понятно в какой именно папке запускать javac. Понимаю что создатели java любили линукс, и там засранные тысячами файлов папки, чудовищная иерархия вложенных папок и прочие чудеса считаются нормой. Но я воспитан в строгости и порядке, для меня в порядке вещей если исполняемый файл сам выясняет из какой папки был запущен и где искать свои *.ini, *.cfg, библиотеки и подобные файлы. 

Сейчас буду бороться с задвоенными вызовами будильника, видимо не до конца понимаю принципы работы сервиса в андроиде. AlarmManager вроде не при чем, в документации сказано что нельзя создать два одинаковых будильника на одно время. Или мне все же это удалось :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 26.02.2017 в 13:32, Евгений Корепов сказал:

С этим согласен. Но тут нужен java класс, компиляция его в jar, подключение jar к проекту - вот на это все у меня жуткая аллергия. Вчера пытался воспользоваться вашим bat-файлом, потом просто отдельными строками, в итоге психанул и все удалил :-) Особенно тяжело мне дается неясная необходимость во вложенных папках для класса, не понятно в какой именно папке запускать javac. Понимаю что создатели java любили линукс, и там засранные тысячами файлов папки, чудовищная иерархия вложенных папок и прочие чудеса считаются нормой. Но я воспитан в строгости и порядке, для меня в порядке вещей если исполняемый файл сам выясняет из какой папки был запущен и где искать свои *.ini, *.cfg, библиотеки и подобные файлы. 

Сейчас буду бороться с задвоенными вызовами будильника, видимо не до конца понимаю принципы работы сервиса в андроиде. AlarmManager вроде не при чем, в документации сказано что нельзя создать два одинаковых будильника на одно время. Или мне все же это удалось :-)

Вам хорошо с AlarmManager, а что делать любителям iOS?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, wamaco сказал:

Вам хорошо с AlarmManager, а что делать любителям iOS?

 

Можно об этом поподробнее? На днях как раз собираюсь iOS версию делать, и там нужен будет Alarm Manager. Т.е. там его нет? Как тогда можно запускать запланированные задания? Сервис в фоне?

Отредактировал ENRGY

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Так в том то и дело, что сервисов в iOS нет!  Безопасность.

Запланированные задания в iOS не запустить! Как сделать? Слать пуш, с призывом открыть приложение и что то совершить! :))

В iOS подход как в Android не прокатит!

Отредактировал wamaco

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Цитата

Слать пуш, с призывом открыть приложение и что то совершить! :))

 

Офигеть. А для пуша нужно подключение к интернет верно? А для пуша нужен свой сайт на хостинге? Или можно как -то использовать сервера Apple?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
5 часов назад, ENRGY сказал:

Офигеть. А для пуша нужно подключение к интернет верно? А для пуша нужен свой сайт на хостинге? Или можно как -то использовать сервера Apple?

в этой теме есть упоминание про сервис kinvey, возможно вам подойдёт

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

В MIUI вообще сервисы Delphi не запускаются.

Всем обладателям Xiaomi привет!

Отключил энергосбережение, предоставил приложению все привилегии. Смартфон ведет себя как iPhone.

Может кто-то знает как это лечится?

Redmi 4, Andorid 6.0.1, MIUI Global 8.0.

Отредактировал Pax Beach

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 24.03.2017 в 19:11, Pax Beach сказал:

В MIUI вообще сервисы Delphi не запускаются.

Проверил, запускает и работает (Xiaomi Redmi Note 4 MIUI Global 8.5).

Но вот наблюдаю такую проблему:

Есть сервис, который при старте делает POST-запрос и создает "будильник", для последующего перезапуска самого себя:

function TDM.AndroidServiceStartCommand(const Sender: TObject;
  const Intent: JIntent; Flags, StartId: integer): integer;
begin
  Result := TJService.JavaClass.START_STICKY; // тут может быть и START_NOT_STICKY - это не важно

  SendPost('post запрос до сервера');            

  PendIntent();
end;

procedure TDM.PendIntent(); 
var
  Intent: JIntent;
  PendingIntent: JPendingIntent;
begin
  Intent := TJIntent.Create;
  Intent.setAction(StringToJString('60sec'));
  Intent.setClassName(TAndroidHelper.Context,
    StringToJString('com.embarcadero.services.CabSrv'));

  PendingIntent := TJPendingIntent.JavaClass.getService(TAndroidHelper.Context,
    1, Intent, 0);

  TAndroidHelper.AlarmManager.&set(TJAlarmManager.JavaClass.RTC_WAKEUP,
    getTimeAfterInSecs(60), PendingIntent); // раз в минуту вызываем сервис
end;


procedure TDM.SendPost(txt: string);
var
  aResponse: IHTTPResponse;
  aResponser: TResponser;
  sStream: TStringStream;
  aHttpClient: TNetHTTPClient;
  sList: TStringList;
begin 
  TTask.Run(
    procedure
    begin
      try
        aHttpClient := TNetHTTPClient.Create(nil);        
        aHttpClient.OnValidateServerCertificate := OnValidateServerCertificate;        
        aHttpClient.AcceptLanguage := 'ru,en;q=0.8';
        aHttpClient.ContentType := 'application/x-www-form-urlencoded';
        aHttpClient.AcceptCharset := 'utf-8';
        aHttpClient.Accept :=
          'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8';

        sStream := TStringStream.Create();
        sList := TStringList.Create;
        sList.Add('txt=' + txt);
        
        try        
          aResponse := aHttpClient.Post(Sets.Host, sList, sStream);          
        finally
          if ((sStream <> nil) and (aResponse <> nil)) then
          begin            
            Log('SendPost OK');
          end
          else
            Log('SendPost Error');
          sStream.Free;
          sList.Free;
        end;
      finally
        aHttpClient.Free;
      end;

    end);
end;

Так вот если выгрузить программу (сервис перезапускается) и выключить экран, то через несколько минут сервис не может достучаться до сервера.

except java.net.SocketTimeoutException: connect timed out

В чем может быть проблема и как ее решить?

 

 

Отредактировал Rusland

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 11.09.2017 в 17:09, Rusland сказал:

Проверил, запускает и работает (Xiaomi Redmi Note 4 MIUI Global 8.5).

Так вот если выгрузить программу (сервис перезапускается) и выключить экран, то через несколько минут сервис не может достучаться до сервера. В чем может быть проблема и как ее решить?

 

 

Проблема в MUI.

Предполагаю, что надо искать решение в запросе разрешений на уведомления, разбудить телефон, показать приложение поверх других окон, еще что-нибудь такое. Потому что в MUI большой упор на энергосбережение, безопасность и спам.

Я замучился уже с MUI, не для разработчиков ось =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 18.09.2017 в 14:34, Pax Beach сказал:

Потому что в MUI большой упор на энергосбережение

Переключил режим Энергосбережения с Оптимальный на Отключено и сразу проблема с коннектом пропала :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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


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

    • От ComAlex
      Господа Delphi-программисты под Android (FireMonkey),
      Нужна ваша помощь или совет в направления решения в несложной, достаточно типичной и прозрачной задаче:
      Я хочу выполнять некоторые вычисления (или выдавать Toastы) через каждые 30 сек. в Android-приложении.
      Что-то типа сервиса (службы): Приложение запускает задание и может закрываться, 
      но периодические вычисления продолжаются (результат сохраняется, допустим, в ini - не важно пока), т.е. служба работает.
      Я не знаю, как это решить:
      1. Организовал как сервис.
          Сервисы убиваются androidом ... И это политика androidов: экономить батарию и т.д.
      2. Сделал через AlarmManager.
          Тоже это не работает на MI 9T (Android 10: API 29). На старых (Android 4...: API 19) всё работает.
      3. Хотел использовать job scheduler: добавлять задания и удалять исполненные. Но не знаю как. ничего не нагуглил под Firemonkey. Может кто знает?
      Какие ещё варианты и вообще, это решается на Firemonkey Delphi XE 10.3.3?
      На поиск решения мною потрачено много время - сдвинуться не могу.
      Если Delphi это не умеет, так и скажите - перепрыгну на другую платформу.
          Может Delphi об этом думает, чтоб это скоро реализовать? В интернете тишина.
      Если Delphi это умеет, просьба дать идею или совет или пример ...
    • От Евгений Корепов
      Я написал класс для демонизации приложения в linux. Класс форкает процесс, обрабатывает поступающие сигналы и передает их в основной поток через потокобезопасную очередь.
      Исходники https://github.com/EvgeniyKorepov/LinuxDaemon
      Для использования просто подключите модуль UnitDaemon в свое консольное приложение:
      program DaemonTest; {$APPTYPE CONSOLE} uses System.SysUtils, System.IOUtils, System.SyncObjs, Posix.Stdlib, Posix.SysStat, Posix.SysTypes, Posix.Unistd, Posix.Signal, Posix.Fcntl, Posix.Syslog in 'Posix.Syslog.pas', UnitDaemon in 'UnitDaemon.pas'; var AEventType : TEventType; begin syslog(LOG_NOTICE, 'main START'); while True do begin syslog(LOG_NOTICE, 'main LOOP'); if UnitDaemon.QueueEvent.PopItem(AEventType) = System.SyncObjs.TWaitResult.wrSignaled then begin syslog(LOG_NOTICE, 'main UnitDaemon.QueueEvent.PopItem'); case AEventType of TEventType.StopProcess : begin syslog(LOG_NOTICE, 'main Event StopProcess'); ExitCode := EXIT_SUCCESS; exit; end; TEventType.Start : begin syslog(LOG_NOTICE, 'main Event START'); end; TEventType.Reload : begin // Reload config syslog(LOG_NOTICE, 'main Event RELOAD'); end; TEventType.Stop : begin syslog(LOG_NOTICE, 'main Event STOP'); ExitCode := EXIT_SUCCESS; exit; end; end; end; Sleep(50); end; end. Так же поддерживается systemd - для этого положите  DaemonTest.service в /etc/systemd/system/ и используйте :
      systemctl start DaemonTest.service systemctl reload DaemonTest.service systemctl stop DaemonTest.service  
    • От Евгений Корепов
      Вот просто идеальная статья по запуску демона под Linux http://blog.paolorossi.net/2017/09/04/building-a-real-linux-daemon-with-delphi-part-2/ 
      Помимо объяснения механизма fork с отличными примерами,  есть куча дополнительной наиполезнейшей инфы.
    • От Игорь Маринин
      поделитесь пожалуйста пустым проектом, готовым к публикации для TV устройств.
      что-то никак не получается опубликовать, сейчас отклонили с такими ошибками:
      APK:8
      No Now Playing notification [card]"
      Your App does not contain a “Now Playing” notification [card] for when the user has selected the HOME button within the app. Please refer to our Displaying a Now Playing Card documentation for more details.
      APK:8
      Play/Pause key event is not respected during playback
      Your media apps that play video or music content must respect the play/pause key during playback. Please refer to our Media Play/Pause documentation and Update the Playback State documentation for details.
      Missing DPad functionality
      Your app requires user interaction for menus or app navigation. Please make sure that all menus and app navigation are fully functional using a DPad. Please refer to our DPAD Control and Hardware Declaration documentation.
      ну и баннер не прилепил
      No full-size app banner
      Your app does not contain a full-size app banner or is it not visible in the launcher. We are targeting 1080P, which we consider xhdpi. Apps should include the banner in the xhdpi (320 dpi) drawables folder with a size of (320px × 180px). Please refer to our Home Screen Banner and UI Patterns documentation.
      The title should help users identify apps in the launcher. Please refer to our Visual Design and User Interaction documentation for more information.
      был бы очень благодарен за рабочий пустой костяк с манифестом.
       
    • От krapotkin
      В процессе разработки столкнулся с очень странной ситуацией, корни которой до сих пор неясны, но решение нашлось.
      Итак. Делфи 10.3.3. Чистое приложение - пустая форма и кнопка. Отлично работает на разных устройствах кроме Samsung Galaxy Tab A (2016). Android 5.1.1
      Программа падает, не успев даже загрузиться. Любая. При этом она же, скомпилированная на другом компе, запускается нормально. И даже после изменения SDK/NDK на нем, ничего не падает.
      LogCat дает крайне странную картину
      java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.embarcadero.Project1-1/libProject1.so
      Начинаем экспериментировать с SDK, NDK и т.д. Поставил также хотфиксы для 10.3.3.
      Сразу скажу, SDK/NDK ставились отдельно через Android studio, не скачивались вместе с Delphi. Не торопитесь бросать чтение на этом месте!)) На другом компе, где все работает, все ставилось точно так же.
      Короче, очень много комбинаций версий SDK/NDK проверено.
      Результат такой. При постепенном понижении версии NDK все взлетело при NDK v22.

      При этом версия SDK видимо такого большого влияния не имеет, потому что этот вариант нормально работает

      Повторюсь. На других устройствах все работало и на более новых Ndk. Xiaomi Mi Pad4 , Samsung Galaxy Tab A (2019), Xiaomi Redmi 5 и 5Plus
       
      Спасибо за участие и помощь в разборе завалов @Andrey Efimov
       
    • От krapotkin
      У меня в работе два приложения, и оба они не предназначены для Play market, так как имеют ограниченный круг использования, по сути, чисто внутрикорпоративные. Так что нежелательно и выкладывание их и на альтернативные магазины приложений. 
      Автоматически возникает вопрос обновления. Если в  первый раз мы можем установить приложение сами при помощи админов, то обновлять их не так просто. А контингент пользователей не справится с "скачайте APK по ссылке, найдите, куда его скачал браузер, и запустите вручную именно последний скачанный, а не какой попало"...
      Простейший способ - дать приложению скачать свежую копию с сайта и натравить на полученный файл системный инсталлер.
      Вот только свежие Andoird делать это напрямик запрещают. Нужен filepropvider. Целый день шуровал по мануалам и YT,
      Вот то что получилось  в результате.
      Если у вас 10.3.3 как у меня, уже можно не вносить <provider>...</provider> в манифест и свой файл file_paths.xml (или как вам его советуют назвать в интернетах) в деплой.
      Теперь все это делается хоть несколько странно и однобоко, но автоматически, путем установки галочки Secure File Sharing

      после этого в манифесте автоматически пропишется один из вариантов размещения файлов, которые вы можете найти в интернете. Используется алиас external-path
      файл, показанный на рисунке, создается автоматически самой делфи.

      теперь остается отгадать, какой путь реально подставится вместо "."
      Как показала практика, все пути выглядят не так, как кажется, если исходить из простого здравого смысла. Целый день использования GetHomeDir и других полезных методов TPath завел меня совсем в тупик.
      Оказалось все проще (?)
      st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; ... OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+'/ASDroid2.apk'; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); обратите внимание, в provider_paths мы задаем external-paths, а в коде ищем ExternalCacheDir.!!!  (For.Unbelievably.Creative.Knowers!)
      Потом все просто. FApkUri передаем в интент и запускаем 
      итоговый код примерно таков. (скачивание в потоке с использованием небольшого собственного API, но там ничего важного, можно не обращать внимания)
      procedure TasdSettingsFrame.bDownloadClick(Sender: TObject); begin {$IFDEF ANDROID} bDownload.Enabled := False; DownloadAndRun(); {$ENDIF} end; {$IFDEF ANDROID} procedure TasdSettingsFrame.DownloadAndRun(); begin ttask.Run(procedure var aapi:TasdAPI; st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; begin st := TMemoryStream.Create; aapi := TasdAPI.Clone(_API); try aapi.OnReceiveData := OnReceiveData; aapi.getApk(st); if aapi.Err.Code=0 then begin OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+'/ASDroid2.apk'; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); TThread.Synchronize(nil,procedure begin bDownload.Enabled := true; StartActivity(FApkUri); end); end; finally st.Free; aapi.Free; end; end); end; procedure StartActivity(ApkUri: Jnet_Uri); var Intent: JIntent; begin Intent := TJIntent.Create(); Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK or TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP or TJIntent.JavaClass.FLAG_GRANT_WRITE_URI_PERMISSION or TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION); Intent.setDataAndType(apkuri, StringToJString('application/vnd.android.package-archive')); TAndroidHelper.Activity.startActivity(Intent); end; procedure TasdSettingsFrame.OnReceiveData(const Sender: TObject; AContentLength: Int64; AReadCount: Int64; var Abort: Boolean); begin tthread.Synchronize(nil, procedure begin pb1.Max := AContentLength; pb1.Value := AReadCount; end); end; {$ENDIF} Вопросы остались конечно, почему так странно с каталогами, но выяснять пока нет желания. Работает - не трожь.
      Всем удачи.
      UPD.
      Для того, чтобы системный инсталлер запускался, нужно не забыть отметить еще одну галочку

       
       
       
       
       
    • От Дмитрий Потапов
      Приветствую. На просторах интернета нашел BASS-библиотеку для Android и соответственно обертку для нее под Delphi.

      Вроде бы все работает нормально, но вот при настройке библиотеки при помощи методов
      BASS_GetConfigPtr, BASS_SetConfigPtr для работы со строковыми параметрами возникает проблема.
      На Windows с этим я легко работал, там достаточно использовать такую конструкцию

       
      PAnsiChar(BASS_GetConfigPtr(configId)) и получаем значение. BASS_SetConfigPtr(configId, PAnsiChar(value)) и задаем значение. Но вот под Android такой способ не проходит, как минимум по одной причине - он не понимает, что такое PAnsiChar. На docwiki.emarcadero.com, есть вот такая статейка. В которой написано, что PAnsiChar нужно заменить одним из трех: System.String, System.MarshalledString или System.SysUtils.TStringBuiler
      Только вот, если использовать MarshalledString, то при попытке получить значение приложение просто намертво зависает и все.
      Потом я подумал, так как библиотека написана на Java (вероятно), то может стоит попробовать использовать JNI в работе с ней, так как в Java файле, который прилагался вместе с библиотекой. Там я нашел объявления этих функций и заметил, что тип возвращаемого значения Object (ну, не зная Java я просто предположил, что это тоже просто ссылка на значение, например как PAnsiChar в Delphi на Windows).

      Но, при попытке как-либо использовать это натыкаюсь на проблемы в виде ошибки компиляции, либо очередном зависании приложения.
      Так как возвращается Object, то решил попробовать вариант с JObject и JString, но ни один вариант не хочет работать, опять ошибки на стадии компиляции, либо зависание приложение. Может быть, я что-то не так делаю.

      В общем, буду признателен за помощь!
    • От Yarpda
      Доброго времени!
      Есть идея сделать возможность резервирования данных приложения на Google drive под текущим аккаунтом пользователя. Ничего подобного я на форуме не нашел, может быть кто-то уже пытался решать подобную задачу? Интересует работа с Gdrive  в первую очередь.
    • От Ali Ezzeddine
      65/5000       Уважаемые,
      Есть ли способ вызвать сервис Java из приложения Delphi FMX?
    • От Эрик Шакиров
      Привет всем! Кто нибудь может подсказать как реализовать анимацию переходов между формами в Android без использования TabControl? Или подсказать в какую сторону "рыть"
  • Последние посетители   0 пользователей онлайн

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

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