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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • आपका ऐप्लिकेशन, कंपैनियन डिवाइस मैनेजर का इस्तेमाल करता है. साथ ही, 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