ഫോർഗ്രൗണ്ട് സർവീസ് ഹെൽത്ത്
ആൻഡ്രോയിഡിൽ, സ്ഥിരമായ ഫോർഗ്രൗണ്ട് സേവനമാണ് പശ്ചാത്തല ലൊക്കേഷൻ നിലനിർത്തുന്നത്
ജീവനോടെ ട്രാക്കുചെയ്യുന്നു. എന്നാൽ ട്രാക്ക് ചെയ്യാൻ ആവശ്യപ്പെടുന്നത് (Tracelet.start()) എന്നതിന് സമാനമല്ല
OS ** ഒരു റൺ ഫോർഗ്രൗണ്ട് സേവനം നൽകുന്നു. ആൻഡ്രോയിഡ് 12+ എ
ഫോർഗ്രൗണ്ട്-സർവീസ് ആരംഭം മാറ്റിവയ്ക്കാം അല്ലെങ്കിൽ നിരസിക്കപ്പെടാം — നിങ്ങളുടെ ആപ്പ് സമയത്ത് പോലും
ട്രാക്കിംഗ് പ്രവർത്തനക്ഷമമാണെന്ന് വിശ്വസിക്കുന്നു.
Tracelet.getForegroundServiceHealth() ആ വിടവ് അടയ്ക്കുന്നു. ഇത് റിപ്പോർട്ട് ചെയ്യുന്നു
ഫോർഗ്രൗണ്ട് സേവനത്തിൻ്റെ ആധികാരിക മാതൃ അവസ്ഥ അതിനാൽ നിങ്ങൾക്ക് പറയാനാകും
“ട്രാക്കിംഗ് അഭ്യർത്ഥിച്ചു”, “ട്രാക്കിംഗ് എന്നിവ തമ്മിലുള്ള വ്യത്യാസം യഥാർത്ഥത്തിൽ ആണ്
ഓടുന്നു” — അവ വ്യതിചലിക്കുമ്പോൾ പ്രതികരിക്കുക.
എന്തുകൊണ്ട് enabled പോരാ
Tracelet.getState().enabled എന്നത് ആവശ്യമുള്ള അവസ്ഥയാണ് - നിരന്തരമായ ഉദ്ദേശ്യം
ട്രാക്ക്. ഇത് ഉത്തരം “ആപ്പ് ട്രാക്ക് ചെയ്യാൻ ആവശ്യപ്പെട്ടിട്ടുണ്ടോ?”, അല്ല ” യഥാർത്ഥത്തിൽ OS ആണോ
ഇപ്പോൾ ഫോർഗ്രൗണ്ട് സർവീസ് നടത്തുന്നുണ്ടോ?”.
അവയ്ക്ക് വ്യത്യാസമുണ്ടാകാം, പ്രത്യേകിച്ച് Android 12+ (API 31+), ആരംഭിക്കുന്നിടത്ത് a
പശ്ചാത്തലത്തിൽ നിന്നുള്ള location ഫോർഗ്രൗണ്ട് സേവനം നിയന്ത്രിച്ചിരിക്കുന്നു:
- ആരംഭം മാറ്റിവയ്ക്കാം — ആപ്പ് ആയിരിക്കുമ്പോൾ Android അത് നിരസിക്കുന്നു പശ്ചാത്തലമാക്കി, അടുത്തതായി ആപ്പ് തിരികെ വരുമ്പോൾ Tracelet സ്വയമേവ വീണ്ടും ശ്രമിക്കുന്നു മുൻഭാഗം.
- തുടക്കം പരാജയപ്പെടാം - ഉദാ. നഷ്ടമായ അനുമതി, അല്ലെങ്കിൽ എ വിവർത്തനം ചെയ്യരുത്.
- ഈ സേവനം സിസ്റ്റം വഴി പ്രമോട്ടുചെയ്യാനും തുടർന്ന് നിർത്താനും കഴിയും.
ഈ സാഹചര്യങ്ങളിലെല്ലാം enabled true ആയി തുടരുന്നു, എന്നാൽ പശ്ചാത്തല ട്രാക്കിംഗ് അല്ല
പ്രവർത്തനക്ഷമമായ. ഒരു ലൊക്കേഷൻ-ടൈംസ്റ്റാമ്പ് വാച്ച്ഡോഗിന് കാലക്രമേണ കാലപ്പഴക്കം ശ്രദ്ധിക്കാൻ കഴിയും, പക്ഷേ
എന്തുകൊണ്ട് — പ്രമോഷൻ പരാജയപ്പെട്ടോ, സേവനം നിർത്തിയോ, അല്ലെങ്കിൽ
ദാതാവ് ഒരു പുതിയ പരിഹാരത്തിനായി കാത്തിരിക്കുകയാണ്. getForegroundServiceHealth()
നിങ്ങൾക്ക് യഥാർത്ഥവും ആധികാരികവുമായ കാരണം നൽകുന്നു.
API
final health = await Tracelet.getForegroundServiceHealth();ഇനിപ്പറയുന്ന കീകൾ ഉപയോഗിച്ച് ഒരു Map<String, Object?> നൽകുന്നു:
| താക്കോൽ | തരം | അർത്ഥം |
|---|---|---|
desiredEnabled | നോട്ട്രാൻസ്1ലേറ്റ് | നിലനിൽക്കുന്ന ആവശ്യമുള്ള ട്രാക്കിംഗ് അവസ്ഥ (getState().enabled പോലെ തന്നെ). |
foregroundServiceEnabled | നോട്ട്രാൻസ്1ലേറ്റ് | സജീവ കോൺഫിഗറേഷൻ ഒരു ഫോർഗ്രൗണ്ട് സർവീസ് പ്രവർത്തിപ്പിക്കുന്നുണ്ടോ. |
serviceRunning | നോട്ട്രാൻസ്1ലേറ്റ് | നേറ്റീവ് ലൊക്കേഷൻ സേവന പ്രക്രിയ സജീവമാണോ എന്ന്. |
serviceForeground | നോട്ട്രാൻസ്1ലേറ്റ് | സേവനം നിലവിൽ പ്രമോട്ടുചെയ്തിട്ടുണ്ടോ (അവസാനം startForeground() വിജയിച്ചു, അതിനുശേഷം അത് തരംതാഴ്ത്തുകയോ/നിർത്തുകയോ ചെയ്തിട്ടില്ല). |
foregroundNotificationId | നോട്ട്രാൻസ്1ലേറ്റ് | പ്രമോട്ടുചെയ്യുമ്പോൾ അറിയിപ്പ് ഐഡി; അല്ലാത്തപക്ഷം null. |
lastForegroundPromotionResult | നോട്ട്രാൻസ്1ലേറ്റ് | success, deferred, അല്ലെങ്കിൽ failed - ഏറ്റവും പുതിയ പ്രമോഷൻ ശ്രമത്തിൻ്റെ ഫലം (ഏത് ശ്രമത്തിനും മുമ്പ് null). |
lastForegroundPromotionFailureClass | നോട്ട്രാൻസ്1ലേറ്റ് | അവസാനമായി പരാജയപ്പെട്ട/മാറ്റിവെച്ച പ്രമോഷൻ്റെ ഒഴിവാക്കൽ ക്ലാസ് (ഉദാ. ForegroundServiceStartNotAllowedException). |
lastForegroundPromotionFailureMessage | നോട്ട്രാൻസ്1ലേറ്റ് | ഒഴിവാക്കൽ സന്ദേശം. |
lastForegroundTransitionAt | നോട്ട്രാൻസ്1ലേറ്റ് | അവസാന പ്രമോഷൻ സംക്രമണത്തിൻ്റെ യുഗ-മില്ലിസെക്കൻഡ്. |
platform | നോട്ട്രാൻസ്1ലേറ്റ് | android, ios, അല്ലെങ്കിൽ web. |
എല്ലാ പ്ലാറ്റ്ഫോമിലും മാപ്പ് ആകൃതി മനഃപൂർവ്വം സമാനമാണ്, അതിനാൽ ക്രോസ്-പ്ലാറ്റ്ഫോം കോഡ് ഒരേപോലെ വായിക്കാൻ കഴിയും. ഓരോ പ്ലാറ്റ്ഫോമിലും മൂല്യങ്ങൾ മാത്രം വ്യത്യാസപ്പെട്ടിരിക്കുന്നു (ചുവടെ കാണുക).
പ്രമോഷൻ ഫലം വായിക്കുന്നു
serviceForeground, lastForegroundPromotionResult എന്നിവയുമായി ചേർന്ന് നിങ്ങളോട് പറയുന്നു
മുഴുവൻ കഥയും:
desiredEnabled | നോട്ട്രാൻസ്1ലേറ്റ് | lastForegroundPromotionResult | വ്യാഖ്യാനം |
|---|---|---|---|
false | നോട്ട്രാൻസ്1ലേറ്റ് | ഏതെങ്കിലും | ട്രാക്കിംഗ് ഓഫാണ് - വിഷമിക്കേണ്ട കാര്യമില്ല. |
true | നോട്ട്രാൻസ്1ലേറ്റ് | success | ✅ ആരോഗ്യകരമായ — ഫോർഗ്രൗണ്ട് സേവനം പ്രവർത്തിക്കുകയും പ്രമോട്ടുചെയ്യുകയും ചെയ്യുന്നു. |
true | നോട്ട്രാൻസ്1ലേറ്റ് | deferred | ⏳ മാറ്റിവെച്ചിരിക്കുന്നു — പശ്ചാത്തലത്തിലായിരിക്കുമ്പോൾ ആൻഡ്രോയിഡ് ആരംഭം നിരസിച്ചു; ആപ്പ് ഫോർഗ്രൗണ്ടിലേക്ക് മടങ്ങുമ്പോൾ Tracelet വീണ്ടും ശ്രമിക്കും. |
true | നോട്ട്രാൻസ്1ലേറ്റ് | failed | ❌ പരാജയപ്പെട്ടു — പ്രമോഷൻ പരാജയപ്പെട്ടു; പശ്ചാത്തല ട്രാക്കിംഗ് അല്ല പ്രവർത്തനക്ഷമമല്ല. പരാജയ ക്ലാസ്/സന്ദേശം പരിശോധിക്കുക. |
true | നോട്ട്രാൻസ്1ലേറ്റ് | null | ⌛ അഭ്യർത്ഥിച്ചെങ്കിലും ഇതുവരെ സ്ഥിരീകരിച്ചിട്ടില്ല (ക്ഷണികം - ഉടൻ വീണ്ടും വോട്ടെടുപ്പ്). |
ഒരു ട്രാക്കിംഗ്-ആരോഗ്യ സൂചകം
ഏറ്റവും സാധാരണമായ ഉപയോഗം: ഉപയോക്താവിന് (അല്ലെങ്കിൽ നിങ്ങളുടെ ടെലിമെട്രി) സത്യസന്ധമായ നില
enabled നെ അന്ധമായി വിശ്വസിക്കുന്നതിനുപകരം.
Future<String> describeTrackingHealth() async {
final h = await Tracelet.getForegroundServiceHealth();
if (h['desiredEnabled'] != true) return 'Tracking off';
// iOS/web have no foreground service — enabled tracking is as good as it gets.
if (h['platform'] != 'android') return 'Tracking active';
if (h['serviceForeground'] == true) return 'Tracking active';
switch (h['lastForegroundPromotionResult']) {
case 'deferred':
return 'Waiting to start — reopen the app to resume background tracking';
case 'failed':
final reason = h['lastForegroundPromotionFailureMessage'] ?? 'unknown';
return 'Background tracking failed to start: $reason';
default:
return 'Starting…';
}
}ഒരു റിക്കവറി വാച്ച്ഡോഗ്
പരാജയപ്പെട്ടത് കണ്ടെത്താനും വീണ്ടെടുക്കാനും ആരോഗ്യ പരിശോധന ഒരു ആനുകാലിക ടൈമർ ഉപയോഗിച്ച് ജോടിയാക്കുക പ്രൊമോഷൻ - ഉദാഹരണത്തിന്, ആപ്പ് വീണ്ടും തുറക്കാൻ ഉപയോക്താവിനോട് ആവശ്യപ്പെടുക, അല്ലെങ്കിൽ വീണ്ടും അഭ്യർത്ഥിക്കുക അനുമതി നഷ്ടപ്പെട്ടു.
Timer.periodic(const Duration(minutes: 1), (_) async {
final h = await Tracelet.getForegroundServiceHealth();
final desired = h['desiredEnabled'] == true;
final foreground = h['serviceForeground'] == true;
final result = h['lastForegroundPromotionResult'];
if (desired && !foreground && result == 'failed') {
// Background tracking is not operational. Log it, alert your backend,
// or guide the user to fix permissions / battery settings.
await reportTrackingDegraded(
failureClass: h['lastForegroundPromotionFailureClass'],
failureMessage: h['lastForegroundPromotionFailureMessage'],
);
}
});serviceForeground അവസാനത്തെ പ്രമോഷൻ ഫലത്തെ പ്രതിഫലിപ്പിക്കുന്നു, തത്സമയ വോട്ടെടുപ്പ് അല്ല
ഓരോ മില്ലിസെക്കൻഡിലും OS. start()-ന് തൊട്ടുപിന്നാലെ, പ്രമോഷൻ ഒരു അടിയായി
പിന്നീട് - നിങ്ങൾക്ക് ഏറ്റവും പുതിയ മൂല്യം വേണമെങ്കിൽ ഒരു ചെറിയ കാലതാമസത്തിന് ശേഷം (1-2 സെ) വീണ്ടും വോട്ടെടുപ്പ് നടത്തുക.
പ്ലാറ്റ്ഫോം പെരുമാറ്റം
| പ്ലാറ്റ്ഫോം | പെരുമാറ്റം |
|---|---|
| ആൻഡ്രോയിഡ് | തത്സമയ ഫോർഗ്രൗണ്ട്-സർവീസ് സ്റ്റേറ്റും പ്രമോഷൻ ചരിത്രവും കൊണ്ട് പൂർണ്ണമായി ജനസംഖ്യയുള്ളതാണ്. |
| iOS | വസ്തുതയ്ക്ക് ശേഷം പരാജയപ്പെടാവുന്ന ഫോർഗ്രൗണ്ട് സേവനങ്ങളൊന്നുമില്ല, അതിനാൽ serviceForeground false ആണ്, foregroundServiceEnabled false ആണ്, കൂടാതെ പ്രമോഷൻ ഫീൽഡുകൾ null ആണ്. ട്രാക്കിംഗ് സജീവമാണോ എന്ന് desiredEnabled, serviceRunning എന്നിവ പ്രതിഫലിപ്പിക്കുന്നു. platform എന്നത് ios ആണ്. |
| വെബ് | ഫോർഗ്രൗണ്ട് സർവീസ് ഇല്ല. ആവശ്യമുള്ള അവസ്ഥയെ പ്രതിഫലിപ്പിക്കുന്ന ഏറ്റവും കുറഞ്ഞ മാപ്പ് നൽകുന്നു; platform എന്നത് web ആണ്. |
Tracelet ഡോക്ടറിൽ
ഇതൊന്നും കാണാൻ നിങ്ങൾ സ്വയം നിർമ്മിക്കേണ്ടതില്ല. ദി
tracelet_doctor ഓവർലേയിൽ ഇപ്പോൾ ഒരു ഫോർഗ്രൗണ്ട് ഉൾപ്പെടുന്നു
ഈ വിവരങ്ങൾ കൃത്യമായി റെൻഡർ ചെയ്യുന്ന സേവന കാർഡ് — ആവശ്യമുള്ളവയും യഥാർത്ഥവും,
പ്രമോഷൻ ഫലം, ഏതെങ്കിലും പരാജയ ക്ലാസ്/സന്ദേശം - കളർ കോഡഡ് സ്റ്റാറ്റസോടെ
(ആരോഗ്യമുള്ളത് / മാറ്റിവച്ചത് / പരാജയപ്പെട്ടത് / നിഷ്ക്രിയം).
tracelet_doctor ഒരു ദേവാശ്രയമാണ് (flutter pub add dev:tracelet_doctor), അതിനാൽ
kDebugMode ഉപയോഗിച്ച് സംരക്ഷിക്കുക:
import 'package:flutter/foundation.dart' show kDebugMode;
import 'package:tracelet_doctor/tracelet_doctor.dart';
if (kDebugMode) {
TraceletDoctor.show(context); // includes the Foreground Service card
}ഇതേ ഫീൽഡുകൾ ബഗ് റിപ്പോർട്ടിലും (TraceletBugReport.build())
അതിനാൽ ഫോർഗ്രൗണ്ട് സേവനം യഥാർത്ഥത്തിൽ പ്രവർത്തിക്കുന്നുണ്ടോ എന്ന് ഒട്ടിച്ച റിപ്പോർട്ട് കാണിക്കുന്നു
പ്രശ്നത്തിൻ്റെ സമയം - പലപ്പോഴും “ട്രാക്കിംഗ് നിർത്തുന്നത്” എന്നതിലെ നഷ്ടമായ സൂചന
പശ്ചാത്തലം” റിപ്പോർട്ടുകൾ.
അറിഞ്ഞത് നന്നായി
- വായിക്കാൻ മാത്രം & വിലകുറഞ്ഞത്. കോൾ ഇൻ-മെമ്മറി നേറ്റീവ് സ്റ്റേറ്റ് വായിക്കുന്നു; അത് ഒരിക്കലും ട്രാക്കിംഗ് ആരംഭിക്കുന്നു, നിർത്തുന്നു അല്ലെങ്കിൽ മ്യൂട്ടേറ്റ് ചെയ്യുന്നു.
ready()-ന് മുമ്പ് സുരക്ഷിതം. ഇത് ഒരു സുബോധമുള്ള ഡിഫോൾട്ട് സ്നാപ്പ്ഷോട്ട് നൽകുന്നു. SDK ആരംഭിച്ചിട്ടില്ലെങ്കിൽ എറിയുക.- ആവശ്യമായത് വേഴ്സസ് യഥാർത്ഥമാണ്. ഇതിനായി
getState().enabledഉപയോഗിക്കുന്നത് തുടരുക നിങ്ങളുടെ ആപ്പിൻ്റെ ഉദ്ദേശം; OS ആണോ എന്ന് പരിശോധിക്കാൻgetForegroundServiceHealth()ഉപയോഗിക്കുക ആ ഉദ്ദേശ്യത്തെ മാനിക്കുന്നു.