Skip to Content
ആമുഖംപ്ലാറ്റ്ഫോം സജ്ജീകരണംആൻഡ്രോയിഡ് SDK

Android SDK: ബാറ്ററി മാനേജരെ മെരുക്കുന്നു

പശ്ചാത്തല സേവനങ്ങളെ ആക്രമണാത്മകമായി ഇല്ലാതാക്കുന്നതിൽ ആൻഡ്രോയിഡ് കുപ്രസിദ്ധമാണ്. ചൈനീസ് OEM-കളിൽ (Xiaomi, Huawei പോലുള്ളവ) സാധാരണ Android പശ്ചാത്തല നിർവ്വഹണ പരിധികൾ പൂർണ്ണമായും ലംഘിക്കുന്ന ഇഷ്‌ടാനുസൃത പവർ മാനേജർമാരുണ്ട്.

ഈ പേജ് എന്തുകൊണ്ട് ആൻഡ്രോയിഡ് നിങ്ങളുടെ ആപ്പിനെ ഇല്ലാതാക്കുന്നു എന്നും എങ്ങനെ ട്രെയ്‌സ്‌ലെറ്റിൻ്റെ നിർദ്ദിഷ്ട Android കോൺഫിഗറേഷനുകൾ യഥാർത്ഥ ലോകത്ത് അത് പരിഹരിക്കുന്നു.


ഓപ്ഷണൽ ഡിപൻഡൻസി: ഉയർന്ന കൃത്യതയുള്ള GMS ലൊക്കേഷൻ

Tracelet-ൻ്റെ Android SDK-ന് Google Play സേവനങ്ങളുടെ സ്ഥാനം ഉപയോഗിക്കാം — FusedLocationProviderClient (മികച്ച കൃത്യതയും ബാറ്ററിയും), ഹാർഡ്‌വെയർ ആക്‌റ്റിവിറ്റി തിരിച്ചറിയൽ (നടത്തം / ഡ്രൈവിംഗ് / ഇപ്പോഴും), ഹാർഡ്‌വെയർ ജിയോഫെൻസിംഗ്. SDK ഭാരം കുറഞ്ഞതും Google-ലെസ് ഉപകരണങ്ങളിൽ ഉപയോഗിക്കാവുന്നതുമാക്കി നിലനിർത്താൻ, ഇത് ആശ്രിതത്വം ബണ്ടിൽ ചെയ്തിട്ടില്ല. നിങ്ങൾക്ക് ഉയർന്ന കൃത്യതയുള്ള പാത വേണമെങ്കിൽ മാത്രം നിങ്ങൾ അത് ചേർക്കുക:

// android/app/build.gradle.kts dependencies { implementation("com.google.android.gms:play-services-location:21.3.0") }

ഇത് ഓപ്ഷണൽ ആണ്, SDK ഭംഗിയായി തരംതാഴ്ത്തുന്നു. play-services-location ഇല്ലാതെ, Tracelet സാധാരണ AOSP LocationManager (പ്ലെയിൻ GPS) ലേക്ക് തിരികെ വരുന്നു. ട്രാക്കിംഗ് ഇപ്പോഴും പ്രവർത്തിക്കുന്നു - നിങ്ങൾ മാത്രം സംയോജിപ്പിച്ച ദാതാവിൻ്റെ കൃത്യത/ബാറ്ററി ആനുകൂല്യങ്ങൾ, ഹാർഡ്‌വെയർ പ്രവർത്തന തിരിച്ചറിയൽ, ഹാർഡ്‌വെയർ എന്നിവ നഷ്ടപ്പെടും ജിയോഫെൻസിംഗ്. ശുപാർശ ചെയ്‌തത്: നിങ്ങൾ പ്രത്യേകമായി Google-ലെസ് / AOSP ഉപകരണങ്ങളെ ടാർഗെറ്റ് ചെയ്യുന്നില്ലെങ്കിൽ ഇത് ചേർക്കുക (ഉദാ. GMS ഇല്ലാത്ത Huawei, അല്ലെങ്കിൽ ഡീ-ഗൂഗിൾഡ് റോമുകൾ).

മിനിമം പതിപ്പ്: 21.2.0. ട്രേസ്‌ലെറ്റിൻ്റെ ആൻഡ്രോയിഡ് കോഡ് ഇൻ്റർഫേസ് അധിഷ്‌ഠിതമായി വിളിക്കുന്നു FusedLocationProviderClient, ActivityRecognitionClient API-കൾ, അത് മാത്രമായി play-services-location 21.2.0 എന്നതിലെ ഇൻ്റർഫേസുകൾ. പഴയ റിലീസുകൾ (ഉദാ. 19.0.0) ഇവ അയയ്ക്കുന്നു കോൺക്രീറ്റ് ക്ലാസുകളായി, അതിനാൽ അവയിലേക്ക് വിളിക്കുന്നത് എറിയുന്നു റൺടൈമിൽ java.lang.IncompatibleClassChangeError. Tracelet ഒരു Gradle പ്രസിദ്ധീകരിക്കുന്നു play-services-location-നെ 21.2.0+-ലേക്ക് സ്വയമേവ ഉയർത്തുന്ന ആശ്രിതത്വം നിയന്ത്രണം മറ്റൊരു ഡിപൻഡൻസി പഴയ പതിപ്പിലേക്ക് വലിച്ചിടുന്നു, എന്നാൽ നിങ്ങൾ സ്വയം പതിപ്പ് പിൻ ചെയ്യുകയാണെങ്കിൽ, അത് നിലനിർത്തുക 21.2.0 അല്ലെങ്കിൽ പുതിയത് (ഞങ്ങൾ 21.3.0 ശുപാർശ ചെയ്യുന്നു).

play-services-location ഉപയോഗിച്ച്അതില്ലാതെ (AOSP ഫാൾബാക്ക്)
ഫ്യൂസ്ഡ് ലൊക്കേഷൻ (മികച്ച കൃത്യത + ബാറ്ററി)LocationManager വഴി റോ ജിപിഎസ് / നെറ്റ്‌വർക്ക്
ഹാർഡ്‌വെയർ ആക്‌റ്റിവിറ്റി തിരിച്ചറിയൽ (onActivityChange)ആക്സിലറോമീറ്റർ മാത്രം ചലനം കണ്ടെത്തൽ
ഹാർഡ്‌വെയർ ജിയോഫെൻസിംഗ്സോഫ്‌റ്റ്‌വെയർ (ഇൻ-എസ്‌ഡികെ) ജിയോഫെൻസ് മൂല്യനിർണ്ണയം

ഓപ്ഷണൽ ഡിപൻഡൻസി: പ്ലേ ഇൻ്റഗ്രിറ്റി (ഉപകരണ സാക്ഷ്യപ്പെടുത്തൽ)

നിങ്ങൾ Tracelet-ൻ്റെ ഉപകരണ അറ്റസ്റ്റേഷൻ ഫീച്ചർ (AttestationConfig) ഉപയോഗിക്കുകയാണെങ്കിൽ, ആൻഡ്രോയിഡ് Google Play ഇൻ്റഗ്രിറ്റി വഴി സൈഡ് അതിൻ്റെ ക്രിപ്‌റ്റോഗ്രാഫിക് ടോക്കൺ സൃഷ്ടിക്കുന്നു. പോലെ തന്നെ play-services-location, ഈ ആശ്രിതത്വം ബണ്ടിൽ ചെയ്തിട്ടില്ല — നിങ്ങൾ അത് ചേർക്കുമ്പോൾ മാത്രം സാക്ഷ്യപ്പെടുത്തൽ പ്രവർത്തനക്ഷമമാക്കുക:

// android/app/build.gradle.kts dependencies { implementation("com.google.android.play:integrity:1.6.0") }

ഇത് ഓപ്ഷണൽ ആണ്, അറ്റസ്റ്റേഷൻ ഭംഗിയായി തരംതാഴ്ത്തുന്നു. Play ഇൻ്റഗ്രിറ്റി ഇല്ലാതെ ആശ്രിതത്വം, Tracelet-ലെ മറ്റെല്ലാം സാധാരണയായി പ്രവർത്തിക്കുന്നു - സാക്ഷ്യപ്പെടുത്തൽ മാത്രമേ ബാധിക്കുകയുള്ളൂ: AttestationConfig(enabled: true) ഒരു മുന്നറിയിപ്പും Tracelet.getAttestationToken() ഉം രേഖപ്പെടുത്തുന്നു ക്രാഷുചെയ്യുന്നതിനുപകരം ഒരു ടോക്കണിന് പകരം null നൽകുന്നു. നിങ്ങളാണെങ്കിൽ മാത്രം ആശ്രിതത്വം ചേർക്കുക സാക്ഷ്യപ്പെടുത്തൽ പ്രവർത്തനക്ഷമമാക്കുകയും Android-ൽ Play ഇൻ്റഗ്രിറ്റി വിധി ആവശ്യമാണ്. കാണുക ഉപകരണ അറ്റസ്റ്റേഷൻ ഗൈഡ്  പൂർണ്ണമായ വർക്ക്ഫ്ലോയ്ക്കും സെർവർ-സൈഡ് പരിശോധനയ്ക്കും.

ഇത് implementation ആയിരിക്കണം, compileOnly അല്ല. പ്ലേ ഇൻ്റഗ്രിറ്റി ഉള്ളിൽ compileOnly ആണ് Tracelet SDK (അതിനാൽ അറ്റസ്റ്റേഷൻ ഉപയോഗിക്കാത്ത ആപ്പുകളിൽ ഇത് ഒരിക്കലും ഷിപ്പ് ചെയ്യുകയോ നിർബന്ധിക്കുകയോ ചെയ്യില്ല). എങ്കിൽ നിങ്ങളുടെ ആപ്പ് മൊഡ്യൂളിലേക്ക് ഡിപൻഡൻസി ചേർക്കാതെ നിങ്ങൾ സാക്ഷ്യപ്പെടുത്തൽ പ്രവർത്തനക്ഷമമാക്കുന്നു implementation, റൺടൈമിൽ ക്ലാസുകൾ ഇല്ല, അറ്റസ്റ്റേഷൻ നിശബ്ദമായി null നൽകുന്നു.


അനുമതികളും മാനിഫെസ്റ്റ് സജ്ജീകരണവും

നിങ്ങളുടെ ആപ്പ് കംപൈൽ ചെയ്യുമ്പോൾ Tracelet നിങ്ങളുടെ AndroidManifest.xml-ലേക്ക് ആവശ്യമായ അനുമതികൾ സ്വയമേവ കുത്തിവയ്ക്കുന്നു. സ്ഥിരസ്ഥിതിയായി, ഇത് അഭ്യർത്ഥിക്കുന്നു:

  • ACCESS_COARSE_LOCATION & ACCESS_FINE_LOCATION (ട്രാക്കിംഗിന് ആവശ്യമാണ്)
  • ACCESS_BACKGROUND_LOCATION (ആപ്പ് അടയ്‌ക്കുമ്പോൾ ട്രാക്കുചെയ്യുന്നതിന് ആവശ്യമാണ്)
  • FOREGROUND_SERVICE & FOREGROUND_SERVICE_LOCATION (തുടർച്ചയായ പശ്ചാത്തല നിർവ്വഹണത്തിന് ആവശ്യമാണ്)
  • ACTIVITY_RECOGNITION (സ്മാർട്ട് മോഷൻ-ഡിറ്റക്ഷൻ എഞ്ചിന് ആവശ്യമാണ്)
  • POST_NOTIFICATIONS (Android 13+ ഫോർഗ്രൗണ്ട് സർവീസ് UI-ന് ആവശ്യമാണ്)
  • SCHEDULE_EXACT_ALARM (കൃത്യമായ ആനുകാലിക മോഡ് ട്രാക്കിംഗിന് ആവശ്യമാണ്)

ഉപയോഗിക്കാത്ത അനുമതികൾ നീക്കം ചെയ്യുന്നു (മാനിഫെസ്റ്റ് ലയനം)

നിങ്ങളുടെ ആപ്പിന് ഒരു നിർദ്ദിഷ്‌ട ഫീച്ചർ ആവശ്യമില്ലെങ്കിൽ (ഉദാഹരണത്തിന്, നിങ്ങളുടെ ക്ലയൻ്റിന് ചലനം കണ്ടെത്തൽ ആവശ്യമില്ല, അല്ലെങ്കിൽ നിങ്ങൾ ആനുകാലിക മോഡ് ഉപയോഗിക്കുന്നില്ല), നിങ്ങളുടെ ആപ്പ്-ലെവൽ AndroidManifest.xml (android/app/src/main/AndroidManifest.xml) എന്നതിലെ ആൻഡ്രോയിഡിൻ്റെ മാനിഫെസ്റ്റ് ലയന tools:node="remove" നിർദ്ദേശം ഉപയോഗിച്ച് നിങ്ങൾക്ക് നിർബന്ധമായും അനുമതി നീക്കം ചെയ്യാം.

ട്രെയ്‌സ്‌ലെറ്റിൻ്റെ നേറ്റീവ് കോഡ് checkSelfPermission() ഉപയോഗിച്ച് പൂർണ്ണമായും സംരക്ഷിച്ചിരിക്കുന്നു. നഷ്‌ടമായ അനുമതികൾ ക്രാഷുകളല്ല, മനോഹരമായ ഫാൾബാക്കുകളെ ട്രിഗർ ചെയ്യും.

അനുമതിനീക്കം ചെയ്യുമ്പോൾ പ്രഭാവം (tools:node="remove")
ACTIVITY_RECOGNITIONസുരക്ഷിതം. അടിസ്ഥാന ആക്‌സിലറോമീറ്റർ മാത്രമുള്ള ചലനം കണ്ടെത്തലിലേക്ക് മടങ്ങുന്നു. onActivityChange സ്ട്രീം ഫയർ ചെയ്യില്ല (നടത്തം/ഓട്ടം/ഡ്രൈവിംഗ് വർഗ്ഗീകരണം ഇല്ല).
ACCESS_BACKGROUND_LOCATIONസുരക്ഷിതം. ആപ്പ് പൂർണ്ണമായും പശ്ചാത്തലത്തിലായിരിക്കുമ്പോഴോ സ്വൈപ്പ് ചെയ്യുമ്പോഴോ Android 10+ ട്രാക്കിംഗ് നിയന്ത്രിക്കും.
SCHEDULE_EXACT_ALARMസുരക്ഷിതം. ആനുകാലിക മോഡ് ബാറ്ററി-ഫ്രണ്ട്ലി, എന്നാൽ കൃത്യതയില്ലാത്ത, വർക്ക്മാനേജർ ടൈമറുകൾ ഉപയോഗിക്കുന്നതിലേക്ക് മടങ്ങുന്നു.
POST_NOTIFICATIONSസുരക്ഷിതം. ഫോർഗ്രൗണ്ട് സേവന സ്ഥിരമായ അറിയിപ്പ് Android 13+-ൽ മറച്ചിരിക്കുന്നു. സർവീസ് ഇപ്പോഴും നടക്കുന്നു.
REQUEST_IGNORE_BATTERY_OPTIMIZATIONSസുരക്ഷിതം. നിങ്ങൾക്ക് OS-ൽ നിന്ന് ബാറ്ററി ഒപ്റ്റിമൈസേഷൻ ഇളവുകൾ അഭ്യർത്ഥിക്കാൻ കഴിയില്ല.
FOREGROUND_SERVICE / FOREGROUND_SERVICE_LOCATIONജിയോഫെൻസ് മാത്രമുള്ള / ആനുകാലികമായി മാത്രമുള്ള ആപ്പുകൾക്ക് സുരക്ഷിതം. അവ നീക്കം ചെയ്യുന്നത് തുടർച്ചയായ ഫോർഗ്രൗണ്ട് ട്രാക്കിംഗ് (start()) പ്രവർത്തനരഹിതമാക്കുന്നു, എന്നാൽ സ്റ്റാൻഡേർഡ് ജിയോഫെൻസിംഗും ആനുകാലിക മോഡും പ്രവർത്തിക്കുന്നത് തുടരും. തുടർച്ചയായ പശ്ചാത്തല ട്രാക്കിംഗിന് ആവശ്യമാണ്.
ACCESS_FINE_LOCATION / COARSEസുരക്ഷിതമല്ല. ലൊക്കേഷൻ അനുമതിയില്ലാതെ, ട്രേസ്‌ലെറ്റിന് സ്ഥാനങ്ങൾ നേടാനാവില്ല

Google Play ഫോർഗ്രൗണ്ട്-സേവന നയം (2026 ഒക്ടോബർ 28 മുതൽ പ്രാബല്യത്തിൽ വരും). ജിയോഫെൻസിംഗ് ആണ് ഫോർഗ്രൗണ്ട് സർവീസ് ലൊക്കേഷനായി ഇനി ഒരു അനുവദനീയമായ ഉപയോഗ കേസ്. നിങ്ങളുടെ ആപ്പ് എ ഉപയോഗിക്കുകയാണെങ്കിൽ ജിയോഫെൻസിംഗിനായി മുൻവശത്തെ സേവനം മാത്രം, നിങ്ങൾ നീക്കം ചെയ്യണം നിങ്ങൾ ലയിപ്പിച്ചതിൽ നിന്ന് FOREGROUND_SERVICE_LOCATION (ഒപ്പം FOREGROUND_SERVICE). പ്രകടമായത്. ട്രേസ്‌ലെറ്റിൻ്റെ സ്റ്റാൻഡേർഡ് ജിയോഫെൻസ് മോഡ് നേറ്റീവ് ജിയോഫെൻസ് API ഉപയോഗിക്കുന്നു അല്ല ഒരു ഫോർഗ്രൗണ്ട് സേവനം ആരംഭിക്കുക, അതിനാൽ ജിയോഫെൻസ് മാത്രമുള്ള ആപ്പുകൾ കംപ്ലയിൻ്റാണ് - വെറും താഴെയുള്ള അനുമതികൾ ഒഴിവാക്കി foregroundService.enabled = false ആയി സൂക്ഷിക്കുക. കാണുക ജിയോഫെൻസിംഗ് ഗൈഡ് വിശദാംശങ്ങൾക്ക്.

<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <!-- Geofence-only / periodic-only app: no continuous foreground tracking --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" tools:node="remove" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" tools:node="remove" /> </manifest>

ഉദാഹരണം: ചലനവും പശ്ചാത്തല അനുമതികളും നീക്കംചെയ്യുന്നു

<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <!-- Client doesn't want Activity/Motion tracking --> <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" tools:node="remove" /> <!-- Client only wants foreground tracking --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" tools:node="remove" /> <!-- Remove Exact Alarms --> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" tools:node="remove" /> </manifest>

ഓട്ടോമാറ്റിക് പ്രോഗാർഡ് / R8 നിയമങ്ങൾ

പശ്ചാത്തല കോട്‌ലിൻ സേവനങ്ങൾ, റസ്റ്റ് കോറിനായുള്ള ജെഎൻഎ ബൈൻഡിംഗുകൾ, പ്രതിഫലിക്കുന്ന പിജിയൺ ചാനലുകൾ എന്നിവ ട്രെയ്‌സ്‌ലെറ്റ് വളരെയധികം ഉപയോഗിക്കുന്നു. ഇവ അവ്യക്തമാകുകയോ തെറ്റായി ചുരുങ്ങുകയോ ചെയ്താൽ, റിലീസിനായി നിങ്ങളുടെ ആപ്പ് കംപൈൽ ചെയ്യുമ്പോൾ പശ്ചാത്തല ട്രാക്കിംഗ് നിശബ്ദമായി പരാജയപ്പെടും.

ട്രേസ്‌ലെറ്റിനായി നിങ്ങൾ സ്വമേധയാ ProGuard കോൺഫിഗർ ചെയ്യേണ്ടതില്ല.

ഉൾച്ചേർത്ത consumer-rules.pro ഉപയോഗിച്ച് tracelet_android പ്ലഗിൻ യാന്ത്രികമായി അയയ്ക്കുന്നു. റിലീസ് മോഡിൽ നിങ്ങളുടെ Flutter ആപ്പ് നിർമ്മിക്കുമ്പോൾ, Android-ൻ്റെ R8 ഷ്രിങ്കർ ഈ നിയമങ്ങൾ സ്വയമേവ എക്‌സ്‌ട്രാക്‌റ്റ് ചെയ്യുകയും ആവശ്യമായ എല്ലാ ക്ലാസുകളും (HeadlessTaskService, BootReceiver, Rust uniffi ബൈൻഡിംഗുകൾ എന്നിവ പോലുള്ളവ) ചുരുങ്ങുന്നത് നിലനിൽക്കുമെന്ന് ഉറപ്പാക്കുകയും ചെയ്യുന്നു.


രംഗം 1: ഡെലിവറി ഡ്രൈവർ (തുടർച്ചയായ ട്രാക്കിംഗ്)

ആശയങ്ങൾ പര്യവേക്ഷണം ചെയ്‌തു: ഡോസ് മോഡ്, ഫോർഗ്രൗണ്ട് സേവനങ്ങൾ, വേക്ക്‌ലോക്കുകൾ

പ്രശ്നം

നിങ്ങളുടെ ഉപയോക്താവ് ഒരു പിസ്സ ഡെലിവറി ഡ്രൈവറാണ്. സ്‌ക്രീൻ ഓഫാക്കി അവർ ഫോൺ പോക്കറ്റിൽ ഇട്ടു. 15 മിനിറ്റിനു ശേഷം, ആൻഡ്രോയിഡ് ഡോസ് മോഡിൽ പ്രവേശിക്കുന്നു. ഇത് നെറ്റ്‌വർക്ക് ആക്‌സസ് അവസാനിപ്പിക്കുകയും പശ്ചാത്തല ജോലികൾ മാറ്റിവയ്ക്കുകയും ബാറ്ററി ലാഭിക്കുന്നതിന് സിപിയു വേക്ക്-അപ്പുകളെ ഗുരുതരമായി പരിമിതപ്പെടുത്തുകയും ചെയ്യുന്നു. ജിപിഎസ് ലഭിക്കുന്നതിന് നിങ്ങളുടെ ആപ്പ് ഒരു ലളിതമായ ടൈമറിനെ ആശ്രയിക്കുകയാണെങ്കിൽ, നിങ്ങളുടെ ടൈമർ പ്രവർത്തിപ്പിക്കാൻ ആൻഡ്രോയിഡ് വിസമ്മതിക്കും.

ട്രേസ്‌ലെറ്റ് ഇത് എങ്ങനെ പരിഹരിക്കുന്നു: ഫോർഗ്രൗണ്ട് സേവനം

ഒരു ഫോർഗ്രൗണ്ട് സേവനം Android-നോട് പറയുന്നു: “ഹേയ്, ഞാൻ ഇപ്പോൾ അവിശ്വസനീയമാംവിധം പ്രധാനപ്പെട്ട ഒരു കാര്യം ചെയ്യുന്നു, ഉപയോക്താവിന് അതിനെക്കുറിച്ച് പൂർണ്ണമായി അറിയാം. എന്നെ കൊല്ലരുത്.”

android: tl.AndroidConfig( foregroundService: tl.ForegroundServiceConfig( enabled: true, channelName: 'Delivery Tracking', notificationText: 'Tracking your route to the customer', notificationOngoing: true, // User cannot swipe it away showNotificationOnPauseOnly: false, // Always visible — see the section below actions: ['Pause', 'Complete'], // Adds interactive buttons to the notification ), )

സ്റ്റാറ്റസ് ബാറിൽ സ്ഥിരമായ ഒരു അറിയിപ്പ് കാണിക്കുന്നതിലൂടെ, Tracelet നിങ്ങളുടെ ആപ്പിൻ്റെ മുൻഗണനയെ ഫോർഗ്രൗണ്ട് UI-യുടെ ഏതാണ്ട് നിലയിലേക്ക് ഉയർത്തുന്നു. ഡോസ് മോഡ് നിയന്ത്രണങ്ങൾ മറികടന്ന്, ആൻഡ്രോയിഡ് ട്രെയ്‌സ്‌ലെറ്റ് അനിശ്ചിതമായി പ്രവർത്തിക്കാൻ അനുവദിക്കും.

അറിയിപ്പ് രൂപഭാവം ഇഷ്ടാനുസൃതമാക്കുന്നു

സ്ഥിരമായ അറിയിപ്പ് നിങ്ങളുടെ ആപ്പിൻ്റെ ബ്രാൻഡിംഗുമായി പൊരുത്തപ്പെടുത്തുന്നതിന്, നിങ്ങൾക്ക് ഐക്കണുകളും നിറങ്ങളും ഇഷ്ടാനുസൃതമാക്കാം:

android: tl.AndroidConfig( foregroundService: tl.ForegroundServiceConfig( enabled: true, notificationTitle: 'Delivery Mode', notificationText: 'Tracking your route...', notificationColor: '#0F9D58', // Your brand hex color notificationSmallIcon: 'ic_tracelet_icon', // The icon name notificationLargeIcon: 'ic_large_logo', ), )

പ്രധാന ഐക്കൺ നിയമങ്ങൾ:

  1. ഫയൽ ലൊക്കേഷൻ: ഇമേജ് ഫയൽ നിങ്ങളുടെ ആൻഡ്രോയിഡ് പ്രോജക്റ്റിൻ്റെ ഡ്രോയബിൾ ഫോൾഡറിൽ (android/app/src/main/res/drawable/ic_tracelet_icon.png) സ്ഥാപിക്കണം.
  2. ചെറിയ ഐക്കൺ നിയന്ത്രണങ്ങൾ: ആൻഡ്രോയിഡിന് notificationSmallIcon പൂർണ്ണമായും പരന്നതും സുതാര്യവും വെളുപ്പ് മാത്രം ആയിരിക്കണം. നിങ്ങൾ ഒരു നിറമുള്ള ലോഗോ ഉപയോഗിക്കുകയാണെങ്കിൽ, Android അതിനെ കട്ടിയുള്ള ചാരനിറമോ വെള്ളയോ ആയ ചതുരാകൃതിയിൽ റെൻഡർ ചെയ്യും.
  3. കളർ പ്രോപ്പർട്ടി: notificationColor പ്രോപ്പർട്ടി നിങ്ങളുടെ ബ്രാൻഡുമായി പൊരുത്തപ്പെടുന്നതിന് നിങ്ങളുടെ ചെറിയ ഐക്കണിൻ്റെ പശ്ചാത്തലം ടിൻ്റ് ചെയ്യും.
🔔

Android 13+ കുറിപ്പ്: സേവനം ആരംഭിക്കുന്നതിന് മുമ്പ് നിങ്ങൾ POST_NOTIFICATIONS അനുമതി അഭ്യർത്ഥിക്കണം, അല്ലാത്തപക്ഷം അറിയിപ്പ് OS നിശ്ശബ്ദമായി അടിച്ചമർത്തപ്പെടും. നിങ്ങളുടെ ഡാർട്ട് കോഡിൽ നിന്ന് ഇത് എങ്ങനെ അഭ്യർത്ഥിക്കാം എന്നറിയാൻ Flutter SDK: അനുമതികൾ പേജ് കാണുക.

ട്രാക്ക് ചെയ്യുമ്പോൾ അറിയിപ്പ് പുതുക്കുന്നു (updateNotification())

ട്രാക്കിംഗ് ആരംഭിച്ചതിന് ശേഷം *അറിയിപ്പ് മാറ്റേണ്ടതുണ്ട് - ഉദാ. “വഴിയിൽ” എന്നതിൽ നിന്ന് “എത്തുന്നു” എന്നതിലേക്ക് ശീർഷകം അപ്‌ഡേറ്റ് ചെയ്യണോ, ടെക്‌സ്‌റ്റ് സ്വാപ്പ് ചെയ്യണോ അതോ യാത്രയുടെ മധ്യത്തിൽ ആക്ഷൻ ബട്ടണുകൾ മാറ്റണോ? ഒരു പുതിയ ForegroundServiceConfig ഉപയോഗിച്ച് setConfig() എന്ന് വിളിക്കുന്നത് മൂല്യങ്ങൾ നിലനിൽക്കും, എന്നാൽ ഒരു അറിയിപ്പ്-മാത്രം മാറ്റം അല്ല Android ഇതിനകം കാണിക്കുന്ന അറിയിപ്പ് റീപോസ്‌റ്റ് ചെയ്യില്ല - ബന്ധമില്ലാത്ത സേവനം പുനരാരംഭിച്ചതിനോ ഫോർഗ്രൗണ്ട് പരിവർത്തനത്തിനോ ശേഷം മാത്രമേ പുതിയ ഉള്ളടക്കം ദൃശ്യമാകൂ.

v3.6.8 മുതൽ, Tracelet.updateNotification() തത്സമയ അറിയിപ്പ് പുതുക്കിയെടുക്കുന്നു, ട്രാക്കിംഗ് പൈപ്പ്‌ലൈൻ പുനരാരംഭിക്കാതെ:

// 1. Apply the new notification content. await Tracelet.setConfig( const tl.Config( android: tl.AndroidConfig( foregroundService: tl.ForegroundServiceConfig( notificationTitle: 'Arriving', notificationText: 'Your driver is 2 minutes away', ), ), ), ); // 2. Repost the active notification with the new content. await Tracelet.updateNotification();

രൂപകൽപന പ്രകാരം സുരക്ഷിതം. updateNotification() ഒരിക്കലും ട്രാക്കിംഗ് പുനരാരംഭിക്കുന്നില്ല, കൂടാതെ ഫോർഗ്രൗണ്ട് സേവനം നിലവിൽ പ്രവർത്തിക്കാത്തപ്പോൾ ഇതൊരു നോ-ഓപ്പാണ് (പുതുക്കാൻ ഒന്നുമില്ല). iOS-ൽ അത് പ്രവർത്തിക്കുന്ന തത്സമയ പ്രവർത്തനം പകരം പുതുക്കുന്നു (നിങ്ങൾ liveActivityConfig വഴി ഒരെണ്ണം തിരഞ്ഞെടുത്തപ്പോൾ); വെബിൽ ഇതൊരു നോ-ഓപ് ആണ് - അതിനാൽ എല്ലാ പ്ലാറ്റ്‌ഫോമിലും ഒരേ കോൾ സുരക്ഷിതമാണ്.

അറിയിപ്പ് നിശബ്ദമായി അപ്ഡേറ്റ് ചെയ്യുന്നു (notificationOnlyAlertOnce)

മുകളിലെ പാറ്റേണിൽ ഒരു ക്യാച്ച് ഉണ്ട്. നിങ്ങൾ മറ്റെന്തെങ്കിലും പറഞ്ഞില്ലെങ്കിൽ Android എല്ലാ റീപോസ്റ്റുകളും ഒരു പുതിയ അലേർട്ട് ആയി കണക്കാക്കുന്നു, അതിനാൽ നിങ്ങൾ മിനിറ്റിൽ ഒരിക്കൽ പുതുക്കുന്ന അറിയിപ്പ് ട്രാക്കിംഗ് റൺ ചെയ്യുന്നിടത്തോളം ഒരു മിനിറ്റിൽ ഒരിക്കൽ നിങ്ങളുടെ അറിയിപ്പ് ശബ്‌ദം പ്ലേ ചെയ്യുന്നു.

ട്രെയ്‌സ്‌ലെറ്റിൻ്റെ ചാനൽ സൃഷ്ടിച്ചിരിക്കുന്നത് വൈബ്രേഷനും ലൈറ്റുകൾ പ്രവർത്തനരഹിതമാക്കിയതുമാണ്, അതിനാൽ ഇതൊരു ശബ്‌ദമാണ്, ഒരു buzz അല്ല - എന്നാൽ സ്ഥിരസ്ഥിതി notificationPriority-ൽ ഇത് കേൾക്കാനാകും, മാത്രമല്ല ഉപയോക്താക്കൾക്ക് ഇത് പെട്ടെന്ന് ശ്രദ്ധയിൽപ്പെടുകയും ചെയ്യും.

notificationOnlyAlertOnce സജ്ജീകരിക്കുക, അങ്ങനെ ആദ്യ പോസ്റ്റ് അലേർട്ടുകളും പിന്നീടുള്ള എല്ലാ അപ്‌ഡേറ്റുകളും നിശബ്ദമായി നിലകൊള്ളുന്നു:

await Tracelet.setConfig( const tl.Config( android: tl.AndroidConfig( foregroundService: tl.ForegroundServiceConfig( notificationOnlyAlertOnce: true, ), ), ), );

റൺ ട്രാക്ക് ചെയ്യുമ്പോൾ ഉള്ളടക്കം മാറുന്ന ഏത് അറിയിപ്പിനും ഇത് സജ്ജീകരിക്കുന്നത് മൂല്യവത്താണ് - ശേഷിക്കുന്ന സ്റ്റോപ്പുകളുടെ എണ്ണം, ശേഷിക്കുന്ന അപ്‌ലോഡുകൾ, നിലവിലെ ജിയോഫെൻസ്, തത്സമയ കൃത്യത - ചുവടെയുള്ള ടൈമറിന് മാത്രമല്ല.

എന്തുകൊണ്ട് മുൻഗണന കുറച്ചുകൂടാ? notificationPriority എന്നതിലേക്ക് low അല്ലെങ്കിൽ min എന്ന് ഇടുന്നത് ചാനലിനെ നിശ്ശബ്ദമാക്കുന്നു, എന്നാൽ ഇത് ആദ്യ പോസ്റ്റിനെയും നിശബ്ദമാക്കുന്നു, കൂടാതെ ചാനൽ സൃഷ്ടിക്കുമ്പോൾ ചാനലിൻ്റെ പ്രാധാന്യം Android പരിഹരിക്കുന്നു. ഒരു ഡിഫോൾട്ട്-പ്രാധാന്യമുള്ള ചാനൽ ഉപയോഗിച്ച് ഇതിനകം ഇൻസ്‌റ്റാൾ ചെയ്‌തിരിക്കുന്ന ഒരു ആപ്പിന് channelId മാറ്റാതെ തന്നെ പിന്നീട് അത് കുറയ്ക്കാൻ കഴിയില്ല, ഇത് സിസ്റ്റം ക്രമീകരണങ്ങളിൽ പഴയ ചാനലിനെ അനാഥമാക്കുന്നു. notificationOnlyAlertOnce-ന് പ്രശ്‌നങ്ങളൊന്നുമില്ല, മുൻഗണനയിൽ പ്രവർത്തിക്കുന്നു.

ഇത് false-ലേക്ക് ഡിഫോൾട്ട് ചെയ്യുന്നു, ഇത് നിലവിലുള്ള എല്ലാ ആപ്പിൻ്റെയും സ്വഭാവം സംരക്ഷിക്കുന്നു. നിങ്ങൾ തിരഞ്ഞെടുക്കുന്നത് വരെ ഒന്നും മാറില്ല.

ആപ്പ് തുറന്നിരിക്കുമ്പോൾ അറിയിപ്പ് മറയ്ക്കുന്നു (showNotificationOnPauseOnly)

ഉപയോക്താവ് യഥാർത്ഥത്തിൽ നിങ്ങളുടെ ആപ്പ് നോക്കുമ്പോൾ showNotificationOnPauseOnly: true ട്രാക്കിംഗ് അറിയിപ്പ് കുറയ്ക്കുകയും അവർ പോകുമ്പോൾ അത് തിരികെ നൽകുകയും ചെയ്യുന്നു. ഇത് ഒരു യഥാർത്ഥ നല്ല അനുഭവമാണ് - ആപ്പ് സ്‌ക്രീനിൽ ആയിരിക്കുമ്പോൾ അറിയിപ്പ് ട്രേ വൃത്തിയായി തുടരും - എന്നാൽ ഇത് ഒരു കടുത്ത നിയന്ത്രണത്തോടെയാണ് വരുന്നത്, മാത്രമല്ല നിയന്ത്രണം വ്യക്തമല്ല.

അറിയിപ്പ് മറയ്‌ക്കുക എന്നതിനർത്ഥം സേവനത്തെ തരംതാഴ്ത്തുക എന്നാണ്. ഒരു അറിയിപ്പ് കൂടാതെ ഒരു ഫോർഗ്രൗണ്ട് സേവനത്തെക്കുറിച്ച് Android-ന് ഒരു ആശയവുമില്ല, അതിനാൽ ഇത് മറയ്‌ക്കാനുള്ള ഏക മാർഗം stopForeground() ആണ്. ട്രാക്കിംഗ് തുടരുകയും സേവനം പ്രവർത്തിക്കുകയും ചെയ്യുന്നു, എന്നാൽ അറിയിപ്പ് മറച്ചിരിക്കുന്നിടത്തോളം കാലം നിങ്ങളുടെ പ്രോസസ്സ് ഫോർഗ്രൗണ്ട് സേവനമില്ല.

സമീപകാലങ്ങളിൽ നിന്ന് ഉപയോക്താവ് നിങ്ങളുടെ ആപ്പ് സ്വൈപ്പുചെയ്യുമ്പോൾ, Android ഇല്ലാതാക്കുന്ന അവസ്ഥ അതാണ്.

showNotificationOnPauseOnly അവഗണിക്കുമ്പോൾ stopOnTerminate: false (#378 ). രണ്ട് ക്രമീകരണങ്ങളും പൊരുത്തമില്ലാത്ത കാര്യങ്ങൾ ആവശ്യപ്പെടുകയും അതിജീവന വാഗ്ദാനം വിജയിക്കുകയും ചെയ്യുന്നു: അറിയിപ്പ് ദൃശ്യമായി തുടരുന്നു.

എന്തുകൊണ്ടാണ് ഇത് പ്രവർത്തനക്ഷമമാക്കാൻ കഴിയാത്തത്

ഒരു ടാസ്‌ക് നീക്കം ചെയ്യുമ്പോൾ, ActivityManager proc.foregroundServices-ൽ നിന്ന് ഏതൊക്കെ പ്രക്രിയകളെ ഇല്ലാതാക്കണമെന്ന് തീരുമാനിക്കുന്നു — നിങ്ങളുടെ ആപ്പിൻ്റെ പ്രധാന ത്രെഡിലേക്ക് onTaskRemoved അയയ്‌ക്കുന്നതിന് മുമ്പ് onTaskRemoved അത് തീരുമാനിക്കുന്നു. അതിനാൽ നീക്കം ചെയ്യപ്പെടുന്ന സമയത്ത് അറിയിപ്പ് പോസ്റ്റ് ചെയ്ത് ഒരു SDK-ക്ക് സാഹചര്യം രക്ഷിക്കാൻ കഴിയില്ല; അപ്പോഴേക്കും വിധി വന്നിരിക്കുന്നു. ട്രേസ്‌ലെറ്റിന് ആ ലഘൂകരണം ഉണ്ടായിരുന്നു, അത് സഹായിച്ചില്ല.

ആരും കാണാത്ത ഓട്ടമായിരുന്നു ഫലം. സ്‌ക്രീനിൽ നിന്ന് പുറത്തേക്ക് പോകുന്നതിനും അറിയിപ്പ് തിരികെ വരുന്നതിനും ഇടയിലുള്ള വിടവിൽ ആപ്പ് സ്വൈപ്പ് ചെയ്യുക, തുടർന്ന് പ്രോസസ്സ് അവസാനിച്ചു: തലയില്ലാത്ത ടാസ്‌ക്കില്ല, ഇവൻ്റുകളില്ല, ലോഗുകളില്ല, ഉറപ്പ് നൽകാൻ stopOnTerminate: false നിലവിലില്ല. ഒരു നിമിഷം കഴിഞ്ഞ് സ്വൈപ്പ് ചെയ്യുക, എല്ലാം നന്നായി പ്രവർത്തിക്കും. ഒരു പിക്‌സൽ ഫോൾഡിൽ 285 എംഎസ്, ആൻഡ്രോയിഡ് 15 ഉപകരണത്തിൽ 700–1500 എംഎസ് എന്നിങ്ങനെയാണ് വിടവ് അളന്നത്.

പകരം Tracelet എന്താണ് ചെയ്യുന്നത്

നിങ്ങളുടെ കോൺഫിഗറേഷൻപെരുമാറ്റം
stopOnTerminate: false + showNotificationOnPauseOnly: trueപതാക അവഗണിച്ചു. അറിയിപ്പ് ദൃശ്യമായി നിലനിൽക്കും, സേവനം ഒരിക്കലും തരംതാഴ്ത്തപ്പെടില്ല, സമീപകാലങ്ങളിൽ നിന്നുള്ള ഒരു സ്വൈപ്പ് ഒരിക്കലും പ്രക്രിയയെ നശിപ്പിക്കില്ല.
stopOnTerminate: true + showNotificationOnPauseOnly: trueഡോക്യുമെൻ്റ് ചെയ്തതുപോലെ കൃത്യമായി പ്രവർത്തിക്കുന്നു - ആപ്പ് സ്ക്രീനിൽ ആയിരിക്കുമ്പോൾ മറച്ചിരിക്കുന്നു. ഇവിടെ സ്വൈപ്പിന് ശേഷം ഒന്നും വാഗ്ദാനം ചെയ്തിട്ടില്ല, അതിനാൽ സംരക്ഷിക്കാൻ ഒന്നുമില്ല.
showNotificationOnPauseOnly: falseഅറിയിപ്പ് എല്ലായ്പ്പോഴും ദൃശ്യമാണ്. ഇതാണ് സ്ഥിരസ്ഥിതി.

അസാധുവാക്കൽ നിശബ്ദമല്ല - യഥാർത്ഥ ബഗിനെ ചെലവേറിയതാക്കിയതിൻ്റെ പകുതിയാണിത്. ഓരോ start()-നും എപ്പോഴും ഓൺ ലൈഫ് സൈക്കിൾ ലോഗ് ചാനലിലേക്ക് ഒരു വരി എഴുതിയിരിക്കുന്നു, കൊല്ലപ്പെട്ട നിലയിലുള്ള റൺ ഉൾപ്പെടെ ഏത് ലോഗ് ലെവലിലും Tracelet.getLogs() ഉപയോഗിച്ച് വായിക്കാനാകും:

notification: showNotificationOnPauseOnly ignored because stopOnTerminate=false — hiding the notification demotes the foreground service, and a swipe from recents in that window kills the process (#378). Set stopOnTerminate=true to hide it while the app is open, or showNotificationOnPauseOnly=false to stop asking.

getForegroundServiceHealth() മറുവശത്ത് നിന്ന് ഇതേ കാര്യം റിപ്പോർട്ട് ചെയ്യുന്നു. അറിയിപ്പ് നിയമാനുസൃതമായി മറച്ചിരിക്കുമ്പോൾ (stopOnTerminate: true), serviceForeground false ഉം lastForegroundPromotionResult suppressed ഉം ആണ് - നിങ്ങൾ ആവശ്യപ്പെട്ട തരംതാഴ്ത്തൽ, OS നിരസിച്ച പ്രമോഷനിൽ നിന്ന് വ്യത്യസ്തമായ കാര്യമാണിത്.

തിരഞ്ഞെടുക്കുന്നു

നിങ്ങൾക്ക് യഥാർത്ഥത്തിൽ ഏതാണ് വേണ്ടതെന്ന് തീരുമാനിക്കുക:

  • ആപ്പ് സ്വൈപ്പുചെയ്യുന്ന ഉപയോക്താവിനെ ട്രാക്കിംഗ് അതിജീവിക്കണംstopOnTerminate: false നിലനിർത്തി അറിയിപ്പ് കാണിക്കാൻ അനുവദിക്കുക. ഡെലിവറി, ഫ്ലീറ്റ്, വർക്ക്ഫോഴ്സ്, സുരക്ഷാ ആപ്പുകൾ എന്നിവയുടെ ശരിയായ ഡിഫോൾട്ടാണിത്.
  • ഒരു വൃത്തിയുള്ള അറിയിപ്പ് ട്രേ സ്വൈപ്പിനെ അതിജീവിക്കുന്നതിനേക്കാൾ പ്രധാനമാണ്stopOnTerminate: true സജ്ജമാക്കുക. സമീപകാലങ്ങളിൽ നിന്ന് ആപ്പ് നീക്കം ചെയ്യുമ്പോൾ ട്രാക്കിംഗ് അവസാനിക്കുന്നു, പല ഉപഭോക്തൃ ആപ്പുകളിലും ഇത് ഉപയോക്താവ് പ്രതീക്ഷിക്കുന്നത് തന്നെയാണ്.

രണ്ടാമത്തെ സാഹചര്യത്തിൽ നിങ്ങൾ നേടുന്നത് പരിമിതമാണെന്ന് ശ്രദ്ധിക്കുക: Android 14+-ൽ, നിങ്ങളുടെ ആപ്പ് സ്‌ക്രീൻ ഓഫായാൽ ഒരു ലൊക്കേഷൻ ഫോർഗ്രൗണ്ട് സേവനം അതിൻ്റെ അറിയിപ്പ് കാണിക്കണം, അതിനാൽ ഉപയോക്താവ് നിങ്ങളുടെ ആപ്പിൽ ആയിരിക്കുമ്പോൾ മാത്രമേ മറയ്ക്കൽ ബാധകമാകൂ.

ഇത് Android-മാത്രം. iOS-ന് ഫോർഗ്രൗണ്ട് സേവനമില്ല, മറയ്ക്കാൻ അറിയിപ്പില്ല, ഇത്തരത്തിലുള്ള ടാസ്‌ക്-റിമൂവൽ കില്ലില്ല - showNotificationOnPauseOnly AndroidConfig-ൽ ജീവിക്കുന്നു, iOS SDK അത് വായിക്കുന്നില്ല.

അറിയിപ്പിൽ ഒരു കാലഹരണപ്പെട്ട ടൈമർ കാണിക്കുന്നു

ഒരു ബൗണ്ടഡ് സെഷനിൽ നിർമ്മിച്ച ആപ്പുകൾക്കായി - ഒരു ഡെലിവറി റൺ, ഒരു ഷിഫ്റ്റ്, ഒരു ജോലി, ഒരു ഡ്രൈവ് - നിങ്ങൾ തിരഞ്ഞെടുക്കുന്ന നിമിഷം മുതൽ റണ്ണിംഗ് ക്ലോക്ക് എണ്ണുന്നത് അറിയിപ്പിന് കാണിക്കാനാകും:

final shiftStartedAt = DateTime.now(); await Tracelet.setConfig( tl.Config( android: tl.AndroidConfig( foregroundService: tl.ForegroundServiceConfig( notificationTitle: 'Shift in progress', notificationStartedAt: shiftStartedAt.millisecondsSinceEpoch, notificationShowTimer: true, notificationOnlyAlertOnce: true, ), ), ), ); await Tracelet.updateNotification();

Android ക്ലോക്ക് തന്നെ റെൻഡർ ചെയ്യുന്നു. നിങ്ങൾ ഇതിനെ ഒരിക്കൽ വിളിക്കൂ; നോട്ടിഫിക്കേഷൻ്റെ ആയുസ്സിൽ OS രണ്ടാമത്തെ റെസല്യൂഷനിൽ ഡിസ്പ്ലേ ടിക്ക് ചെയ്യുന്നു. നിങ്ങളുടെ ആപ്പ് വീണ്ടും വരയ്‌ക്കുന്നതിന് ഒരിക്കലും ഉണരില്ല, കൂടാതെ ഒരു ബന്ധമില്ലാത്ത കാരണത്താൽ അറിയിപ്പ് വീണ്ടും പോസ്റ്റുചെയ്യുന്നത് - പുതിയ ടെക്‌സ്‌റ്റ്, കോൺഫിഗറേഷൻ മാറ്റം - എണ്ണം പുനരാരംഭിക്കില്ല.

start()-ൽ നിന്ന് ട്രെയ്‌സ്‌ലെറ്റ് എടുക്കുന്നതിനുപകരം നിങ്ങൾ notificationStartedAt നൽകുന്നു, കാരണം ഒരു ഉപയോക്താവ് ശ്രദ്ധിക്കുന്ന കാലയളവ് ട്രാക്കുചെയ്യുന്നതിന് മുമ്പ് ആരംഭിക്കുകയോ അല്ലെങ്കിൽ ട്രാക്കിംഗ് പുനരാരംഭിക്കുന്നതിനെ അതിജീവിക്കുകയോ ചെയ്യുന്നു. “ട്രാക്കിംഗ് ആരംഭിച്ചത് മുതൽ” കാണിക്കാൻ, നിങ്ങൾ start() എന്ന് വിളിച്ച നിമിഷം കടന്നുപോകുക.

അറിയേണ്ട അർത്ഥശാസ്ത്രം.

  • notificationShowTimer: false (ഡിഫോൾട്ട്) ഇന്നത്തെ അറിയിപ്പ് കൃത്യമായി റെൻഡർ ചെയ്യുന്നു.
  • notificationStartedAt ഇല്ലാത്ത notificationShowTimer: true ടൈമറും ലോഗുകളും കാണിക്കുന്നില്ല. “ഇപ്പോൾ” എന്നത് മാറ്റിസ്ഥാപിക്കുന്നത് എല്ലാ റീപോസ്റ്റിലും ക്ലോക്ക് പുനരാരംഭിക്കുകയും സെഷൻ തെറ്റായി റിപ്പോർട്ട് ചെയ്യുകയും ചെയ്യും.
  • ഭാവിയിൽ ഒരു notificationStartedAt നിലവിലെ സമയത്തിലേക്ക് ഓരോ പോസ്റ്റിനും ക്ലാംപ് ചെയ്‌തിരിക്കുന്നു, സംഭരിച്ച മൂല്യത്തെ സ്പർശിക്കാതെ വിടുന്നു, അതിനാൽ അടുത്ത റീപോസ്റ്റിൽ ഒരു ഉപകരണ ക്ലോക്ക് തിരുത്തൽ സുഖപ്പെടും.
  • ടൈമർ മാത്രം കണക്കാക്കുന്നു. ഇത് കാണിക്കുന്നത് നിർത്താൻ, notificationShowTimer: false സജ്ജീകരിക്കുക - ആരംഭ തൽക്ഷണം സംഭരിച്ചിരിക്കുന്നതാണെങ്കിലും നിഷ്‌ക്രിയമാണ്.

ഒരു ടൈമറിൽ notificationText റീറൈറ്റ് ചെയ്‌ത് നിങ്ങൾക്ക് കഴിഞ്ഞ സമയം * റെൻഡർ ചെയ്യാം, അത് ശരിയായ ഉപകരണമായ സ്റ്റാറ്റിക് കൗണ്ടിനായി. ഇത് തിരഞ്ഞെടുക്കാനുള്ള കാരണം ചെലവും റെസല്യൂഷനുമാണ്: ഓരോ മിനിറ്റിലും റീറൈറ്റിംഗ് എന്നത് നേറ്റീവ് എന്നതിലേക്കുള്ള ഒരു മുഴുവൻ യാത്രയും ഒരു റീപോസ്റ്റും ആണ് - എട്ട് മണിക്കൂർ ഷിഫ്റ്റിൽ അവയിൽ ഏകദേശം 480 എണ്ണം - ആ രീതിയിൽ സെക്കൻഡ് കാണിക്കുന്നത് പ്രായോഗികമല്ല. OS ക്രോണോമീറ്റർ ഒരു കോളാണ്.

liveActivityConfig-ൽ ഒരേ രണ്ട് ഫീൽഡുകൾ എടുക്കുന്ന തത്സമയ പ്രവർത്തന ടൈമർ ആണ് iOS കൗണ്ടർപാർട്ട്.


സാഹചര്യം 2: കാലാവസ്ഥ ആപ്പ് (ആനുകാലിക ട്രാക്കിംഗ്)

പര്യവേക്ഷണം ചെയ്‌ത ആശയങ്ങൾ: വർക്ക് മാനേജർ വേഴ്സസ്. കൃത്യമായ അലാറങ്ങൾ

പ്രശ്നം

നിങ്ങളുടെ ഉപയോക്താവ് നിങ്ങളുടെ പ്രാദേശിക കാലാവസ്ഥാ ആപ്പ് ഡൗൺലോഡ് ചെയ്തു. ഓരോ 4 മണിക്കൂറിലും ഒരിക്കൽ നിങ്ങൾ പശ്ചാത്തലത്തിൽ ഉണരുകയും അവരുടെ ലൊക്കേഷൻ നേടുകയും പ്രാദേശിക പ്രവചനം ഡൗൺലോഡ് ചെയ്യുകയും വേണം.

നിങ്ങൾക്ക് സ്ഥിരമായ ഒരു ഫോർഗ്രൗണ്ട് സേവന അറിയിപ്പ് ആവശ്യമില്ല. ഉപയോക്താവ് അവരുടെ ഡ്രോയറിൽ സ്ഥിരമായ “കാലാവസ്ഥ ട്രാക്കിംഗ്” അറിയിപ്പ് കാണുന്നത് വെറുക്കും.

ട്രേസ്ലെറ്റ് ഇത് എങ്ങനെ പരിഹരിക്കുന്നു: ആനുകാലിക മോഡ്

തുടർച്ചയായ സേവനത്തിനുപകരം, ട്രെയ്‌സ്‌ലെറ്റിന് Android-ൻ്റെ ജോബ് ഷെഡ്യൂളറുകൾ ഉപയോഗിച്ച് അൽപ്പനേരം ഉണരാനും പരിഹാരം കാണാനും ഉറങ്ങാനും കഴിയും.

android: tl.AndroidConfig( periodicUseForegroundService: false, periodicUseExactAlarms: true, // Uses AlarmManager instead of WorkManager )

രണ്ട് ഷെഡ്യൂളർമാർ

  1. വർക്ക് മാനേജർ (periodicUseExactAlarms: false) സ്ഥിരസ്ഥിതി. ഇത് വളരെ ബാറ്ററി ഫ്രണ്ട്ലി ആണ്. എന്നിരുന്നാലും, അത് എപ്പോൾ പ്രവർത്തിപ്പിക്കണമെന്ന് Android തീരുമാനിക്കുന്നു. ഓരോ 15 മിനിറ്റിലും റൺ ചെയ്യാൻ നിങ്ങളോട് ആവശ്യപ്പെടുകയാണെങ്കിൽ, ആൻഡ്രോയിഡ് 45 മിനിറ്റ് കാത്തിരിക്കുകയും ഇൻസ്റ്റാഗ്രാം (“ബാച്ചിംഗ്” എന്ന് വിളിക്കപ്പെടുന്ന) പരിശോധിക്കുന്നതിനായി ഉപയോക്താവ് അവരുടെ ഫോൺ അൺലോക്ക് ചെയ്യുമ്പോൾ അത് പ്രവർത്തിപ്പിക്കുകയും ചെയ്തേക്കാം. ഇത് വളരെ കൃത്യതയില്ലാത്തതാണ്.

  2. അലാറം മാനേജർ (നോട്രാൻസ്0 ലേറ്റ്) നിങ്ങൾ ഒരു നിശ്ചിത സമയത്ത് ഉപകരണം കൃത്യമായി ഉണർത്തേണ്ടതുണ്ടെങ്കിൽ, ഇത് ഉപയോഗിക്കുക. നിങ്ങളുടെ android/app/src/main/AndroidManifest.xml-ൽ SCHEDULE_EXACT_ALARM അനുമതി പ്രഖ്യാപിക്കാൻ ഇത് ആവശ്യപ്പെടുന്നു:

    <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />

    ശ്രദ്ധിക്കുക: Google Play ഈ അനുമതി കർശനമായി അവലോകനം ചെയ്യുന്നു. നിങ്ങളുടെ ആപ്പ് ഒരു അലാറം ക്ലോക്കോ കലണ്ടറോ അല്ലെങ്കിൽ കൃത്യമായ സമയക്രമീകരണമോ ആണെങ്കിൽ മാത്രം അത് ഉപയോഗിക്കുക.


രംഗം 3: OEM ആക്രമണം

ആശയങ്ങൾ പര്യവേക്ഷണം ചെയ്‌തു: ക്രമീകരണ ആരോഗ്യ API

പ്രശ്നം

നിങ്ങൾ എല്ലാം ശരിയായി ചെയ്തു. നിങ്ങൾക്ക് ഒരു ഫോർഗ്രൗണ്ട് സേവനമുണ്ട്. എന്നാൽ ഉപയോക്താവിന് Xiaomi ഫോൺ ഉണ്ട്. MIUI-ന് 5 മിനിറ്റ് സ്‌ക്രീൻ-ഓഫ് സമയത്തിന് ശേഷം ഫോർഗ്രൗണ്ട് സേവനങ്ങളെപ്പോലും നിർബന്ധിതമായി കൊല്ലുന്ന “ബാറ്ററി സേവർ” ഉണ്ട്.

ട്രേസ്‌ലെറ്റ് ഇത് എങ്ങനെ പരിഹരിക്കുന്നു: യാന്ത്രിക ലഘൂകരണവും നിർദ്ദേശങ്ങളും

സാധ്യമാകുന്നിടത്ത് Tracelet സ്വയമേവ ആന്തരിക ലഘൂകരണങ്ങൾ പ്രയോഗിക്കുന്നു, എന്നാൽ ചിലപ്പോൾ ഉപയോക്താവിന് OEM-ൻ്റെ പ്രൊപ്രൈറ്ററി ക്രമീകരണ മെനുവിൽ നിങ്ങളുടെ ആപ്പ് വൈറ്റ്‌ലിസ്റ്റ് ചെയ്യേണ്ടിവരും.

final health = await tl.Tracelet.getSettingsHealth(); if (health['isAggressiveOem'] == true) { // Automatically opens the manufacturer-specific settings screen // (e.g. Xiaomi Autostart, Huawei App Launch, Samsung Sleeping Apps) await tl.Tracelet.showPowerManager(); }

നിങ്ങളുടെ Flutter UI-ൽ ഇത് എങ്ങനെ നടപ്പിലാക്കാം എന്നതിൻ്റെ വിശദമായ ഉദാഹരണത്തിനായി, ഡയഗ്നോസ്റ്റിക് ടൂൾസ് & പവർ മാനേജ്മെൻ്റ് പേജ് കാണുക.