इस पेज पर, फ़ोरग्राउंड सेवाओं के काम न करने की कुछ सामान्य वजहों के बारे में बताया गया है. साथ ही, यह भी बताया गया है कि समस्या किस वजह से हो रही है.
इस दस्तावेज़ में इन समस्याओं के बारे में बताया गया है:
समस्या हल करने से पहले
फ़ोरग्राउंड सेवाओं में हाल ही में किए गए बदलावों की जांच करना
अगर फ़ोरग्राउंड सेवाओं का गलत तरीके से इस्तेमाल किया जाता है, तो इनसे डिवाइस की परफ़ॉर्मेंस और बैटरी लाइफ़ पर बुरा असर पड़ सकता है. इसलिए, Android प्लैटफ़ॉर्म की रिलीज़ में अक्सर फ़ोरग्राउंड सेवा के व्यवहार में बदलाव किए जाते हैं, ताकि इन बुरे असर को कम किया जा सके.
अगर आपको फ़ोरग्राउंड सेवाओं से जुड़ी कोई समस्या आ रही है, तो आपको फ़ोरग्राउंड सेवाओं में हुए बदलावों के दस्तावेज़ को देखना चाहिए. साथ ही, यह देखना चाहिए कि हाल ही में कोई ऐसा बदलाव तो नहीं हुआ है जिसकी वजह से आपको समस्याएं आ रही हैं. इन स्थितियों में बदलावों की जांच करना ज़रूरी है:
- फ़ोरग्राउंड सेवा का वह कोड जो पहले काम करता था, अब काम नहीं कर रहा है
- आपने हाल ही में किसी नए प्लैटफ़ॉर्म के रिलीज़ पर टेस्टिंग शुरू की है या आपने अपने ऐप्लिकेशन के टारगेट किए गए एपीआई लेवल में बदलाव किया है
इसके अलावा, अगर आपने अपने डिवाइस पर प्लैटफ़ॉर्म के डेवलपर प्रीव्यू का इस्तेमाल करके टेस्ट किया है, तो डेवलपर प्रीव्यू के दस्तावेज़ का सबसे नया वर्शन देखना न भूलें.
ऐप्लिकेशन काम नहीं कर रहा है (ANR) वाली गड़बड़ियां
कुछ मामलों में, ऐप्लिकेशन को अपनी फ़ोरग्राउंड सेवा बंद करनी पड़ सकती है. अगर ऐप्लिकेशन, सेवा को बंद नहीं करता है, तो सिस्टम सेवा को बंद कर देता है और ऐप्लिकेशन काम नहीं कर रहा है (ANR) वाली गड़बड़ी को ट्रिगर करता है.
छोटी सेवा बहुत ज़्यादा समय तक चलती है, जिसकी वजह से एएनआर होता है
कम समय के लिए चलने वाली सेवा टाइप का इस्तेमाल करने वाली फ़ोरग्राउंड सेवाओं को तीन मिनट के अंदर पूरा करना होगा. समय खत्म होने पर, सिस्टम सेवा के Service.onTimeout(int,int)
तरीके को कॉल करता है. सेवा के पास stopSelf()
को कॉल करने के लिए कुछ सेकंड होते हैं. अगर सेवा अपने-आप बंद नहीं होती है, तो सिस्टम 'ऐप्लिकेशन काम नहीं कर रहा है' गड़बड़ी को ट्रिगर करता है.
गड़बड़ी का पता लगाना:
अगर ANR की वजह यह है कि कोई फ़ोरग्राउंड सेवा अपने-आप बंद नहीं हो पा रही है, तो सिस्टम एक इंटरनल अपवाद दिखाता है. 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
दिख सकता है.
- अगर आपने ज़रूरी अनुमतियों का अनुरोध किया है, लेकिन ज़रूरी अनुमतियां मिलने की पुष्टि करने से पहले ही फ़ोरग्राउंड सेवा शुरू कर दी है, तो आपको
ठीक करें:
फ़ोरग्राउंड सेवा लॉन्च करने से पहले, फ़ोरग्राउंड सेवा से जुड़ी सभी ज़रूरी अनुमतियों का अनुरोध करें. साथ ही, पक्का करें कि आपने रनटाइम से जुड़ी सभी ज़रूरी शर्तें पूरी कर ली हों.