फ़ोरग्राउंड सेवा के लिए टाइम आउट

अगर कोई ऐप्लिकेशन 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]"

इस बदलाव की वजह से होने वाली समस्याओं से बचने के लिए, इनमें से एक या इससे ज़्यादा काम किए जा सकते हैं:

  1. आपकी सेवा में, Service.onTimeout(int, int) का नया तरीका लागू किया गया हो. जब आपके ऐप्लिकेशन को कॉलबैक मिलता है, तो पक्का करें कि आपने कुछ सेकंड में stopSelf() को कॉल किया हो. (अगर आपने ऐप्लिकेशन को तुरंत बंद नहीं किया, तो सिस्टम एक गड़बड़ी जनरेट करेगा.)
  2. पक्का करें कि आपके ऐप्लिकेशन की dataSync और mediaProcessing सेवाएं, 24 घंटे की अवधि में कुल छह घंटे से ज़्यादा न चलें. हालांकि, अगर उपयोगकर्ता ऐप्लिकेशन के साथ इंटरैक्ट करता है, तो टाइमर रीसेट हो जाता है.
  3. उपयोगकर्ता के सीधे इंटरैक्शन के बाद ही, dataSync या mediaProcessing फ़ोरग्राउंड सेवाओं को शुरू करें. सेवा शुरू होने पर, आपका ऐप्लिकेशन फ़ोरग्राउंड में होता है. इसलिए, ऐप्लिकेशन के बैकग्राउंड में जाने के बाद, आपकी सेवा के पास पूरे छह घंटे होते हैं.
  4. इन फ़ोरग्राउंड सेवाओं का इस्तेमाल करने के बजाय, WorkManager जैसे अन्य एपीआई का इस्तेमाल करें. खास तौर पर, dataSyncफ़ोरग्राउंड सेवा का इस्तेमाल करने के बजाय, अन्य एपीआई का इस्तेमाल करें.

अगर आपके ऐप्लिकेशन की dataSync फ़ोरग्राउंड सेवाएं पिछले 24 घंटों में छह घंटे तक चली हैं, तो आपके पास दूसरी dataSync फ़ोरग्राउंड सेवा शुरू करने का विकल्प नहीं है. हालांकि, अगर उपयोगकर्ता ने आपके ऐप्लिकेशन को फ़ोरग्राउंड में लाया है, तो आपके पास दूसरी dataSync फ़ोरग्राउंड सेवा शुरू करने का विकल्प है. ऐसा करने से, टाइमर रीसेट हो जाता है. अगर आपने कोई दूसरी dataSync फ़ोरग्राउंड सेवा शुरू करने की कोशिश की, तो सिस्टम ForegroundServiceStartNotAllowedException दिखाएगा. साथ ही, आपको गड़बड़ी का यह मैसेज दिखेगा: "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