फ़ोरग्राउंड सेवा लॉन्च करना

अपने ऐप्लिकेशन से फ़ोरग्राउंड सेवा लॉन्च करने के दो चरण हैं. सबसे पहले, आपको context.startForegroundService() को कॉल करके सेवा शुरू करनी होगी. इसके बाद, सेवा को ServiceCompat.startForeground() को कॉल करके, खुद को फ़ोरग्राउंड सेवा के तौर पर प्रमोट करने के लिए कहें.

ज़रूरी शर्तें

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

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

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

कोई सेवा लॉन्च करना

फ़ोरग्राउंड सेवा लॉन्च करने के लिए, आपको पहले इसे सामान्य (नॉन-फ़ोरग्राउंड) सेवा के तौर पर लॉन्च करना होगा:

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);

कोड के बारे में अहम जानकारी

  • कोड स्निपेट, कोई सेवा लॉन्च करता है. हालांकि, यह सेवा फ़िलहाल फ़ोरग्राउंड में नहीं चल रही है. सेवा को फ़ोरग्राउंड सेवा के तौर पर प्रमोट करने के लिए, आपको सेवा में जाकर ServiceCompat.startForeground() को कॉल करना होगा.

किसी सेवा का प्रमोशन फ़ोरग्राउंड में करना

सेवा के चालू होने के बाद, आपको ServiceCompat.startForeground() को कॉल करके, सेवा को फ़ोरग्राउंड में चलने का अनुरोध करना होगा. आम तौर पर, इस तरीके को सेवा के onStartCommand() तरीके में कॉल किया जाता है.

ServiceCompat.startForeground() इन पैरामीटर का इस्तेमाल करता है:

फ़ोरग्राउंड सेवा के वे टाइप जिन्हें आपने startForeground() मेनिफ़ेस्ट में बताए गए टाइप के लिए पास किया है. ये टाइप, इस्तेमाल के उदाहरण के हिसाब से तय किए जाते हैं. इसके बाद, अगर आपको सेवा के ज़्यादा टाइप जोड़ने हैं, तो 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)
            }
            // ...
        }
    }

    //...
}

कोड के बारे में अहम जानकारी

  • ऐप्लिकेशन ने मेनिफ़ेस्ट में पहले ही एलान कर दिया है कि उसे CAMERA अनुमति की ज़रूरत है. हालांकि, ऐप्लिकेशन को रनटाइम के समय यह भी देखना होगा कि उपयोगकर्ता ने वह अनुमति दी है या नहीं. अगर ऐप्लिकेशन के पास सही अनुमतियां नहीं हैं, तो उसे उपयोगकर्ता को समस्या के बारे में बताना चाहिए.
  • Android प्लैटफ़ॉर्म के अलग-अलग वर्शन के साथ, फ़ोरग्राउंड सेवा के अलग-अलग टाइप पेश किए गए थे. यह कोड यह जांच करता है कि यह Android के किस वर्शन पर काम कर रहा है और ज़रूरी अनुमतियों का अनुरोध करता है.
  • अगर कोड किसी ऐसी स्थिति में फ़ोरग्राउंड सेवा शुरू करने की कोशिश करता है जिसमें अनुमति नहीं है, तो वह ForegroundServiceStartNotAllowedException की जांच करता है. उदाहरण के लिए, अगर वह ऐप्लिकेशन बैकग्राउंड में होने के दौरान, फ़ोरग्राउंड में सेवा का प्रमोशन करने की कोशिश कर रहा है.