Підкинуло начальство завдання, та не просту. Додаток має в тлі моніторити gps, збирати дані про батарею, Залогуватися і потім зливати на сервер. Все це буде нащадно жерти батарею, розумію, але начальству потрібен саме цей варіант. Перейду до питань:
1.Нужно пиляти сервіс, але виходячи з минулих тем - таймер не працює, сліпи не варіант, як зробити так, щоб сервіс прокидався кожні 5 хвилин / 15 хвилин / 1 година.
2.Моніторінг GPS, тут рішення на кшталт знайшов в цій гілці для seattle, як найкраще збирати і зберігати дані для відправки? (До цього все зберігав в простих .txt)
3.Работают чи компоненти indy коректно в сервісі? спрацьовують чи except'и і як правильно моніторити підключення до мережі?
Проблема ще й у тому, що програма повинна працювати більш-менш стабільно і якщо досвід написання простих програм у мене є, то з сервісами вже пару місяців не можу подружитися.
Всім бобра!
Проблема давня, хочеться нарешті розібратися з нею.
Ось створив тестовий приклад, в якому додаток TestPro і локальний Android-сервіс до нього TestService2.
Запускаю програму, натискаю кнопку Start Service, сервіс стартує (побачити можна в Настройки -> Програми -> Працюючі).
Не закриваючи програму, переходжу до інших програм і працюю в них. Найкраще перейти в який-небудь браузер і полазити по вкладках (це досить ресурсномістке додаток).
Після декількох хвилин через диспетчер задач я повертаюся в свій додаток і воно починає завантажуватися з нуля. Тобто система давно прибила програму і вона почне завантажувати заново. Так ось програма довго висить на заставці, а потім виходить повідомлення що програма не відповідає! Натискаємо OK. Після повторного перезапуску програми відбувається те ж саме і лише на третій раз скрипт буде працювати.
Як вирішити цю проблему?
Я пробував вбивати сервіс
var LIntent: JIntent; LIntent: = TJIntent.Create; LIntent.setClassName (TAndroidHelper.Context.getPackageName (), TAndroidHelper.StringToJString ( 'com.embarcadero.services.TestService2')); TAndroidHelper.Activity.stopService (LIntent); до рядка Application.Initialize - не допомагає.
Я реалізував приклад роботи з мікрофоном і таймером в 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; // do not 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
Намагаюся з сервісу вивести лог, але в monitor нічого не приходить.
Для прикладу ось тестовий проект
Перевірте, як у вас?
PS. З додатку лог приходить нормально
Чи можна працювати з однією базою одночасно і з програми і з сервісу?
PS. Android
Власне, сабж в заголовку. Як?
Намагаюся використовувати SQLite + FDConnection.
FDConnection.Params.Database: = TPath.Combine (System.IOUtils.TPath.GetDocumentsPath, 'basename.db'); працює в основній формі, але вішає сервіс.
# 13; Не можу налаштувати колір тексту заголовка в TabItem. Міняю шрифт, розмір і колір. Але все залишається колишнім. # 13;
# 13; # 13; # 13; # 13;
Звичайний TTimer використовувати не можна. До речі чому не можна? Чому він звертається до Активити в Androidapi.Helpers?
Embarcadero виправте вже свій баг.
Як реалізувати timer в сервісі?
Зараз на сторінці 0 користувачів
Немає користувачів, які переглядають цю сторінку