बैकग्राउंड से फ़ोरग्राउंड सेवा शुरू करने पर पाबंदियां

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

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

बैकग्राउंड में सेवा शुरू करने से जुड़ी पाबंदियों से छूट

यहां बताई गई स्थितियों में, आपका ऐप्लिकेशन बैकग्राउंड में चलते समय भी फ़ोरग्राउंड सेवाएं शुरू कर सकता है:

इस्तेमाल के दौरान की अनुमतियों की ज़रूरत वाली फ़ोरग्राउंड सेवाओं को शुरू करने से जुड़ी पाबंदियां

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

अगर आपका ऐप्लिकेशन, Android 14 या इसके बाद के वर्शन को टारगेट करता है, तो ऑपरेटिंग सिस्टम, फ़ोरग्राउंड सेवा बनाते समय यह जांच करता है कि आपके ऐप्लिकेशन के पास, उस सेवा के टाइप के लिए सभी ज़रूरी अनुमतियां हैं या नहीं. उदाहरण के लिए, जब माइक्रोफ़ोन टाइप की फ़ोरग्राउंड सेवा बनाई जाती है, तो ऑपरेटिंग सिस्टम यह पुष्टि करता है कि आपके ऐप्लिकेशन के पास फ़िलहाल अनुमति है या नहीं.RECORD_AUDIO अगर आपके पास वह अनुमति नहीं है, तो सिस्टम a SecurityException दिखाता है.

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

इसी तरह, अगर आपका ऐप्लिकेशन बैकग्राउंड में है और वह सेहत से जुड़ी कोई ऐसी सेवा बनाता है जिसके लिए BODY_SENSORS अनुमति की ज़रूरत होती है, तो ऐप्लिकेशन के पास फ़िलहाल वह अनुमति नहीं होती. इसके बाद, सिस्टम एक अपवाद दिखाता है. (यह तब लागू नहीं होता, जब वह सेहत से जुड़ी कोई ऐसी सेवा हो जिसके लिए अलग-अलग अनुमतियों की ज़रूरत होती है, जैसे ACTIVITY_RECOGNITION.) Calling PermissionChecker.checkSelfPermission() को कॉल करने से, इस समस्या को नहीं रोका जा सकता. अगर आपके ऐप्लिकेशन के पास इस्तेमाल के दौरान की अनुमति है और वह यह देखने के लिए checkSelfPermission() को कॉल करता है कि उसके पास वह अनुमति है या नहीं, तो ऐप्लिकेशन के बैकग्राउंड में होने पर भी, यह तरीका PERMISSION_GRANTED दिखाता है. जब यह तरीका PERMISSION_GRANTED दिखाता है, तो इसका मतलब है कि "आपके ऐप्लिकेशन के पास यह अनुमति तब होती है, जब ऐप्लिकेशन का इस्तेमाल किया जा रहा हो."

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

इस्तेमाल के दौरान की अनुमतियों से जुड़ी पाबंदियों से छूट

कुछ स्थितियों में, अगर कोई फ़ोरग्राउंड सेवा, ऐप्लिकेशन के बैकग्राउंड में चलते समय शुरू की जाती है, तब भी वह ऐप्लिकेशन के फ़ोरग्राउंड में चलते समय ("इस्तेमाल के दौरान") जगह की जानकारी, कैमरे, और माइक्रोफ़ोन की जानकारी को ऐक्सेस कर सकती है.

इन्हीं स्थितियों में, अगर सेवा फ़ोरग्राउंड सेवा के location टाइप का एलान करती है और उसे ACCESS_BACKGROUND_LOCATION अनुमति वाले किसी ऐप्लिकेशन से शुरू किया जाता है, तो यह सेवा हर समय जगह की जानकारी को ऐक्सेस कर सकती है. ऐसा तब भी किया जा सकता है, जब ऐप्लिकेशन बैकग्राउंड में चल रहा हो.

यहां दी गई सूची में, ये स्थितियां शामिल हैं:

  • कोई सिस्टम कॉम्पोनेंट, सेवा शुरू करता है.
  • ऐप्लिकेशन विजेट के साथ इंटरैक्ट करके, सेवा शुरू की जाती है.
  • किसी सूचना के साथ इंटरैक्ट करके, सेवा शुरू की जाती है.
  • सेवा, PendingIntent के तौर पर शुरू होती है. इसे किसी दूसरे, दिखने वाले ऐप्लिकेशन से भेजा जाता है.
  • सेवा, किसी ऐसे ऐप्लिकेशन से शुरू होती है जो डिवाइस नीति कंट्रोलर है और डिवाइस के मालिक वाले मोड में चलता है.
  • सेवा, VoiceInteractionService उपलब्ध कराने वाले किसी ऐप्लिकेशन से शुरू होती है.
  • सेवा, किसी ऐसे ऐप्लिकेशन से शुरू होती है जिसके पास START_ACTIVITIES_FROM_BACKGROUND खास अनुमति होती है.

यह पता लगाना कि आपके ऐप्लिकेशन में कौनसी सेवाएं प्रभावित हुई हैं

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

Foreground service started from background can not have \
location/camera/microphone access: service SERVICE_NAME