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

अगर कोई ऐप्लिकेशन 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 फ़ोरग्राउंड सेवा शुरू करने की कोशिश की जाती है, तो सिस्टम 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