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

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

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

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

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

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

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

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

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

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

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

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

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

गड़बड़ी का पता लगाना:

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

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() को कॉल करने के लिए कुछ सेकंड होते हैं. अगर सेवा अपने-आप बंद नहीं होती है, तो सिस्टम एक इंटरनल अपवाद जनरेट करता है. इसकी वजह से, ऐप्लिकेशन क्रैश हो जाता है.

गड़बड़ी का पता लगाना:

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

गड़बड़ी का पता लगाना:

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

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

ठीक करें:

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

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

SecurityException

गड़बड़ी:

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

वजह:

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

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

ठीक करें:

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