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

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