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

अगर कोई ऐप्लिकेशन, Android 15 या उसके बाद के वर्शन को टारगेट करता है, तो सिस्टम इस पर पाबंदियां लगाता है कि ऐप्लिकेशन के बैकग्राउंड में चलने पर, कुछ फ़ोरग्राउंड सेवाओं को कितनी देर तक चलाने की अनुमति दी जाए. फ़िलहाल, यह पाबंदी सिर्फ़ dataSync और mediaProcessing फ़ोरग्राउंड सेवा का टाइप फ़ोरग्राउंड सेवाओं पर लागू होती है. shortService फ़ोरग्राउंड सेवा के टाइप के लिए, ज़्यादा पाबंदी वाली सीमाएं तय की गई हैं. इनके बारे में, इस सेवा के दस्तावेज़ में बताया गया है.

टाइम आउट का व्यवहार

सिस्टम, dataSync और mediaProcessing फ़ोरग्राउंड सेवाओं को 24 घंटे में कुल छह घंटे तक चलने की अनुमति देता है. इसके बाद, सिस्टम चल रही सेवा के Service.onTimeout(int, int) तरीके को कॉल करता है. इस तरीके को Android 15 में लॉन्च किया गया था. (mediaProcessing फ़ोरग्राउंड सेवा का टाइप, Android 15 में जोड़ा गया था.) छह घंटे की समयसीमा को dataSync और mediaProcessing सेवाओं के लिए अलग-अलग ट्रैक किया जाता है. उदाहरण के लिए, अगर dataSync सेवा सिर्फ़ एक घंटे के लिए चलती है, तो ऐप्लिकेशन में mediaProcessing की फ़ोरग्राउंड सेवाओं के लिए सिर्फ़ पांच घंटे उपलब्ध होंगे. हालांकि, dataSync की सेवाओं के लिए पूरे छह घंटे उपलब्ध रहेंगे.

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

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