फ़ोरग्राउंड सेवाओं से जुड़ी समस्या हल करना

इस पेज पर, फ़ोरग्राउंड सेवाओं के काम न करने की कुछ सामान्य वजहों के बारे में बताया गया है. साथ ही, समस्या की वजह का पता लगाने में आपकी मदद की गई है.

इस दस्तावेज़ में इन समस्याओं के बारे में बताया गया है:

समस्या हल करने की प्रोसेस शुरू करने से पहले ज़रूरी बातों की जांच करना

फ़ोरग्राउंड सेवाओं में हाल ही में हुए बदलावों की जांच करना

अगर फ़ोरग्राउंड सेवाओं का गलत तरीके से इस्तेमाल किया जाता है, तो इससे डिवाइस की परफ़ॉर्मेंस और बैटरी लाइफ़ पर बुरा असर पड़ सकता है. इस वजह से, Android प्लैटफ़ॉर्म के रिलीज़ में अक्सर फ़ोरग्राउंड सेवा के व्यवहार में बदलाव किए जाते हैं, ताकि इन बुरे असर को कम किया जा सके.

अगर आपको फ़ोरग्राउंड सेवाओं से जुड़ी कोई समस्या आ रही है, तो फ़ोरग्राउंड सेवाओं में किए गए बदलावों से जुड़ा दस्तावेज़ देखें. इससे आपको पता चलेगा कि हाल ही में किए गए किसी बदलाव की वजह से तो आपको समस्या नहीं आ रही है. इन स्थितियों में, बदलावों की जांच करना खास तौर पर ज़रूरी है:

  • फ़ोरग्राउंड सेवा का कोड पहले काम करता था, लेकिन अब काम नहीं कर रहा है
  • आपने किसी नए प्लैटफ़ॉर्म रिलीज़ पर टेस्टिंग शुरू की है या आपने अपने ऐप्लिकेशन के टारगेट एपीआई लेवल में बदलाव किया है

इसके अलावा, अगर प्लैटफ़ॉर्म के डेवलपर के लिए झलक वाले वर्शन पर अपने डिवाइस की जांच की जा रही है, तो डेवलपर के लिए झलक वाले वर्शन के दस्तावेज़ का सबसे नया वर्शन ज़रूर देखें.

ऐप्लिकेशन काम नहीं कर रहा है (एएनआर) वाली गड़बड़ियां

कुछ मामलों में, ऐप्लिकेशन को अपनी फ़ोरग्राउंड सेवा बंद करनी पड़ सकती है. अगर ऐप्लिकेशन, सेवा को बंद नहीं करता है, तो सिस्टम सेवा को बंद कर देता है और ऐप्लिकेशन काम नहीं कर रहा है (एएनआर) वाली गड़बड़ी को ट्रिगर करता है.

कम समय वाली सेवा बहुत ज़्यादा समय तक चलती है, जिससे एएनआर की समस्या आती है

कम समय वाली सेवा टाइप का इस्तेमाल करने वाली फ़ोरग्राउंड सेवाओं को करीब तीन मिनट में पूरा होना चाहिए. समय खत्म होने पर, सिस्टम सेवा के Service.onTimeout(int,int) तरीके को कॉल करता है. सेवा के पास stopSelf() को कॉल करने के लिए कुछ सेकंड हैं. अगर सेवा अपने-आप बंद नहीं होती है, तो सिस्टम, ऐप्लिकेशन काम नहीं कर रहा है वाली गड़बड़ी ट्रिगर करता है.

विश्लेषण करना:

अगर ANR की गड़बड़ी, फ़ोरग्राउंड सेवा के खुद बंद न होने की वजह से हुई है, तो सिस्टम एक इंटरनल एक्सेप्शन दिखाता है. एएनआर रिपोर्ट देखकर, यह पुष्टि की जा सकती है कि समस्या यही थी. अगर यह समस्या है, तो रिपोर्ट में यह मैसेज शामिल होगा:

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type FOREGROUND_SERVICE_TYPE_SHORT_SERVICE did not stop within its timeout:
[component name]"

समस्या को ठीक करने का तरीका:

पक्का करें कि समयसीमा वाली सभी फ़ोरग्राउंड सेवाएं अपना काम पूरा कर लें और सिस्टम की समयसीमा के अंदर stopForeground(int) को कॉल करें.

अपनी फ़ोरग्राउंड सेवाओं में Service.onTimeout(int,int) लागू करें. पक्का करें कि आपने इस तरीके को इस तरह से लागू किया हो कि stopSelf() को तुरंत कॉल किया जा सके.

फ़ोरग्राउंड सेवा के अपवाद

इस सेक्शन में, फ़ोरग्राउंड सेवा से जुड़ी कई समस्याओं के बारे में बताया गया है. इनकी वजह से, सिस्टम में गड़बड़ी हो सकती है. अगर ऐप्लिकेशन अपवाद को नहीं पकड़ता है, तो उपयोगकर्ता को एक डायलॉग दिखता है. इसमें बताया जाता है कि ऐप्लिकेशन बंद हो गया है.

कुछ मामलों में, सिस्टम में कोई गड़बड़ी हो सकती है. ऐसे मामलों में, स्टैक ट्रेस में देखकर पता लगाया जा सकता है कि अपवाद क्या था. साथ ही, गड़बड़ी के बारे में ज़्यादा जानकारी पाने के लिए, Logcat देखा जा सकता है.

इंटरनल गड़बड़ी: समयसीमा खत्म हो गई

सिस्टम यह तय करता है कि ऐप्लिकेशन के बैकग्राउंड में होने पर, डेटा सिंक करने और मीडिया प्रोसेस करने वाली फ़ोरग्राउंड सेवाएं कितने समय तक चल सकती हैं. अगर सेवा उस सीमा से ज़्यादा मेमोरी का इस्तेमाल करती है, तो सिस्टम सेवा के Service.onTimeout(int,int) तरीके को कॉल करता है. सेवा के पास stopSelf() को कॉल करने के लिए कुछ सेकंड होते हैं. अगर सेवा खुद बंद नहीं होती है, तो सिस्टम एक इंटरनल RemoteServiceException जनरेट करता है. इसकी वजह से, ऐप्लिकेशन क्रैश हो जाता है.

विश्लेषण करना:

स्टैक ट्रेस में देखकर, यह पता लगाया जा सकता है कि अपवाद क्या था. साथ ही, गड़बड़ी के बारे में ज़्यादा जानकारी पाने के लिए, Logcat को देखा जा सकता है. इस मामले में, Logcat में गड़बड़ी का यह मैसेज दिखता है:

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"

समस्या को ठीक करने का तरीका:

पक्का करें कि तय समयसीमा वाली सभी फ़ोरग्राउंड सेवाएं अपना काम पूरा कर लें और सिस्टम की तय समयसीमा के अंदर stopForeground(int) को कॉल करें.

अपनी फ़ोरग्राउंड सेवाओं में Service.onTimeout(int,int) लागू करें. पक्का करें कि आपने इस तरीके को इस तरह से लागू किया हो कि stopSelf() को तुरंत कॉल किया जा सके.

इंटरनल अपवाद: ForegroundServiceDidNotStartInTimeException

context.startForegroundService() को कॉल करके कोई सेवा लॉन्च करने पर, उस सेवा के पास खुद को फ़ोरग्राउंड सेवा के तौर पर प्रमोट करने के लिए कुछ सेकंड होते हैं. इसके लिए, उसे ServiceCompat.startForeground() को कॉल करना होता है. अगर सेवा ऐसा नहीं करती है, तो इंटरनल ForegroundServiceDidNotStartInTimeException गड़बड़ी दिखती है.

विश्लेषण करना:

स्टैक ट्रेस में देखकर, यह पता लगाया जा सकता है कि अपवाद क्या था. साथ ही, गड़बड़ी के बारे में ज़्यादा जानकारी पाने के लिए, Logcat को देखा जा सकता है. इस मामले में, Logcat में गड़बड़ी का यह मैसेज दिखता है:

android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException:
Context.startForegroundService() did not then call Service.startForeground()

ठीक करने का तरीका:

पक्का करें कि नई बनाई गई सभी फ़ोरग्राउंड सेवाएं, कुछ सेकंड के अंदर ServiceCompat.startForeground() को कॉल करें.

WorkManager:

आपको यह अपवाद उन WorkManager वर्कर के साथ भी दिख सकता है जो फ़ोरग्राउंड सेवा को एक्ज़ीक्यूट करते हैं (setForegound या setForegroundAsync को कॉल करें). जब दो फ़ोरग्राउंड वर्कर का लाइफ़साइकल ओवरलैप होता है, तो एक वर्कर फ़ोरग्राउंड सेवा शुरू करने की कोशिश करता है, जबकि पहले से चल रही फ़ोरग्राउंड सेवा बंद होने की कोशिश करती है. इस क्रैश के साथ यह लॉग भी दिखेगा:

Re-initializing SystemForegroundService after a request to shut-down

इस क्रैश को ठीक करने की सुविधा, WorkManager के वर्शन 2.10.5 में जोड़ी गई थी.

अगर आपके ऐप्लिकेशन में यह अपवाद दिख रहा है, तो WorkManager को सबसे नए वर्शन पर अपडेट करें. साथ ही, WorkManager के समस्या ट्रैकर पर जाकर, लगातार आ रही समस्याओं की शिकायत करें.

ForegroundServiceStartNotAllowedException

गड़बड़ी:

सिस्टम ForegroundServiceStartNotAllowedException दिखाता है.

वजह:

आम तौर पर, ऐसा तब होता है, जब ऐप्लिकेशन बैकग्राउंड से फ़ोरग्राउंड सेवा लॉन्च करता है और इसके लिए कोई मान्य छूट नहीं होती.

Android 12 (एपीआई लेवल 31) से, ऐप्लिकेशन को बैकग्राउंड में चलने के दौरान फ़ोरग्राउंड सेवाएं शुरू करने की अनुमति नहीं है. हालांकि, कुछ मामलों में छूट दी गई है. अगर बैकग्राउंड से फ़ोरग्राउंड सेवा शुरू करने की कोशिश की जाती है और छूट की किसी भी शर्त को पूरा नहीं किया जाता है, तो सिस्टम ForegroundServiceStartNotAllowedException दिखाता है. अगर छूट पाने की ज़रूरी शर्तें पूरी नहीं की जाती हैं, तो सिस्टम ऐसा करता है.

उदाहरण के लिए, किसी ऐप्लिकेशन में ऐसा बटन हो सकता है जिस पर क्लिक करने से ऐप्लिकेशन कुछ प्रोसेसिंग करता है और फिर फ़ोरग्राउंड सेवा लॉन्च करता है. इस मामले में, ऐसा हो सकता है कि उपयोगकर्ता बटन पर क्लिक करे और फिर तुरंत ऐप्लिकेशन को बैकग्राउंड में डाल दे. इसके बाद, ऐप्लिकेशन बैकग्राउंड से सेवा को लॉन्च करने की कोशिश करेगा. अगर ऐप्लिकेशन, तय की गई किसी भी छूट को पूरा नहीं करता है, तो सिस्टम ForegroundServiceStartNotAllowedException दिखाता है.

इसके अलावा, कुछ छूट की समयसीमा कम होती है. उदाहरण के लिए, अगर आपका ऐप्लिकेशन, ज़्यादा प्राथमिकता वाले FCM मैसेज के जवाब में फ़ोरग्राउंड सेवा लॉन्च करता है, तो उसे कुछ समय के लिए छूट मिलती है. अगर आपने सेवा को तुरंत लॉन्च नहीं किया, तो आपको ForegroundServiceStartNotAllowedException मिलेगा.

Android के नए वर्शन के साथ, कुछ खास मामलों में मिलने वाली छूट पर कभी-कभी ज़्यादा पाबंदियां लग जाती हैं. अगर आपने Android के उस वर्शन को बदल दिया है जिसे आपका ऐप्लिकेशन टारगेट कर रहा है, तो फ़ोरग्राउंड सेवाओं में हुए बदलावों से जुड़ा दस्तावेज़ देखें. साथ ही, पुष्टि करें कि आपका ऐप्लिकेशन अब भी छूट की ज़रूरी शर्तों में से किसी एक को पूरा करता है.

समस्या को ठीक करने का तरीका:

अपने ऐप्लिकेशन के वर्कफ़्लो में बदलाव करें, ताकि ऐप्लिकेशन के बैकग्राउंड में होने पर उसे फ़ोरग्राउंड सेवाएं लॉन्च करने की ज़रूरत न पड़े. इसके अलावा, यह पुष्टि करें कि आपका ऐप्लिकेशन, छूट की शर्तों में से किसी एक को पूरा करता हो.

अपने ऐप्लिकेशन की लाइफ़साइकल को मैनेज करने के लिए, लाइफ़साइकल के बारे में जानकारी देने वाले कॉम्पोनेंट इस्तेमाल किए जा सकते हैं. इससे, बैकग्राउंड से फ़ोरग्राउंड सेवा को गलती से लॉन्च करने से बचा जा सकता है.

SecurityException

गड़बड़ी:

सिस्टम थ्रोSecurityException.

वजह:

आपके ऐप्लिकेशन ने ज़रूरी अनुमतियां लिए बिना, फ़ोरग्राउंड सेवा लॉन्च करने की कोशिश की.

  • अगर कोई ऐप्लिकेशन Android 9 (एपीआई लेवल 28) या इसके बाद के वर्शन को टारगेट करता है, तो उसके पास फ़ोरग्राउंड सेवा लॉन्च करने के लिए, FOREGROUND_SERVICE की अनुमति होनी चाहिए.
  • अगर कोई ऐप्लिकेशन, Android 14 (एपीआई लेवल 34) या इसके बाद के वर्शन को टारगेट करता है, तो उसे फ़ोरग्राउंड सेवा के टाइप से जुड़ी सभी ज़रूरी शर्तें पूरी करनी होंगी. इन ज़रूरी शर्तों के बारे में, फ़ोरग्राउंड सेवा के टाइप से जुड़े दस्तावेज़ में ज़्यादा जानकारी दी गई है. खास तौर पर, इन ज़रूरी शर्तों के बारे में जानकारी रखें:
    • फ़ोरग्राउंड सेवा के कई टाइप के लिए, रनटाइम की खास अनुमतियों की ज़रूरत होती है. उदाहरण के लिए, रिमोट मैसेजिंग फ़ोरग्राउंड सेवा के लिए, FOREGROUND_SERVICE_REMOTE_MESSAGING अनुमति ज़रूरी है.
  • कई मामलों में, फ़ोरग्राउंड सेवा के कुछ टाइप के लिए ज़रूरी अनुमतियों पर, इस्तेमाल के दौरान अतिरिक्त पाबंदियां लागू होती हैं. ये अनुमतियां ऐप्लिकेशन को सिर्फ़ तब दी जाती हैं, जब ऐप्लिकेशन फ़ोरग्राउंड में हो. हालांकि, कुछ मामलों में ऐसा नहीं होता. इसका मतलब है कि भले ही आपके ऐप्लिकेशन ने इनमें से किसी अनुमति का अनुरोध किया हो और उसे अनुमति मिल गई हो, लेकिन अगर ऐप्लिकेशन बैकग्राउंड में होने के दौरान फ़ोरग्राउंड सेवा लॉन्च करने की कोशिश करता है, तो सिस्टम SecurityException दिखाएगा. भले ही, ऐप्लिकेशन को बैकग्राउंड से फ़ोरग्राउंड सेवा शुरू करने की छूट मिली हो. ज़्यादा जानकारी के लिए, ऐप्लिकेशन इस्तेमाल करते समय दी जाने वाली अनुमतियों की ज़रूरत वाली फ़ोरग्राउंड सेवाओं को शुरू करने से जुड़ी पाबंदियां लेख पढ़ें.
    • अगर आपने ज़रूरी अनुमतियों का अनुरोध किया है, लेकिन ज़रूरी अनुमतियां मिलने की पुष्टि करने से पहले ही फ़ोरग्राउंड सेवा शुरू कर दी है, तो आपको SecurityException मिल सकता है.

समस्या को ठीक करने का तरीका:

फ़ोरग्राउंड सेवा लॉन्च करने से पहले, फ़ोरग्राउंड सेवा से जुड़ी सभी ज़रूरी अनुमतियों का अनुरोध करें. साथ ही, पुष्टि करें कि आपने रनटाइम से जुड़ी अन्य सभी ज़रूरी शर्तें पूरी कर ली हैं.