फ़ोरग्राउंड सेवाएं

फ़ोरग्राउंड सेवाएं ऐसी कार्रवाइयां करती हैं जो उपयोगकर्ताओं को दिखती हैं.

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

फ़ोरग्राउंड सेवाओं का इस्तेमाल करने वाले ऐप्लिकेशन के उदाहरणों में ये शामिल हैं:

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

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

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

उपयोगकर्ता डिफ़ॉल्ट रूप से सूचना को खारिज कर सकते हैं

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

अगर आपको उपयोगकर्ता को सूचना खारिज करने की अनुमति नहीं देनी है, तो Notification.Builder का इस्तेमाल करके सूचना बनाते समय, setOngoing() के तरीके में true पास करें.

ऐसी सेवाएं जो तुरंत सूचना दिखाती हैं

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

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

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

अपने मेनिफ़ेस्ट में फ़ोरग्राउंड सेवाओं की जानकारी देना

अपने ऐप्लिकेशन के मेनिफ़ेस्ट में, <service> एलिमेंट की मदद से, अपने ऐप्लिकेशन की हर फ़ोरग्राउंड सेवा के बारे में बताएं. हर सेवा के लिए, android:foregroundServiceType एट्रिब्यूट का इस्तेमाल करके बताएं कि सेवा किस तरह की है.

उदाहरण के लिए, अगर आपका ऐप्लिकेशन संगीत चलाने वाली फ़ोरग्राउंड सेवा बनाता है, तो सेवा का एलान इस तरह किया जा सकता है:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
  <application ...>

    <service
        android:name=".MyMediaPlaybackService"
        android:foregroundServiceType="mediaPlayback"
        android:exported="false">
    </service>
  </application>
</manifest>

अगर आपकी सेवा पर एक से ज़्यादा टाइप लागू होते हैं, तो उन्हें | ऑपरेटर से अलग करें. उदाहरण के लिए, कैमरे और माइक्रोफ़ोन का इस्तेमाल करने वाली सेवा, इस तरह एलान करेगी:

android:foregroundServiceType="camera|microphone"

फ़ोरग्राउंड सेवा की अनुमतियों का अनुरोध करना

Android 9 (एपीआई लेवल 28) या उसके बाद के वर्शन को टारगेट करने वाले और फ़ोरग्राउंड सेवाओं का इस्तेमाल करने वाले ऐप्लिकेशन को, ऐप्लिकेशन मेनिफ़ेस्ट में FOREGROUND_SERVICE के लिए अनुरोध करना होगा. इस बारे में यहां दिए गए कोड स्निपेट में बताया गया है. यह सामान्य अनुमति है, इसलिए सिस्टम, अनुरोध करने वाले ऐप्लिकेशन को अपने-आप यह अनुमति दे देता है.

इसके अलावा, अगर ऐप्लिकेशन एपीआई लेवल 34 या उसके बाद के वर्शन को टारगेट करता है, तो उसे फ़ोरग्राउंड सेवा के काम के हिसाब से, सही अनुमति का अनुरोध करना होगा. हर फ़ोरग्राउंड सेवा के टाइप के लिए, एक तरह की अनुमति होती है. उदाहरण के लिए, अगर कोई ऐप्लिकेशन कैमरे का इस्तेमाल करने वाली फ़ोरग्राउंड सेवा लॉन्च करता है, तो आपको FOREGROUND_SERVICE और FOREGROUND_SERVICE_CAMERA, दोनों अनुमतियों का अनुरोध करना होगा. ये सभी सामान्य अनुमतियां हैं. इसलिए, अगर ये मेनिफ़ेस्ट में दी गई हैं, तो सिस्टम उन्हें अपने-आप मंज़ूरी देता है.

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>

    <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_CAMERA"/>

    <application ...>
        ...
    </application>
</manifest>

फ़ोरग्राउंड सेवा के लिए ज़रूरी शर्तें

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

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

फ़ोरग्राउंड सेवा शुरू करना

किसी सेवा को फ़ोरग्राउंड सेवा के तौर पर चलाने का अनुरोध करने से पहले, खुद ही सेवा शुरू करें:

Kotlin

val intent = Intent(...) // Build the intent for the service
context.startForegroundService(intent)

Java

Context context = getApplicationContext();
Intent intent = new Intent(...); // Build the intent for the service
context.startForegroundService(intent);

आम तौर पर, सेवा के अंदर onStartCommand() में, फ़ोरग्राउंड में चलने का अनुरोध किया जा सकता है. ऐसा करने के लिए, ServiceCompat.startForeground() को कॉल करें. यह androidx-core 1.12 और उसके बाद के वर्शन में उपलब्ध है. इस तरीके में ये पैरामीटर इस्तेमाल किए जाते हैं:

  • सेवा
  • एक धनात्मक पूर्णांक, जो स्टेटस बार में सूचना की खास तौर पर पहचान करता है
  • Notification ऑब्जेक्ट
  • फ़ोरग्राउंड सेवा के टाइप, जिनसे यह पता चलता है कि सेवा क्या काम करती है

इस्तेमाल के खास उदाहरण के आधार पर, ये टाइप मेनिफ़ेस्ट में बताए गए टाइप का सबसेट हो सकते हैं. इसके बाद, अगर आपको सेवा के ज़्यादा टाइप जोड़ने हैं, तो startForeground() को फिर से कॉल करें.

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

यहां कैमरे के साथ काम करने वाली फ़ोरग्राउंड सेवा को लॉन्च करने का एक उदाहरण दिया गया है:

Kotlin

class MyCameraService: Service() {

  private fun startForeground() {
    // Before starting the service as foreground check that the app has the
    // appropriate runtime permissions. In this case, verify that the user has
    // granted the CAMERA permission.
    val cameraPermission =
            PermissionChecker.checkSelfPermission(this, Manifest.permission.CAMERA)
    if (cameraPermission != PermissionChecker.PERMISSION_GRANTED) {
        // Without camera permissions the service cannot run in the foreground
        // Consider informing user or updating your app UI if visible.
        stopSelf()
        return
    }

    try {
        val notification = NotificationCompat.Builder(this, "CHANNEL_ID")
            // Create the notification to display while the service is running
            .build()
        ServiceCompat.startForeground(
            /* service = */ this,
            /* id = */ 100, // Cannot be 0
            /* notification = */ notification,
            /* foregroundServiceType = */
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA
            } else {
                0
            },
        )
    } catch (e: Exception) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
                && e is ForegroundServiceStartNotAllowedException) {
            // App not in a valid state to start foreground service
            // (e.g. started from bg)
        }
        // ...
    }
  }
}

Java

public class MyCameraService extends Service {

    private void startForeground() {
        // Before starting the service as foreground check that the app has the
        // appropriate runtime permissions. In this case, verify that the user
        // has granted the CAMERA permission.
        int cameraPermission =
            ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
        if (cameraPermission == PackageManager.PERMISSION_DENIED) {
            // Without camera permissions the service cannot run in the
            // foreground. Consider informing user or updating your app UI if
            // visible.
            stopSelf();
            return;
        }

        try {
            Notification notification =
                new NotificationCompat.Builder(this, "CHANNEL_ID")
                    // Create the notification to display while the service
                    // is running
                    .build();
            int type = 0;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                type = ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA;
            }
            ServiceCompat.startForeground(
                    /* service = */ this,
                    /* id = */ 100, // Cannot be 0
                    /* notification = */ notification,
                    /* foregroundServiceType = */ type
            );
        } catch (Exception e) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S &&
                    e instanceof ForegroundServiceStartNotAllowedException
            ) {
                // App not in a valid state to start foreground service
                // (e.g started from bg)
            }
            // ...
        }
    }

    //...
}

किसी सेवा को फ़ोरग्राउंड से हटाना

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

अगर फ़ोरग्राउंड में चल रही सेवा को बंद किया जाता है, तो उसकी सूचना हटा दी जाती है.

फ़ोरग्राउंड सेवाएं चला रहे ऐप्लिकेशन को उपयोगकर्ता के निर्देश पर बंद करना

सूचनाओं वाले पैनल के नीचे एक बटन मौजूद होता है, जो बैकग्राउंड में फ़िलहाल चल रहे ऐप्लिकेशन
    की संख्या बताता है. इस बटन को दबाने पर, एक डायलॉग बॉक्स दिखता है. इसमें अलग-अलग ऐप्लिकेशन के नाम दिखते हैं. &#39;रोकें&#39; बटन हर ऐप्लिकेशन की दाईं ओर होता है
पहला डायग्राम. Android 13 या उसके बाद के वर्शन पर चलने वाले डिवाइसों पर, Task Manager का वर्कफ़्लो.

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

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

जब उपयोगकर्ता टास्क मैनेजर में, आपके ऐप्लिकेशन के बगल में मौजूद रोकें बटन को दबाता है, तो ये कार्रवाइयां होती हैं:

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

यह जांच करने के लिए कि उपयोगकर्ता के आपके ऐप्लिकेशन को बंद करने के दौरान और उसके बाद, आपका ऐप्लिकेशन उम्मीद के मुताबिक काम करता है या नहीं, टर्मिनल विंडो में यहां दिए गए ADB निर्देश चलाएं:

adb shell cmd activity stop-app PACKAGE_NAME

छूट

यह सिस्टम, कुछ खास तरह के ऐप्लिकेशन के लिए कई लेवल की छूट देता है. इनके बारे में नीचे दिए गए सेक्शन में बताया गया है.

छूट, हर प्रोसेस के हिसाब से नहीं, बल्कि हर ऐप्लिकेशन के हिसाब से दी जाती है. अगर सिस्टम किसी ऐप्लिकेशन की एक प्रोसेस को छूट देता है, तो उस ऐप्लिकेशन की सभी अन्य प्रोसेस को भी छूट मिल जाती है.

टास्क मैनेजर में दिखने से बिलकुल भी छूट

ये ऐप्लिकेशन फ़ोरग्राउंड सेवा चला सकते हैं और टास्क मैनेजर में बिलकुल भी नहीं दिख सकते:

  • सिस्टम-लेवल के ऐप्लिकेशन
  • सुरक्षा ऐप्लिकेशन, यानी ऐसे ऐप्लिकेशन जिनमें ROLE_EMERGENCY भूमिका है
  • डेमो मोड में इस्तेमाल किए जा रहे डिवाइस

ऐसी छूट जिन्हें उपयोगकर्ता रोक नहीं सकते

जब इस तरह के ऐप्लिकेशन फ़ोरग्राउंड सेवा पर चलते हैं, तो वे टास्क मैनेजर में दिखते हैं. हालांकि, ऐप्लिकेशन के नाम के बगल में बंद करें बटन नहीं होता, जिस पर उपयोगकर्ता टैप कर सकता है:

फ़ोरग्राउंड सेवाओं के बजाय, खास मकसद के लिए बनाए गए एपीआई का इस्तेमाल करना

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

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

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

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

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

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