फ़ोरग्राउंड सेवा के टाइप

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

कैमरा

android:foregroundServiceType में मेनिफ़ेस्ट में बताने के लिए, फ़ोरग्राउंड सेवा का टाइप
camera
अपने मेनिफ़ेस्ट में एलान करने की अनुमति
FOREGROUND_SERVICE_CAMERA
startForeground() को पास करने के लिए कॉन्स्टेंट
FOREGROUND_SERVICE_TYPE_CAMERA
रनटाइम की ज़रूरी शर्तें

CAMERA रनटाइम की अनुमति का अनुरोध करना और उसे पाना

ब्यौरा

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

कनेक्ट किया गया डिवाइस

मेनिफ़ेस्ट में जाकर, फ़ोरग्राउंड सेवा के टाइप की जानकारी दें. इसके लिए,
android:foregroundServiceType
connectedDevice
अपने मेनिफ़ेस्ट में एलान करने की अनुमति
FOREGROUND_SERVICE_CONNECTED_DEVICE
startForeground() को पास करने के लिए कॉन्स्टेंट
FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
रनटाइम की ज़रूरी शर्तें

इनमें से कम से कम एक शर्त पूरी होनी चाहिए:

ब्यौरा

बाहरी डिवाइसों के साथ इंटरैक्शन, जिनके लिए ब्लूटूथ, एनएफ़सी, आईआर, यूएसबी या इंटरनेट की ज़रूरत होती है.

विकल्प

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

अगर आपके ऐप्लिकेशन को ब्लूटूथ डिवाइसों को स्कैन करना है, तो इसके बजाय ब्लूटूथ स्कैन एपीआई का इस्तेमाल करें.

डेटा सिंक करना

मेनिफ़ेस्ट में जाकर, फ़ोरग्राउंड सेवा के टाइप की जानकारी दें. इसके लिए,
android:foregroundServiceType
dataSync
अपने मेनिफ़ेस्ट में एलान करने की अनुमति
FOREGROUND_SERVICE_DATA_SYNC
startForeground() को पास करने के लिए कॉन्स्टेंट
FOREGROUND_SERVICE_TYPE_DATA_SYNC
रनटाइम की ज़रूरी शर्तें
कोई नहीं
ब्यौरा

डेटा ट्रांसफ़र करने से जुड़ी कार्रवाइयां, जैसे कि:

  • डेटा अपलोड या डाउनलोड करना
  • बैकअप लेने और डेटा वापस पाने की सुविधा
  • इंपोर्ट या एक्सपोर्ट करने की कार्रवाइयां
  • डेटा फ़ेच करना
  • लोकल फ़ाइल प्रोसेसिंग
  • नेटवर्क की मदद से, किसी डिवाइस और क्लाउड के बीच डेटा ट्रांसफ़र करना
विकल्प

ज़्यादा जानकारी के लिए, डेटा सिंक करने वाली फ़ोरग्राउंड सेवाओं के विकल्प देखें.

बैटरी की परफ़ॉर्मेंस

मेनिफ़ेस्ट में जाकर, फ़ोरग्राउंड सेवा के टाइप की जानकारी दें. इसके लिए,
android:foregroundServiceType
health
अपने मेनिफ़ेस्ट में एलान करने की अनुमति
FOREGROUND_SERVICE_HEALTH
startForeground() को पास करने के लिए कॉन्स्टेंट
FOREGROUND_SERVICE_TYPE_HEALTH
रनटाइम की ज़रूरी शर्तें

इनमें से कम से कम एक शर्त पूरी होनी चाहिए:

ब्यौरा

फ़िटनेस कैटगरी के ऐप्लिकेशन के साथ काम करने के लिए, लंबे समय से इस्तेमाल किए जा रहे उदाहरण. जैसे, कसरत ट्रैकर.

जगह की जानकारी

मेनिफ़ेस्ट में जाकर, फ़ोरग्राउंड सेवा के टाइप की जानकारी दें. इसके लिए,
android:foregroundServiceType
location
अपने मेनिफ़ेस्ट में एलान करने की अनुमति
FOREGROUND_SERVICE_LOCATION
startForeground() को पास करने के लिए कॉन्स्टेंट
FOREGROUND_SERVICE_TYPE_LOCATION
रनटाइम की ज़रूरी शर्तें

उपयोगकर्ता ने जगह की जानकारी की सेवाएं चालू की हों और ऐप्लिकेशन को इनमें से कम से कम एक रनटाइम अनुमति दी गई हो:

ब्यौरा

लंबे समय तक चलने वाले ऐसे इस्तेमाल के उदाहरण जिनके लिए जगह की जानकारी का ऐक्सेस ज़रूरी है. जैसे, नेविगेशन और जगह की जानकारी शेयर करना.

विकल्प

अगर उपयोगकर्ता किसी खास जगह पर पहुंचने पर आपके ऐप्लिकेशन को ट्रिगर करना है, तो इसके बजाय geofence API का इस्तेमाल करें.

मीडिया

मेनिफ़ेस्ट में जाकर, फ़ोरग्राउंड सेवा के टाइप की जानकारी दें. इसके लिए,
android:foregroundServiceType
mediaPlayback
अपने मेनिफ़ेस्ट में एलान करने की अनुमति
FOREGROUND_SERVICE_MEDIA_PLAYBACK
startForeground() को पास करने के लिए कॉन्स्टेंट
FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
रनटाइम की ज़रूरी शर्तें
कोई नहीं
ब्यौरा

इसका इस्तेमाल करके, कोई भी ऑडियो या वीडियो बैकग्राउंड में चलाया जा सकता है. Android TV पर डिजिटल वीडियो रिकॉर्डिंग (डीवीआर) की सुविधा काम करती हो.

विकल्प

अगर पिक्चर में पिक्चर मोड में वीडियो दिखाया जा रहा है, तो पिक्चर में पिक्चर मोड का इस्तेमाल करें.

मीडिया प्रोसेस करना

मेनिफ़ेस्ट में जाकर, फ़ोरग्राउंड सेवा के टाइप की जानकारी दें. इसके लिए,
android:foregroundServiceType
mediaProcessing
अपने मेनिफ़ेस्ट में एलान करने की अनुमति
FOREGROUND_SERVICE_MEDIA_PROCESSING
startForeground() को पास करने के लिए कॉन्स्टेंट
FOREGROUND_SERVICE_TYPE_MEDIA_PROCESSING
रनटाइम की ज़रूरी शर्तें
कोई नहीं
ब्यौरा

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

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

  • ट्रांसकोडिंग की प्रोसेस पूरी होने या गड़बड़ी की स्थिति में पहुंचने पर, सेवा को पूरी तरह से बंद करने के लिए, सेवा को Service.stopForeground() और Service.stopSelf() पर कॉल करने दें.

टाइम आउट की अवधि खत्म होने पर, सिस्टम सेवा के Service.onTimeout(int, int) तरीके को कॉल करता है. इस समय, सेवा के पास Service.stopSelf() को कॉल करने के लिए कुछ सेकंड होते हैं. अगर सेवा Service.stopSelf() को कॉल नहीं करती है, तो इस गड़बड़ी के मैसेज के साथ ANR होगा: "<fgs_type> की फ़ोरग्राउंड सेवा, तय समयसीमा में नहीं रुकी: <component_name>".

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

मीडिया प्रोजेक्शन

मेनिफ़ेस्ट में जाकर, फ़ोरग्राउंड सेवा के टाइप की जानकारी दें
android:foregroundServiceType
mediaProjection
अपने मेनिफ़ेस्ट में एलान करने की अनुमति
FOREGROUND_SERVICE_MEDIA_PROJECTION
startForeground() को पास करने के लिए कॉन्स्टेंट
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
रनटाइम की ज़रूरी शर्तें

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

फ़ोरग्राउंड सेवा बनाने के बाद, MediaProjectionManager.getMediaProjection() को कॉल किया जा सकता है.

ब्यौरा

MediaProjection एपीआई का इस्तेमाल करके, कॉन्टेंट को नॉन-प्राइमरी डिसप्ले या बाहरी डिवाइस पर प्रोजेक्ट करें. यह ज़रूरी नहीं है कि यह कॉन्टेंट सिर्फ़ मीडिया कॉन्टेंट हो.

विकल्प

किसी दूसरे डिवाइस पर मीडिया स्ट्रीम करने के लिए, Google Cast SDK का इस्तेमाल करें.

माइक्रोफ़ोन

मेनिफ़ेस्ट में जाकर, फ़ोरग्राउंड सेवा के टाइप की जानकारी दें. इसके लिए,
android:foregroundServiceType
microphone
अपने मेनिफ़ेस्ट में एलान करने की अनुमति
FOREGROUND_SERVICE_MICROPHONE
startForeground() को पास करने के लिए कॉन्स्टेंट
FOREGROUND_SERVICE_TYPE_MICROPHONE
रनटाइम की ज़रूरी शर्तें

RECORD_AUDIO रनटाइम की अनुमति का अनुरोध करें और उसे मंज़ूरी पाएं.

ब्यौरा

बैकग्राउंड में माइक्रोफ़ोन से आवाज़ रिकॉर्ड करना जारी रखना, जैसे कि वॉइस रिकॉर्ड करने वाले ऐप्लिकेशन या कम्यूनिकेशन ऐप्लिकेशन.

फ़ोन कॉल

मेनिफ़ेस्ट में जाकर, फ़ोरग्राउंड सेवा के टाइप की जानकारी दें. इसके लिए,
android:foregroundServiceType
phoneCall
अपने मेनिफ़ेस्ट में एलान करने की अनुमति
FOREGROUND_SERVICE_PHONE_CALL
startForeground() को पास करने के लिए कॉन्स्टेंट
FOREGROUND_SERVICE_TYPE_PHONE_CALL
रनटाइम की ज़रूरी शर्तें

इनमें से कम से कम एक शर्त सही होनी चाहिए:

  • ऐप्लिकेशन ने अपनी मेनिफ़ेस्ट फ़ाइल में MANAGE_OWN_CALLS अनुमति का एलान किया है.
  • ऐप्लिकेशन, ROLE_DIALER भूमिका के ज़रिए डिफ़ॉल्ट डायलर ऐप्लिकेशन है.
ब्यौरा

ConnectionService एपीआई का इस्तेमाल करके, किसी मौजूदा कॉल को जारी रखना.

विकल्प

अगर आपको फ़ोन, वीडियो या VoIP कॉल करने हैं, तो android.telecom लाइब्रेरी का इस्तेमाल करें.

कॉल की जांच करने के लिए, CallScreeningService का इस्तेमाल करें.

रिमोट मैसेज सेवा

मेनिफ़ेस्ट में जाकर, फ़ोरग्राउंड सेवा के टाइप की जानकारी दें. इसके लिए,
android:foregroundServiceType
remoteMessaging
अपने मेनिफ़ेस्ट में एलान करने की अनुमति
FOREGROUND_SERVICE_REMOTE_MESSAGING
startForeground() को पास करने के लिए कॉन्स्टेंट
FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING
रनटाइम की ज़रूरी शर्तें
कोई नहीं
ब्यौरा
मैसेज को एक डिवाइस से दूसरे डिवाइस पर ट्रांसफ़र करना. जब उपयोगकर्ता एक डिवाइस पर किसी बातचीत को अधूरा छोड़कर किसी अन्य डिवाइस से मैसेज करने लगता है, तो इस सेवा की मदद से बातचीत वहीं से शुरू की जा सकती है जहां पर उपयोगकर्ता ने छोड़ी थी.

कम समय के लिए सेवा

मेनिफ़ेस्ट में जाकर, फ़ोरग्राउंड सेवा के टाइप की जानकारी दें. इसके लिए,
android:foregroundServiceType
shortService
अपने मेनिफ़ेस्ट में एलान करने की अनुमति
कोई नहीं
startForeground() को पास करने के लिए कॉन्स्टेंट
FOREGROUND_SERVICE_TYPE_SHORT_SERVICE
रनटाइम की ज़रूरी शर्तें
कोई नहीं
ब्यौरा

ज़रूरी काम को जल्दी से पूरा करना, जिसमें रुकावट नहीं आनी चाहिए या जिसे बाद में नहीं किया जा सकता.

इस टाइप की कुछ खास विशेषताएं हैं:

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

shortService के लिए टाइम आउट, Service.startForeground() को कॉल करने के बाद शुरू होता है. ऐप्लिकेशन को टाइम आउट होने से पहले, Service.stopSelf() या Service.stopForeground() को कॉल करना चाहिए. अगर ऐसा नहीं होता है, तो नया Service.onTimeout() कॉल किया जाता है. इससे ऐप्लिकेशन को अपनी सेवा बंद करने के लिए, stopSelf() या stopForeground() को कॉल करने का थोड़ा समय मिलता है.

Service.onTimeout() को कॉल करने के कुछ समय बाद, ऐप्लिकेशन कैश मेमोरी में सेव होने की स्थिति में चला जाता है. इसके बाद, जब तक उपयोगकर्ता ऐप्लिकेशन का इस्तेमाल करता रहता है, तब तक उसे फ़ोरग्राउंड में नहीं माना जाता. ऐप्लिकेशन के कैश मेमोरी में सेव होने और सेवा के बंद न होने के कुछ समय बाद, ऐप्लिकेशन को ANR मिलता है. ANR मैसेज में FOREGROUND_SERVICE_TYPE_SHORT_SERVICE का ज़िक्र है. इन वजहों से, Service.onTimeout() कॉलबैक को लागू करना सबसे सही तरीका माना जाता है.

Service.onTimeout() कॉलबैक की सुविधा, Android 13 और इससे पहले के वर्शन पर उपलब्ध नहीं है. अगर यही सेवा ऐसे डिवाइसों पर चलती है, तो उसे टाइम आउट नहीं मिलता और न ही ANR होता है. पक्का करें कि प्रोसेस करने का टास्क पूरा होने के बाद, आपकी सेवा बंद हो जाए. भले ही, उसे अब तक Service.onTimeout() कॉलबैक न मिला हो.

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

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

अगर कोई उपयोगकर्ता आपके ऐप्लिकेशन के लिए बैटरी ऑप्टिमाइज़ेशन की सुविधा बंद कर देता है, तो भी shortService FGS के टाइम आउट का उस पर असर पड़ता है.

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

खास इस्तेमाल

मेनिफ़ेस्ट में जानकारी देने के लिए, फ़ोरग्राउंड सेवा का टाइप
android:foregroundServiceType
specialUse
अपने मेनिफ़ेस्ट में जानकारी देने की अनुमति
FOREGROUND_SERVICE_SPECIAL_USE
startForeground() को पास करने के लिए कॉन्स्टेंट
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
रनटाइम से जुड़ी ज़रूरी शर्तें
बिलकुल नहीं
ब्यौरा

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

FOREGROUND_SERVICE_TYPE_SPECIAL_USE से जुड़ा एलान करने के अलावा फ़ोरग्राउंड सेवा का टाइप है, तो डेवलपर को मेनिफ़ेस्ट. ऐसा करने के लिए, वे <property> एलिमेंट को <service> एलिमेंट. ये वैल्यू और उनके इस्तेमाल के उदाहरण ये हैं की समीक्षा की जाती है. इस्तेमाल आपकी ओर से दिए जाने वाले केस फ़्री-फ़ॉर्म हैं. साथ ही, आपको यह पक्का करना चाहिए कि जानकारी दें, ताकि समीक्षक यह देख सकें कि आपको specialUse का इस्तेमाल क्यों करना चाहिए टाइप करें.

<service android:name="fooService" android:foregroundServiceType="specialUse">
  <property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
      android:value="explanation_for_special_use"/>
</service>

सिस्टम को छूट मिली

मेनिफ़ेस्ट में इस सेक्शन के तहत फ़ोरग्राउंड सेवा का टाइप बताएं
android:foregroundServiceType
systemExempted
मेनिफ़ेस्ट में अनुमति का एलान करने की अनुमति
FOREGROUND_SERVICE_SYSTEM_EXEMPTED
startForeground() को पास करने के लिए कॉन्स्टेंट
FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED
रनटाइम की ज़रूरी शर्तें
कोई नहीं
ब्यौरा

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

इस टाइप का इस्तेमाल करने के लिए, ऐप्लिकेशन को इनमें से कम से कम एक शर्त पूरी करनी होगी:

फ़ोरग्राउंड सेवाओं के टाइप इस्तेमाल करने के लिए, Google Play की नीति लागू करना

अगर आपका ऐप्लिकेशन Android 14 या उसके बाद के वर्शन को टारगेट करता है, तो आपको Play Console के ऐप्लिकेशन कॉन्टेंट पेज (नीति > ऐप्लिकेशन कॉन्टेंट) पर, अपने ऐप्लिकेशन की फ़ोरग्राउंड सेवाओं के टाइप का एलान करना होगा. Play Console में फ़ोरग्राउंड सेवा के टाइप की जानकारी देने के तरीके के बारे में ज़्यादा जानने के लिए, फ़ोरग्राउंड सेवा और फ़ुल-स्क्रीन इंटेंट की ज़रूरी शर्तों के बारे में जानकारी देखें.