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

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

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

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

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

  • आपका ऐप्लिकेशन, उपयोगकर्ता को दिखने वाली स्थिति से ट्रांज़िशन करता है. जैसे, गतिविधि.
  • आपका ऐप्लिकेशन, बैकग्राउंड से कोई गतिविधि शुरू कर सकता है. हालांकि, ऐसा तब नहीं किया जा सकता, जब ऐप्लिकेशन के पास मौजूदा टास्क के बैक स्टैक में कोई गतिविधि हो.
  • आपका ऐप्लिकेशन, Firebase Cloud Messaging का इस्तेमाल करके, ज़्यादा प्राथमिकता वाला मैसेज पाता है.

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

  • आपका ऐप्लिकेशन, उपयोगकर्ता के अनुरोध पर कोई कार्रवाई पूरी करने के लिए एग्ज़ैक्ट अलार्म चालू करता है.

  • आपका ऐप्लिकेशन, डिवाइस का मौजूदा इनपुट मेथड है.

  • आपके ऐप्लिकेशन को जियोफ़ेंसिंग या गतिविधि पहचानने की सुविधा के ट्रांज़िशन से जुड़ा कोई इवेंट मिलता है.

  • डिवाइस रीबूट होने के बाद, ब्रॉडकास्ट रिसीवर में ACTION_BOOT_COMPLETED, ACTION_LOCKED_BOOT_COMPLETED या ACTION_MY_PACKAGE_REPLACED इंटेंट ऐक्शन मिलता है.

  • आपके ऐप्लिकेशन को ब्रॉडकास्ट रिसीवर में ACTION_TIMEZONE_CHANGED, ACTION_TIME_CHANGED या ACTION_LOCALE_CHANGED इंटेंट ऐक्शन मिलता है.

  • आपके ऐप्लिकेशन को NfcService से ACTION_TRANSACTION_DETECTED इवेंट मिलता है.

  • कुछ सिस्टम भूमिकाओं या अनुमतियों वाले ऐप्लिकेशन, जैसे कि डिवाइस के मालिक और प्रोफ़ाइल के मालिक.

  • आपका ऐप्लिकेशन, Companion Device Manager का इस्तेमाल करता है और REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND या REQUEST_COMPANION_RUN_IN_BACKGROUND अनुमति का एलान करता है. जब भी मुमकिन हो, REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND का इस्तेमाल करें.

  • जब उपयोगकर्ता आपके ऐप्लिकेशन के लिए बैटरी ऑप्टिमाइज़ेशन की सुविधा बंद कर देता है.

  • आपके ऐप्लिकेशन के पास SYSTEM_ALERT_WINDOW अनुमति है. ध्यान दें: अगर आपका ऐप्लिकेशन, Android 15 या उसके बाद के वर्शन को टारगेट करता है, तो उसके पास SYSTEM_ALERT_WINDOW अनुमति होनी चाहिए और ऐप्लिकेशन में फ़िलहाल दिखने वाली ओवरले विंडो होनी चाहिए.

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

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

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

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

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