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