अगर कोई ऐप्लिकेशन, Android 15 या इसके बाद के वर्शन को टारगेट करता है, तो सिस्टम इस पर पाबंदी लगाता है कि बैकग्राउंड में होने पर, आपका ऐप्लिकेशन फ़ोरग्राउंड सेवाओं को कितने समय तक चला सकता है. फ़िलहाल, यह पाबंदी सिर्फ़
dataSync और
mediaProcessing टाइप वाली फ़ोरग्राउंड सेवाओं पर लागू होती है. shortService टाइप वाली फ़ोरग्राउंड
सेवाओं पर ज़्यादा पाबंदियां लागू होती हैं. इनके बारे में, उस सेवा के टाइप के दस्तावेज़ में बताया गया है.
टाइम आउट होने पर होने वाली कार्रवाई
सिस्टम, dataSync और mediaProcessing टाइप वाली फ़ोरग्राउंड सेवाओं को 24 घंटे में कुल छह घंटे तक चलाने की अनुमति देता है. इसके बाद, सिस्टम, चालू सेवा के Service.onTimeout(int, int) तरीके को कॉल करता है. यह तरीका Android 15 में जोड़ा गया है. (mediaProcessing टाइप वाली फ़ोरग्राउंड सेवा को Android 15 में जोड़ा गया है.) dataSync और mediaProcessing सेवाओं के लिए, छह घंटे की समयसीमा को अलग-अलग ट्रैक किया जाता है. उदाहरण के लिए, अगर dataSync सेवा सिर्फ़ एक घंटे के लिए चली है, तो ऐप्लिकेशन के पास dataSync टाइप वाली फ़ोरग्राउंड सेवाओं के लिए सिर्फ़ पांच घंटे बचे होंगे. हालांकि, mediaProcessing सेवाओं के लिए, उसके पास पूरे छह घंटे बचे होंगे.
जब कोई फ़ोरग्राउंड सेवा, छह घंटे की समयसीमा पर पहुंच जाती है, तो उसके पास कुछ
सेकंड होते हैं Service.stopSelf() को कॉल करने के लिए. जब सिस्टम, Service.onTimeout() को कॉल करता है, तो सेवा को फ़ोरग्राउंड सेवा नहीं माना जाता.
अगर सेवा, Service.stopSelf() को कॉल नहीं करती है, तो सिस्टम एक इंटरनल अपवाद दिखाता है. अपवाद को Logcat में, इस
मैसेज के साथ लॉग किया जाता है:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"
इस बदलाव की वजह से होने वाली समस्याओं से बचने के लिए, इनमें से एक या एक से ज़्यादा काम किए जा सकते हैं:
- अपनी सेवा में,
Service.onTimeout(int, int)का नया तरीका लागू करें. जब आपके ऐप्लिकेशन को कॉलबैक मिलता है, तो पक्का करें कि कुछ सेकंड के अंदरstopSelf()को कॉल किया जाए. (अगर आपने ऐप्लिकेशन को तुरंत बंद नहीं किया, तो सिस्टम गड़बड़ी जनरेट करता है.) - पक्का करें कि आपके ऐप्लिकेशन की
dataSyncऔरmediaProcessingसेवाएं, किसी भी 24 घंटे की अवधि में कुल छह घंटे से ज़्यादा न चलें. ऐसा तब तक होना चाहिए, जब तक उपयोगकर्ता ऐप्लिकेशन के साथ इंटरैक्ट न करे. ऐसा करने पर, टाइमर रीसेट हो जाता है. dataSyncयाmediaProcessingटाइप वाली फ़ोरग्राउंड सेवाओं को सिर्फ़ उपयोगकर्ता के सीधे इंटरैक्शन के बाद शुरू करें. सेवा शुरू होने पर, आपका ऐप्लिकेशन फ़ोरग्राउंड में होता है. इसलिए, ऐप्लिकेशन के बैकग्राउंड में जाने के बाद, आपकी सेवा के पास पूरे छह घंटे होते हैं.- इन फ़ोरग्राउंड सेवाओं का इस्तेमाल करने के बजाय, WorkManager जैसे किसी अन्य वैकल्पिक
एपीआई का इस्तेमाल करें. खास तौर पर,
dataSyncटाइप वाली फ़ोरग्राउंड सेवा का इस्तेमाल करने के बजाय, किसी अन्य एपीआई का इस्तेमाल करें.
अगर आपके ऐप्लिकेशन की dataSync टाइप वाली फ़ोरग्राउंड सेवाएं, पिछले
24 घंटों में छह घंटे तक चली हैं, तो आपके पास dataSync टाइप वाली कोई दूसरी फ़ोरग्राउंड सेवा शुरू करने का विकल्प नहीं है. हालांकि, अगर उपयोगकर्ता ने आपके ऐप्लिकेशन को फ़ोरग्राउंड में लाया है, तो ऐसा किया जा सकता है. ऐसा करने पर, टाइमर रीसेट हो जाता है. अगर आपने कोई दूसरी dataSync फ़ोरग्राउंड सेवा शुरू करने की कोशिश की, तो सिस्टम ForegroundServiceStartNotAllowedException दिखाता है. साथ ही, "Time limit already exhausted for foreground service type dataSync" जैसा कोई गड़बड़ी का मैसेज दिखाता है.
जांच करना
अपने ऐप्लिकेशन के व्यवहार की जांच करने के लिए, डेटा सिंक के टाइम आउट को चालू किया जा सकता है. भले ही, आपका ऐप्लिकेशन Android 15 को टारगेट न कर रहा हो. हालांकि, यह सुविधा सिर्फ़ तब काम करेगी, जब ऐप्लिकेशन Android 15 वाले डिवाइस पर चल रहा हो. टाइम आउट चालू करने के लिए, यह adb कमांड चलाएं:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
टाइम आउट की अवधि को भी अडजस्ट किया जा सकता है, ताकि यह टेस्ट करना आसान हो जाए कि समयसीमा पूरी होने पर, आपका ऐप्लिकेशन कैसा काम करता है. dataSync टाइप वाली फ़ोरग्राउंड सेवाओं के लिए, टाइम आउट की नई अवधि सेट करने के लिए, यह adb कमांड चलाएं:
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
mediaProcessing टाइप वाली फ़ोरग्राउंड सेवाओं के लिए, टाइम आउट की नई अवधि सेट करने के लिए, यह कमांड चलाएं:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds