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

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

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

समस्या हल करने से पहले

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

अगर फ़ोरग्राउंड सेवाओं का इस्तेमाल सही तरीके से नहीं किया जाता है, तो डिवाइस की परफ़ॉर्मेंस और बैटरी लाइफ़ पर बुरा असर पड़ सकता है. इस वजह से, 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() कॉल करती हों.

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 मिल सकता है.

ठीक करें:

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