Skip to Content
தொடங்குதல்இயங்குதள அமைப்புAndroid SDK

ஆண்ட்ராய்டு SDK: பேட்டரி மேலாளரைக் கட்டுப்படுத்துதல்

பின்னணி சேவைகளை ஆக்ரோஷமாக அழிப்பதில் ஆண்ட்ராய்டு பிரபலமற்றது. சீன OEMகள் (Xiaomi, Huawei போன்றவை) வழக்கமான ஆண்ட்ராய்டு பின்னணி செயலாக்க வரம்புகளை முற்றிலுமாக உடைக்கும் தனிப்பயன் ஆற்றல் மேலாளர்களைக் கொண்டுள்ளன.

இந்தப் பக்கம் உங்கள் பயன்பாட்டை ஏன் ஆன்ட்ராய்டு அழிக்கிறது மற்றும் எப்படி ட்ரேஸ்லெட்டின் குறிப்பிட்ட ஆண்ட்ராய்டு உள்ளமைவுகள் நிஜ உலகில் அதைத் தீர்க்கிறது.


விருப்ப சார்பு: உயர் துல்லியம் GMS இடம்

Tracelet இன் Android SDK ஆனது Google Play சேவைகள் இருப்பிடத்தைப் பயன்படுத்தலாம்FusedLocationProviderClient (சிறந்த துல்லியம் மற்றும் பேட்டரி), வன்பொருள் செயல்பாட்டு அங்கீகாரம் (நடைபயிற்சி / ஓட்டுநர் / இன்னும்), மற்றும் வன்பொருள் ஜியோஃபென்சிங். SDK ஐ இலகுவாகவும், கூகுள் இல்லாத சாதனங்களில் பயன்படுத்தக்கூடியதாகவும் வைத்திருக்க, இது சார்பு தொகுக்கப்படவில்லை. உயர் துல்லியமான பாதையை நீங்கள் விரும்பினால் மட்டுமே சேர்க்கிறீர்கள்:

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

இது விருப்பமானது, மேலும் SDK அழகாக சிதைகிறது. play-services-location இல்லாமல், ட்ரேஸ்லெட் நிலையான AOSP LocationManager (எளிய GPS) க்கு திரும்பும். கண்காணிப்பு இன்னும் வேலை செய்கிறது - நீங்கள் தான் இணைக்கப்பட்ட வழங்குநரின் துல்லியம்/பேட்டரி நன்மைகள், வன்பொருள் செயல்பாட்டு அங்கீகாரம் மற்றும் வன்பொருள் ஆகியவற்றை இழக்கும் ஜியோஃபென்சிங். பரிந்துரைக்கப்பட்டது: நீங்கள் குறிப்பாக Google-குறைவான / AOSP சாதனங்களை குறிவைக்காத வரையில் சேர்க்கவும் (எ.கா. GMS இல்லாத Huawei, அல்லது de-Googled ROMகள்).

குறைந்தபட்ச பதிப்பு: 21.2.0. ட்ரேஸ்லெட்டின் ஆண்ட்ராய்டு குறியீடு இடைமுகம் சார்ந்ததாக அழைக்கிறது FusedLocationProviderClient மற்றும் ActivityRecognitionClient APIகள் மட்டுமே ஆனது play-services-location 21.2.0 இல் இடைமுகங்கள். பழைய வெளியீடுகள் (எ.கா. 19.0.0) இவற்றை அனுப்புகின்றன உறுதியான வகுப்புகளாக, அதனால் அவர்களுக்குள் அழைப்பது வீசுகிறது இயக்க நேரத்தில் java.lang.IncompatibleClassChangeError. ட்ரேஸ்லெட் ஒரு கிரேடில் வெளியிடுகிறது சார்பு கட்டுப்பாடு play-services-location21.2.0+ ஆக தானாக உயர்த்துகிறது மற்றொரு சார்பு பழைய பதிப்பில் இழுக்கிறது, ஆனால் நீங்கள் பதிப்பை நீங்களே பின் செய்தால், அதை வைத்திருங்கள் 21.2.0 அல்லது புதியது (நாங்கள் 21.3.0 ஐ பரிந்துரைக்கிறோம்).

play-services-location உடன்அது இல்லாமல் (ஏஓஎஸ்பி ஃபால்பேக்)
இணைந்த இடம் (சிறந்த துல்லியம் + பேட்டரி)LocationManager வழியாக ரா ஜிபிஎஸ் / நெட்வொர்க்
வன்பொருள் செயல்பாடு அங்கீகாரம் (onActivityChange)முடுக்கமானி மட்டுமே இயக்கம் கண்டறிதல்
வன்பொருள் ஜியோஃபென்சிங்மென்பொருள் (இன்-SDK) ஜியோஃபென்ஸ் மதிப்பீடு

விருப்ப சார்பு: Play Integrity (சாதன சான்றளிப்பு)

ட்ரேஸ்லெட்டின் சாதன சான்றளிப்பு அம்சத்தை (AttestationConfig) பயன்படுத்தினால், Android பக்கமானது அதன் கிரிப்டோகிராஃபிக் டோக்கனை Google Play இன்டெக்ரிட்டி மூலம் உருவாக்குகிறது. அப்படியே play-services-location, இந்த சார்பு தொகுக்கப்படவில்லை — நீங்கள் சேர்க்கும் போது மட்டுமே சேர்க்கிறீர்கள் சான்றளிப்பை இயக்கு:

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

இது விருப்பமானது, மேலும் சான்றொப்பம் நேர்த்தியாக குறைகிறது. Play இன்டெக்ரிட்டி இல்லாமல் சார்பு, ட்ரேஸ்லெட்டில் உள்ள மற்ற அனைத்தும் சாதாரணமாக வேலை செய்யும் - சான்றளிப்பு மட்டுமே பாதிக்கப்படுகிறது: AttestationConfig(enabled: true) ஒரு எச்சரிக்கையை பதிவு செய்கிறது மற்றும் Tracelet.getAttestationToken() செயலிழப்பதை விட, டோக்கனுக்குப் பதிலாக null ஐ வழங்குகிறது. நீங்கள் இருந்தால் மட்டுமே சார்புநிலையைச் சேர்க்கவும் சான்றளிப்பை இயக்கவும் மற்றும் Android இல் Play Integrity தீர்ப்பு தேவை. பார்க்கவும் சாதன சான்றளிப்பு வழிகாட்டி  முழு பணிப்பாய்வு மற்றும் சர்வர் பக்க சரிபார்ப்புக்காக.

இது implementation ஆக இருக்க வேண்டும், NOTRANS1 லேட் அல்ல. Play Integrity உள்ளே compileOnly ஆக உள்ளது ட்ரேஸ்லெட் SDK (எனவே இது ஒருபோதும் அனுப்பப்படாது அல்லது சான்றளிப்பைப் பயன்படுத்தாத பயன்பாடுகளில் கட்டாயப்படுத்தப்படாது). என்றால் உங்கள் ஆப் தொகுதிக்கு சார்புநிலையைச் சேர்க்காமல் சான்றளிப்பை இயக்குகிறீர்கள் implementation, இயக்க நேரத்தில் வகுப்புகள் இல்லை மற்றும் சான்றொப்பம் அமைதியாக null ஐ வழங்கும்.


அனுமதிகள் & மேனிஃபெஸ்ட் அமைப்பு

உங்கள் பயன்பாட்டைத் தொகுக்கும்போது தேவையான அனுமதிகளை ட்ரேஸ்லெட் தானாகவே உங்கள் 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) இல் Android இன் மேனிஃபெஸ்ட் இணைப்பு tools:node="remove" கட்டளையைப் பயன்படுத்தி நீங்கள் அனுமதியை வலுக்கட்டாயமாக அகற்றலாம்.

ட்ரேஸ்லெட்டின் சொந்தக் குறியீடு checkSelfPermission() உடன் முழுமையாகப் பாதுகாக்கப்படுகிறது. விடுபட்ட அனுமதிகள் க்ராஷ்களை அல்ல, அழகான பின்னடைவைத் தூண்டும்.

அனுமதிஅகற்றப்படும் போது விளைவு (tools:node="remove")
நோட்ரான்ஸ்0லேட்பாதுகாப்பானது. அடிப்படை முடுக்கமானி மட்டுமே இயக்கம் கண்டறிதல். onActivityChange ஸ்ட்ரீம் சுடாது (நடத்தல்/ஓடுதல்/ஓட்டுதல் வகைப்பாடு இல்லை).
நோட்ரான்ஸ்0லேட்பாதுகாப்பானது. ஆண்ட்ராய்டு 10+ ஆனது ஆப்ஸ் முழுவதுமாக பின்னணியில் இருக்கும் போது அல்லது ஸ்வைப் செய்யும்போது கண்காணிப்பதைக் கட்டுப்படுத்தும்.
நோட்ரான்ஸ்0லேட்பாதுகாப்பானது. பேட்டரிக்கு ஏற்ற, ஆனால் துல்லியமற்ற, வொர்க்மேனேஜர் டைமர்களைப் பயன்படுத்துவதற்கு அவ்வப்போது பயன்முறை வரும்.
நோட்ரான்ஸ்0லேட்பாதுகாப்பானது. முன்புற சேவையின் நிலையான அறிவிப்பு Android 13+ இல் மறைக்கப்பட்டுள்ளது. சேவை இன்னும் இயங்குகிறது.
நோட்ரான்ஸ்0லேட்பாதுகாப்பானது. OS இலிருந்து பேட்டரி மேம்படுத்தல் விலக்குகளை நீங்கள் கோர முடியாது.
நோட்ரான்ஸ்0லேட் / நோட்ரான்ஸ்1லேட்ஜியோஃபென்ஸ்-மட்டுமே / குறிப்பிட்ட கால இடைவெளியில் மட்டுமே பயன்பாடுகளுக்கு பாதுகாப்பானது. அவற்றை அகற்றுவது தொடர்ச்சியான முன்புற கண்காணிப்பை (start()) முடக்குகிறது, ஆனால் நிலையான ஜியோஃபென்சிங் மற்றும் காலமுறை பயன்முறை தொடர்ந்து செயல்படும். தொடர்ச்சியான பின்னணி கண்காணிப்புக்கு தேவை.
நோட்ரான்ஸ்0லேட் / நோட்ரான்ஸ்1லேட்பாதுகாப்பானது. எந்த இருப்பிட அனுமதியும் இல்லாமல், ட்ரேஸ்லெட் பதவிகளைப் பெற முடியாது.

Google Play முன்-சேவைக் கொள்கை (அக். 28, 2026 முதல் அமலுக்கு வரும்). ஜியோஃபென்சிங் முன்புற சேவை இருப்பிடத்திற்கு இனி அனுமதிக்கப்படும் பயன்பாட்டு வழக்கு. உங்கள் பயன்பாடு ஒரு பயன்படுத்தினால் ஜியோஃபென்சிங்கிற்கு முன்புற சேவை மட்டும், நீங்கள் அகற்ற வேண்டும் நீங்கள் ஒன்றிணைத்ததிலிருந்து 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>

தானியங்கி ProGuard / R8 விதிகள்

ட்ரேஸ்லெட் பின்னணி கோட்லின் சேவைகள், ரஸ்ட் மையத்திற்கான JNA பிணைப்புகள் மற்றும் பிரதிபலிப்பு புறா சேனல்களை பெரிதும் பயன்படுத்துகிறது. இவை தெளிவற்றதாகவோ அல்லது தவறாகச் சுருக்கப்பட்டாலோ, உங்கள் ஆப்ஸ் வெளியீட்டிற்காக தொகுக்கப்படும்போது பின்னணி கண்காணிப்பு அமைதியாக தோல்வியடையும்.

ட்ரேஸ்லெட்டுக்காக நீங்கள் கைமுறையாக ProGuard ஐ உள்ளமைக்க வேண்டியதில்லை.

tracelet_android செருகுநிரல் தானாகவே உட்பொதிக்கப்பட்ட consumer-rules.pro உடன் அனுப்பப்படும். உங்கள் Flutter பயன்பாட்டை வெளியீட்டு பயன்முறையில் உருவாக்கும்போது, ​​Android இன் R8 சுருக்கி தானாகவே இந்த விதிகளைப் பிரித்தெடுத்து, தேவையான அனைத்து வகுப்புகளும் (HeadlessTaskService, BootReceiver மற்றும் ரஸ்ட் uniffi பிணைப்புகள் போன்றவை) சுருங்குவதை உறுதி செய்கிறது.


காட்சி 1: டெலிவரி டிரைவர் (தொடர்ச்சியான கண்காணிப்பு)

கருத்துகள் ஆராயப்பட்டன: டோஸ் மோட், முன்பக்கம் சேவைகள், வேக்லாக்ஸ்

பிரச்சனை

உங்கள் பயனர் பீட்சா டெலிவரி டிரைவர். திரையை அணைத்துவிட்டு போனை பாக்கெட்டில் வைத்தனர். 15 நிமிடங்களுக்குப் பிறகு, ஆண்ட்ராய்டு டோஸ் பயன்முறையில் நுழைகிறது. இது பிணைய அணுகலை நிறுத்துகிறது, பின்னணி வேலைகளை ஒத்திவைக்கிறது மற்றும் பேட்டரியைச் சேமிக்க CPU விழிப்பூட்டல்களை கடுமையாகக் கட்டுப்படுத்துகிறது. உங்கள் ஆப்ஸ் ஜிபிஎஸ் பெற எளிய டைமரை நம்பியிருந்தால், உங்கள் டைமரை இயக்க ஆண்ட்ராய்ட் வெறுமனே மறுக்கும்.

ட்ரேஸ்லெட் அதை எவ்வாறு தீர்க்கிறது: முன்புற சேவை

முன்புறச் சேவையானது ஆண்ட்ராய்டிடம் கூறுகிறது: “ஏய், நான் இப்போது நம்பமுடியாத முக்கியமான ஒன்றைச் செய்கிறேன், அதைப் பயனர் முழுமையாக அறிந்திருக்கிறார். என்னைக் கொல்லாதே.”

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 ), )

நிலைப் பட்டியில் நிலையான அறிவிப்பைக் காண்பிப்பதன் மூலம், ட்ரேஸ்லெட் உங்கள் பயன்பாட்டின் முன்னுரிமையை கிட்டத்தட்ட முன்புற UI இன் நிலைக்கு உயர்த்துகிறது. டோஸ் பயன்முறை கட்டுப்பாடுகளைத் தவிர்த்து, ட்ரேஸ்லெட்டை காலவரையின்றி இயக்க Android அனுமதிக்கும்.

அறிவிப்பு தோற்றத்தைத் தனிப்பயனாக்குதல்

உங்கள் பயன்பாட்டின் பிராண்டிங்குடன் நிலையான அறிவிப்பைப் பொருத்த, நீங்கள் ஐகான்களையும் வண்ணங்களையும் தனிப்பயனாக்கலாம்:

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. சிறிய ஐகான் கட்டுப்பாடுகள்: Android க்கு notificationSmallIcon முற்றிலும் தட்டையாகவும், வெளிப்படையானதாகவும், வெள்ளைக்கு மட்டும் இருக்க வேண்டும். நீங்கள் வண்ண லோகோவைப் பயன்படுத்தினால், Android அதை ஒரு திட சாம்பல் அல்லது வெள்ளை சதுரமாக வழங்கும்.
  3. வண்ணச் சொத்து: notificationColor சொத்து உங்கள் சிறிய ஐகானின் பின்புலத்தை உங்கள் பிராண்டுடன் பொருந்துமாறு மாற்றும்.
🔔

Android 13+ குறிப்பு: சேவையைத் தொடங்குவதற்கு முன் நீங்கள் POST_NOTIFICATIONS அனுமதியைக் கோர வேண்டும், இல்லையெனில் அறிவிப்பு அமைதியாக OS ஆல் அடக்கப்படும். உங்கள் டார்ட் குறியீட்டிலிருந்து இதை எப்படிக் கோருவது என்பதற்கு Flutter SDK: Permissions பக்கத்தைப் பார்க்கவும்.

கண்காணிக்கும் போது அறிவிப்பைப் புதுப்பித்தல் (updateNotification())

கண்காணிப்பு ஏற்கனவே தொடங்கிய பிறகு *அறிவிப்பை மாற்ற வேண்டும் - எ.கா. தலைப்பை “வழியில்” என்பதிலிருந்து “வருகிறது” எனப் புதுப்பிக்கவா, உரையை மாற்றவா அல்லது பயணத்தின் நடுப்பகுதியில் செயல் பட்டன்களை மாற்றவா? புதிய ForegroundServiceConfig உடன் setConfig() ஐ அழைப்பது மதிப்புகள் தொடரும், ஆனால் அறிவிப்பு மட்டும் மாற்றம் ஆண்ட்ராய்டு ஏற்கனவே காட்டும் அறிவிப்பை மறுபதிவு செய்யாது - புதிய உள்ளடக்கம் தொடர்பில்லாத சேவை மறுதொடக்கம் அல்லது முன்புற மாற்றத்திற்குப் பிறகு மட்டுமே தோன்றும்.

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)

மேலே உள்ள மாதிரிக்கு ஒரு கேட்ச் உள்ளது. ஆண்ட்ராய்டு ஒவ்வொரு மறுபதிவையும் **புதிய விழிப்பூட்டலாகக் கருதுகிறது, நீங்கள் வேறுவிதமாகச் சொல்லாத வரை, நீங்கள் ஒரு நிமிடத்திற்கு ஒருமுறை புதுப்பிக்கும் அறிவிப்பு, கண்காணிப்பு இயங்கும் வரை, நிமிடத்திற்கு ஒருமுறை உங்கள் அறிவிப்பு ஒலியை இயக்கும்.

ட்ரேஸ்லெட்டின் சேனல் அதிர்வு மற்றும் விளக்குகள் முடக்கப்பட்டதால் உருவாக்கப்பட்டது, எனவே இது ஒரு ஒலி, சலசலப்பு அல்ல - ஆனால் இயல்புநிலை notificationPriority இல் இது கேட்கக்கூடியது, மேலும் பயனர்கள் அதை விரைவாக கவனிக்கிறார்கள்.

notificationOnlyAlertOnce ஐ அமைக்கவும், அதனால் முதல் இடுகை விழிப்பூட்டல்கள் மற்றும் ஒவ்வொரு புதுப்பிப்பும் அமைதியாக இருக்கும்:

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

கீழே உள்ள டைமருக்கு மட்டுமின்றி, மீதமுள்ள நிறுத்தங்களின் எண்ணிக்கை, நிலுவையில் உள்ள பதிவேற்றங்கள், தற்போதைய ஜியோஃபென்ஸ், நேரலைத் துல்லியம் போன்றவற்றைக் கண்காணிக்கும் போது எந்தவொரு அறிவிப்பையும் அமைப்பது மதிப்புக்குரியது.

முன்னுரிமையை மட்டும் ஏன் குறைக்கக்கூடாது? notificationPrioritylow அல்லது min க்கு விடுவது சேனலை அமைதிப்படுத்துகிறது, ஆனால் இது முதல் இடுகையையும் அமைதிப்படுத்துகிறது, மேலும் சேனல் உருவாக்கப்படும் போது சேனலின் முக்கியத்துவத்தை Android சரிசெய்கிறது. இயல்புநிலை முக்கியத்துவம் வாய்ந்த சேனலுடன் ஏற்கனவே நிறுவப்பட்ட ஆப்ஸ், channelId ஐ மாற்றாமல் பின்னர் அதைக் குறைக்க முடியாது, இது கணினி அமைப்புகளில் பழைய சேனலை அனாதையாக்கும். notificationOnlyAlertOnce இல் எந்த பிரச்சனையும் இல்லை மற்றும் எந்த முன்னுரிமையிலும் செயல்படுகிறது.

இது false க்கு இயல்புநிலையாக இருக்கும், இது ஏற்கனவே உள்ள ஒவ்வொரு பயன்பாட்டின் நடத்தையையும் பாதுகாக்கிறது. நீங்கள் தேர்வு செய்யும் வரை எதுவும் மாறாது.

பயன்பாடு திறந்திருக்கும் போது அறிவிப்பை மறைத்தல் (showNotificationOnPauseOnly)

showNotificationOnPauseOnly: true பயனர் உங்கள் பயன்பாட்டைப் பார்க்கும்போது கண்காணிப்பு அறிவிப்பைக் குறைக்கிறது, மேலும் அவர்கள் வெளியேறும்போது அதைத் திரும்பப் பெறுகிறது. இது ஒரு உண்மையான இனிமையான அனுபவம் - பயன்பாடு திரையில் இருக்கும்போது அறிவிப்பு தட்டு சுத்தமாக இருக்கும் - ஆனால் இது ஒரு கடினமான தடையுடன் வருகிறது, மேலும் கட்டுப்பாடு தெளிவாக இல்லை.

அறிவிப்பை மறைப்பது என்பது சேவையை தரமிறக்குவதாகும். அறிவிப்பு இல்லாமல் முன்புற சேவை பற்றிய கருத்து Android இல் இல்லை, எனவே அதை மறைக்க ஒரே வழி stopForeground() ஆகும். கண்காணிப்பு தொடர்கிறது மற்றும் சேவை தொடர்ந்து இயங்குகிறது, ஆனால் அறிவிப்பு மறைந்திருக்கும் வரை உங்கள் செயல்முறை முன்புற சேவை இல்லை.

பயனர் உங்கள் ஆப்ஸை சமீபத்தியவற்றிலிருந்து ஸ்வைப் செய்யும் போது, ​​அதுவே ஆண்ட்ராய்டு அழிக்கும் நிலை.

showNotificationOnPauseOnly புறக்கணிக்கப்படும் போது stopOnTerminate: false (#378 ). இரண்டு அமைப்புகளும் பொருந்தாத விஷயங்களைக் கேட்கின்றன மற்றும் உயிர்வாழும் வாக்குறுதி வெற்றி பெறும்: அறிவிப்பு தெரியும்.

அதை ஏன் வேலை செய்ய முடியாது

ஒரு பணி அகற்றப்படும் போது, ​​proc.foregroundServices இலிருந்து எந்த செயல்முறைகளைக் கொல்ல வேண்டும் என்பதை ActivityManager தீர்மானிக்கிறது - மேலும் இது ** onTaskRemoved ஐ உங்கள் பயன்பாட்டின் முக்கிய தொடரிழைக்கு அனுப்புவதற்கு முன் தீர்மானிக்கிறது. எனவே SDK அகற்றும் நேரத்தில் அறிவிப்பை இடுவதன் மூலம் நிலைமையை மீட்க முடியாது; அதற்குள் தீர்ப்பு வந்துவிட்டது. ட்ரேஸ்லெட்டிற்கு அந்தத் தணிப்பு சரியாக இருந்தது, அது உதவவில்லை.

இதன் விளைவாக யாரும் பார்க்க முடியாத பந்தயம். ஆப்ஸ் திரையை விட்டு வெளியேறுவதற்கும் அறிவிப்பு வருவதற்கும் இடையே உள்ள இடைவெளியில் அதை ஸ்வைப் செய்யவும், செயல்முறை இறந்துவிட்டது: தலையில்லாத பணி இல்லை, நிகழ்வுகள் இல்லை, பதிவுகள் இல்லை, உத்தரவாதம் அளிக்க stopOnTerminate: false எதுவும் இல்லை. ஒரு நொடி கழித்து ஸ்வைப் செய்யவும், அனைத்தும் சரியாக வேலை செய்தன. பிக்சல் மடிப்பில் 285 எம்எஸ் மற்றும் ஆண்ட்ராய்டு 15 சாதனத்தில் 700–1500 எம்எஸ் இடைவெளி அளவிடப்பட்டது.

அதற்கு பதிலாக ட்ரேஸ்லெட் என்ன செய்கிறது

உங்கள் கட்டமைப்புநடத்தை
நோட்ரான்ஸ்0லேட் + நோட்ரான்ஸ்1 லேட்கொடி புறக்கணிக்கப்பட்டது. அறிவிப்பு காணக்கூடியதாக இருக்கும், சேவை ஒருபோதும் தரமிறக்கப்படாது, மேலும் சமீபத்தியவற்றிலிருந்து ஸ்வைப் செய்வதால் செயல்முறையை அழிக்க முடியாது.
நோட்ரான்ஸ்0லேட் + நோட்ரான்ஸ்1 லேட்ஆவணப்படுத்தப்பட்டபடி சரியாகச் செயல்படும் - ஆப்ஸ் திரையில் இருக்கும்போது மறைக்கப்படும். இங்கு ஸ்வைப் செய்ததைத் தாண்டி எதுவும் உறுதியளிக்கப்படவில்லை, எனவே பாதுகாக்க எதுவும் இல்லை.
நோட்ரான்ஸ்0லேட்அறிவிப்பு எப்போதும் தெரியும். இதுதான் இயல்புநிலை.

மேலெழுதுதல் அமைதியாக இல்லை — இது அசல் பிழையை விலை உயர்ந்ததாக மாற்றியதில் பாதி. 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+ இல், உங்கள் ஆப்ஸ் திரையை முடக்கியவுடன், இருப்பிட முன் சேவை அதன் அறிவிப்பைக் காட்ட வேண்டும், எனவே பயனர் உங்கள் பயன்பாட்டில் இருக்கும்போது மட்டுமே மறைத்தல் பொருந்தும்.

இது ஆண்ட்ராய்டு மட்டும். 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 க்ரோனோமீட்டர் ஒரு அழைப்பு.

iOS இணையானது நேரடி செயல்பாட்டு டைமர், இது liveActivityConfig இல் உள்ள அதே இரண்டு புலங்களை எடுக்கும்.


காட்சி 2: வானிலை பயன்பாடு (கால கண்காணிப்பு)

கருத்துகள் ஆராயப்பட்டன: WorkManager vs. சரியான அலாரங்கள்

பிரச்சனை

உங்கள் உள்ளூர் வானிலை பயன்பாட்டை உங்கள் பயனர் பதிவிறக்கம் செய்துள்ளார். ஒவ்வொரு 4 மணிநேரத்திற்கும் ஒருமுறை பின்னணியில் எழுந்து, அவர்களின் இருப்பிடத்தைப் பெற்று, உள்ளூர் முன்னறிவிப்பைப் பதிவிறக்கவும்.

நீங்கள் தொடர்ந்து முன்னோடி சேவை அறிவிப்பை விரும்பவில்லை. பயனர் தனது டிராயரில் நிரந்தர “வானிலை கண்காணிப்பு” அறிவிப்பைப் பார்ப்பதை வெறுப்பார்.

ட்ரேஸ்லெட் அதை எவ்வாறு தீர்க்கிறது: காலமுறை பயன்முறை

தொடர்ச்சியான சேவைக்குப் பதிலாக, ட்ரேஸ்லெட் ஆண்ட்ராய்டின் வேலை அட்டவணையைப் பயன்படுத்தி சுருக்கமாக எழுந்திருக்கவும், சரிசெய்யவும், மீண்டும் தூங்கவும் முடியும்.

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

இரண்டு திட்டமிடுபவர்கள்

  1. பணி மேலாளர் (periodicUseExactAlarms: false) இயல்புநிலை. இது மிகவும் பேட்டரி நட்பு. இருப்பினும், அதை எப்போது இயக்க வேண்டும் என்பதை ஆண்ட்ராய்டு தீர்மானிக்கிறது. ஒவ்வொரு 15 நிமிடங்களுக்கும் அதை இயக்கச் சொன்னால், ஆண்ட்ராய்டு 45 நிமிடங்கள் காத்திருந்து, இன்ஸ்டாகிராமைச் சரிபார்க்க (“பேட்சிங்” என்று அழைக்கப்படுகிறது) பயனர் தனது மொபைலைத் திறக்கும்போது அதை இயக்கலாம். இது மிகவும் துல்லியமற்றது.

  2. அலாரம் மேலாளர் (periodicUseExactAlarms: true) ஒரு குறிப்பிட்ட நேரத்தில் சாதனத்தை நீங்கள் கண்டிப்பாக எழுப்ப வேண்டும் என்றால், இதைப் பயன்படுத்தவும். உங்கள் android/app/src/main/AndroidManifest.xml இல் SCHEDULE_EXACT_ALARM அனுமதியை அறிவிக்க வேண்டும்:

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

    குறிப்பு: இந்த அனுமதியை Google Play கண்டிப்பாக மதிப்பாய்வு செய்கிறது. உங்கள் ஆப்ஸ் அலாரம் கடிகாரமாகவோ, காலெண்டராகவோ அல்லது சரியான நேரம் தேவைப்பட்டாலோ மட்டுமே அதைப் பயன்படுத்தவும்.


காட்சி 3: OEM ஆக்கிரமிப்பு

கருத்துகள் ஆராயப்பட்டன: அமைப்புகள் ஹெல்த் ஏபிஐ

பிரச்சனை

நீங்கள் எல்லாவற்றையும் சரியாகச் செய்தீர்கள். உங்களிடம் முன்புற சேவை உள்ளது. ஆனால் பயனர் ஒரு Xiaomi தொலைபேசியை வைத்திருக்கிறார். MIUI ஆனது ஒரு தனியுரிம “பேட்டரி சேவர்” உள்ளது, இது 5 நிமிட ஸ்கிரீன்-ஆஃப் நேரத்திற்குப் பிறகு முன்புற சேவைகளைக் கூட பலவந்தமாகக் கொல்லும்.

ட்ரேஸ்லெட் அதை எவ்வாறு தீர்க்கிறது: தானியங்கு-தணிப்பு மற்றும் தூண்டுதல்கள்

சாத்தியமான இடங்களில் ட்ரேஸ்லெட் தானாகவே உள் குறைப்புகளைப் பயன்படுத்துகிறது, ஆனால் சில நேரங்களில் பயனர் உங்கள் பயன்பாட்டை 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 இல் இதை எவ்வாறு செயல்படுத்துவது என்பதற்கான விரிவான உதாரணத்திற்கு, கண்டறியும் கருவிகள் மற்றும் ஆற்றல் மேலாண்மை பக்கத்தைப் பார்க்கவும்.