Autoritățile au aruncat sarcina, dar nu și simplu. Aplicația ar trebui să afișeze pe monitorul de fundal GPS, să colecteze date despre baterie, să jurnalizeze și să se îmbină pe server. Toate acestea vor consuma nemilos bateria, înțeleg, dar autoritățile au nevoie de această opțiune. Mă adresez întrebărilor:
1.Nuzhno a văzut serviciul, dar pe baza unor subiecte anterioare - timerul nu funcționează, alunecările nu sunt o opțiune, cum se face trezirea la fiecare 5 minute / 15 minute / 1 oră.
2.Monitorizarea GPS, aici ca soluția găsită în acest thread pentru Seattle, cât mai bine să colectezi și să stochezi date pentru trimitere? (înainte ca totul să fi fost păstrat în simplu .txt)
3. Componentele indy funcționează corect în serviciu? Sunt excepțiile care funcționează și cum să monitorizeze corect conexiunea la rețea?
Problema este că programul ar trebui să funcționeze mai puțin în mod constant și dacă am experiență de scriere a unor aplicații simple, nu pot face prieteni cu serviciile de câteva luni.
Pentru totul castor!
Problema este veche, vreau să mă descurc în sfârșit.
Aici este un caz de testare în care aplicația TestPro și serviciul local Android la TestService2.
Am lansat programul, apăs butonul Start Service, serviciul pornește (consultați Setări -> Aplicații -> Lucrare).
Fără a închide programul, trec la alte programe și lucrez în ele. Cel mai bine este să mergeți la un browser și să urcați prin file (aceasta este o aplicație destul de intensă pentru resurse).
După câteva minute prin managerul de activități, mă întorc la aplicația mea și începe să se încarce de la zero. Asta este, sistemul a bătut lung programul și începe să se descarce din nou. Deci, programul se blochează pe ecranul protector pentru o lungă perioadă de timp, iar apoi se afișează mesajul că aplicația nu răspunde! Faceți clic pe OK. După repornirea din nou a programului, același lucru se întâmplă și numai a treia oară când programul este pornit.
Cum de a rezolva această problemă?
Am încercat să ucid serviciul
var LIntent: JIntent; LIntent: = TJIntent.Create; LIntent.setClassName (TAndroidHelper.Context.getPackageName (), TAndroidHelper.StringToJString ( 'com.embarcadero.services.TestService2')); TAndroidHelper.Activity.stopService (LIntent); până la linia Application.Initialize - nu ajută.
Am implementat un exemplu de lucru cu un microfon și un cronometru în serviciul Android, așa cum este indicat în subiectul întrebării.
De fiecare dată când trimiteți serviciul StartCommand sau serviciul este repornit, înregistrarea de pe microfon este activată și salvată în directorul de muzică în fișierul "myrecord.3gp".
Sper că exemplul meu vă va ajuta să creați noi soluții utile. În acest caz, vă rugăm să le partajați cu membrii comunității noastre.
Pentru a depana programele pe Android, utilizați intrarea în LOGI și citiți cu monitor.bat (PlatformSDKs \ android-sdk-windows \ tools).
folosește. AndroidApi.JNI.Media, // JMediaRecorder AndroidApi.Timer, // Timer. ; Const TimerInterval = 1000; TimerCounterSecLimit = 10; tip TDM = clasă (TAndroidService). privat FTimerHandle: Integer; Înregistrare: Boolean; procedură StartRecord; procedura StopRecord; procedura StartTimer; procedura StopTimer; publice FAudioRec: JMediaRecorder; se încheie; procedură Log (const Fmt: string; const Params: array const); suprasarcină; var Msg: șir; M: TMarshaller; începeți Msg: = Format (Fmt, Params); LOGI (M.AsUtf8 (Msg) .Tointer); se încheie; procedură Log (const Sursă: șir); suprasarcină; var M: TMarshaller; începe LOGI (M.AsUtf8 (Source) .ToPointer); se încheie; procedura TDM.AndroidServiceCreate (expeditor: TObject); începe FTimerHandle: = 0; FTimerCounter: = 0; FRecording: = false; se încheie; procedura TDM.AndroidServiceDestroy (expeditor: TObject); începe StopTimer; StopRecord; se încheie; Funcția TDM.AndroidServiceStartCommand (Expeditor const: TObject; Intent const: JIntent; Steaguri, StartId: Integer): Integer; începe dacă Intent.getAction.equalsIgnoreCase (StringToJString ('StopIntent')) apoi începe StopTimer; StopRecord; Rezultat: = TJService.JavaClass.START_NOT_STICKY; // nu reîncărcați serviciul Log ('- service stopped', []); incepe altceva incepe daca nu inseamna FRecording apoi incepe Log ('inregistreaza un sunet care sa inceapa', []); startRecord; startTimer; se încheie; Rezultat: = TJService.JavaClass.START_STICKY; // reîncercați serviciul dacă oprește Log ('+ Serviciu început', []); se încheie; se încheie; procedura TDM.StartRecord; începe 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'))); încercați FAudioRec.Prepare (); FAudioRec.start; FRecording: = Adevărat; Log ( '+ Start înregistrare la% s', [TPath.Combine (TPath.GetSharedMusicPath, 'myrecord.3gp')]); cu excepția cazului E: Excepție do Log ('- Eroare în înregistrarea microfonului:% s', [E.Message]); se încheie; se încheie; procedura TDM.StopRecord; incepe daca Assigned (FAudioRec) atunci incepe daca FRecording incepe atunci FRecording: = false; încercați FAudioRec.stop (); FAudioRec.release (); Jurnal ('- înregistrarea Mic este oprită'); cu excepția cazului E: Excepție do Log ('- Eroare în înregistrarea stop mic:% s', [E.Message]); se încheie; se încheie; incepe altfel FRecording: = false; se încheie; se încheie; procedura TDM.WaitComplete (TimerId: Integer); începe în cazul în care FTimerCounter
Încerc să scot un jurnal din serviciu, dar nu vine nimic de monitorizat.
De exemplu, aici este un proiect de testare
Verifică, ce mai faci?
PS. Din jurnalul aplicației vine în mod normal
Este posibil să lucrați simultan cu o singură bază de date atât din program cât și din serviciu?
PS. Android
De fapt, subiectul din titlu. Cum?
Încerc să folosesc SQLite + FDConnection.
FDConnection.Params.Database: = TPath.Combine (System.IOUtils.TPath.GetDocumentsPath, 'basename.db'); funcționează în forma de bază, dar închide serviciul.
# 13; Nu pot personaliza culoarea textului antetului în TabItem. Schimba fontul, dimensiunea și culoarea. Dar totul rămâne același.
# 13; # 13; # 13; # 13;
TTimerul normal nu poate fi utilizat. Apropo, de ce nu? De ce se referă la Activiti în Androidapi.Helpers?
Embarcadero repară bug-ul tău.
Cum să implementați temporizatorul în serviciu?
Acum, la pagina 6 utilizatori
Nu utilizatorii care vizualizează această pagină