फ़ोरग्राउंड सेवाएं ऐसी कार्रवाइयां करती हैं जो उपयोगकर्ताओं को दिखती हैं.
फ़ोरग्राउंड सेवाएं, स्टेटस बार में सूचना दिखाती हैं. इससे उपयोगकर्ताओं को पता चलता है कि आपका ऐप्लिकेशन फ़ोरग्राउंड में कोई टास्क कर रहा है और सिस्टम के संसाधनों का इस्तेमाल कर रहा है.
फ़ोरग्राउंड सेवाओं का इस्तेमाल करने वाले ऐप्लिकेशन के उदाहरणों में ये शामिल हैं:
- म्यूज़िक प्लेयर ऐप्लिकेशन, जो फ़ोरग्राउंड सेवा में संगीत चलाता है. सूचना में चलाया जा रहा मौजूदा गाना दिख सकता है.
- ऐसा फ़िटनेस ऐप्लिकेशन जो उपयोगकर्ता से अनुमति मिलने के बाद, फ़ोरग्राउंड सेवा में की गई उपयोगकर्ता की गतिविधि को रिकॉर्ड करता है. सूचना में, फ़िटनेस से जुड़े मौजूदा सेशन के दौरान उपयोगकर्ता की तय की गई दूरी दिख सकती है.
फ़ोरग्राउंड सेवा का इस्तेमाल सिर्फ़ तब करें, जब आपके ऐप्लिकेशन को ऐसा टास्क करना हो जो उपयोगकर्ता को दिखे. भले ही, वह सीधे तौर पर ऐप्लिकेशन का इस्तेमाल न कर रहा हो. अगर कार्रवाई इतनी ज़रूरी नहीं है कि आपको कम प्राथमिकता वाली सूचना का इस्तेमाल करना हो, तो इसके बजाय बैकग्राउंड टास्क बनाएं.
इस दस्तावेज़ में फ़ोरग्राउंड सेवाओं का इस्तेमाल करने के लिए ज़रूरी अनुमति के बारे में बताया गया है. इसमें फ़ोरग्राउंड सेवा शुरू करने और उसे बैकग्राउंड से हटाने का तरीका भी बताया गया है. इसमें, फ़ोरग्राउंड सेवा के टाइप के साथ इस्तेमाल के कुछ उदाहरणों को जोड़ने का तरीका भी बताया गया है. साथ ही, बैकग्राउंड में चल रहे ऐप्लिकेशन से फ़ोरग्राउंड सेवा शुरू करने पर, ऐक्सेस से जुड़ी पाबंदियों के बारे में भी बताया गया है.
उपयोगकर्ता डिफ़ॉल्ट रूप से सूचना को खारिज कर सकता है
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()
को कॉल करें.
इस तरीके में एक बूलियन फ़ंक्शन का इस्तेमाल किया जाता है. इससे यह पता चलता है कि स्टेटस बार की सूचना भी हटानी है या नहीं. ध्यान दें कि सेवा जारी रहेगी.
अगर फ़ोरग्राउंड में चल रही सेवा को बंद किया जाता है, तो उसकी सूचना हटा दी जाती है.
फ़ोरग्राउंड सेवाएं चला रहे ऐप्लिकेशन को उपयोगकर्ता के निर्देश पर बंद करना
Android 13 (एपीआई लेवल 33) की शुरुआत से उपयोगकर्ता, सूचना दिखाने वाले पैनल से वर्कफ़्लो को पूरा कर सकते हैं. इससे, ऐसे ऐप्लिकेशन को रोका जा सकता है जिसमें पहले से फ़ोरग्राउंड सेवाएं चल रही हैं. भले ही, ऐप्लिकेशन का टारगेट SDK वर्शन कुछ भी हो. इस सुविधा को टास्क मैनेजर कहा जाता है. इसमें उन ऐप्लिकेशन की सूची दिखती है जो फ़िलहाल फ़ोरग्राउंड सेवा के तौर पर काम कर रहे हैं.
इस सूची को चालू ऐप्लिकेशन के तौर पर लेबल किया गया है. हर ऐप्लिकेशन के आगे एक बंद करें बटन होता है. पहली इमेज में, Android 13 वाले डिवाइस पर टास्क मैनेजर का वर्कफ़्लो दिखाया गया है.
जब उपयोगकर्ता टास्क मैनेजर में, आपके ऐप्लिकेशन के बगल में मौजूद रोकें बटन को दबाता है, तो ये कार्रवाइयां होती हैं:
- सिस्टम आपके ऐप्लिकेशन को मेमोरी से हटा देता है. इसलिए, सिर्फ़ फ़ोरग्राउंड में चल रही सेवा ही नहीं, बल्कि आपका पूरा ऐप्लिकेशन बंद हो जाता है.
- सिस्टम आपके ऐप्लिकेशन की ऐक्टिविटी बैक स्टैक को हटा देता है.
- कोई भी मीडिया प्लेबैक बंद हो जाता है.
- फ़ोरग्राउंड सेवा से जुड़ी सूचना हटा दी जाती है.
- आपका ऐप्लिकेशन इतिहास में बना रहता है.
- शेड्यूल किए गए जॉब, शेड्यूल किए गए समय पर लागू होते हैं.
- अलार्म, शेड्यूल किए गए समय या समयसीमा पर बजते हैं.
REASON_USER_REQUESTED
की वजह की जांच करना मददगार होता है.
यह जांच करने के लिए कि उपयोगकर्ता के आपके ऐप्लिकेशन को बंद करने के दौरान और उसके बाद, आपका ऐप्लिकेशन उम्मीद के मुताबिक काम करता है या नहीं, टर्मिनल विंडो में यहां दिए गए ADB निर्देश चलाएं:
adb shell cmd activity stop-app PACKAGE_NAME
छूट
यह सिस्टम, कुछ खास तरह के ऐप्लिकेशन के लिए कई लेवल की छूट देता है. इनके बारे में नीचे दिए गए सेक्शन में बताया गया है.
छूट, हर प्रोसेस के हिसाब से नहीं, बल्कि हर ऐप्लिकेशन के हिसाब से दी जाती है. अगर सिस्टम किसी ऐप्लिकेशन में एक प्रोसेस से छूट देता है, तो उस ऐप्लिकेशन में होने वाली दूसरी सभी प्रोसेस को भी छूट दी जाती है.
Task Manager में कभी भी न दिखने की छूट
ये ऐप्लिकेशन, फ़ोरग्राउंड सेवा चला सकते हैं और ये टास्क मैनेजर में बिलकुल नहीं दिखते:
- सिस्टम-लेवल के ऐप्लिकेशन
- सुरक्षा ऐप्लिकेशन, यानी ऐसे ऐप्लिकेशन जिनमें
ROLE_EMERGENCY
भूमिका है - ऐसे डिवाइस जो डेमो मोड में हैं
उपयोगकर्ताओं के पास रोकने का विकल्प न होने की छूट
जब इस तरह के ऐप्लिकेशन फ़ोरग्राउंड सेवा पर चलते हैं, तो वे टास्क मैनेजर में दिखते हैं. हालांकि, ऐप्लिकेशन के नाम के बगल में बंद करें बटन नहीं होता, जिस पर उपयोगकर्ता टैप कर सकता है:
- डिवाइस के मालिक के ऐप्लिकेशन
- प्रोफ़ाइल के मालिक के ऐप्लिकेशन
- सदाबहार ऐप्लिकेशन
- ऐसे ऐप्लिकेशन जिनके पास
ROLE_DIALER
भूमिका है
फ़ोरग्राउंड सेवाओं के बजाय, खास मकसद के लिए बनाए गए एपीआई का इस्तेमाल करना
कई कामों के लिए, प्लैटफ़ॉर्म या Jetpack के एपीआई उपलब्ध हैं. इनका इस्तेमाल करके, उन कामों को किया जा सकता है जिनके लिए फ़ोरग्राउंड सेवा का इस्तेमाल किया जा सकता है. अगर कोई सही मकसद के लिए बनाया गया एपीआई मौजूद है, तो आपको फ़ोरग्राउंड सेवा का इस्तेमाल करने के बजाय, करीब-करीब हमेशा इसका इस्तेमाल करना चाहिए. मकसद के लिए बनाए गए एपीआई, अक्सर इस्तेमाल के उदाहरण से जुड़ी ऐसी खास सुविधाएं देते हैं जिन्हें आम तौर पर आपको खुद बनाना पड़ता है. उदाहरण के लिए, Bubbles API, मैसेजिंग ऐप्लिकेशन के लिए यूज़र इंटरफ़ेस (यूआई) के जटिल लॉजिक को मैनेज करता है. इन ऐप्लिकेशन में चैट-बबल की सुविधाएं लागू करनी होती हैं.
फ़ोरग्राउंड सेवाओं के टाइप के दस्तावेज़ में, फ़ोरग्राउंड सेवाओं के बजाय इस्तेमाल करने के बेहतर विकल्पों की जानकारी दी गई है.
बैकग्राउंड से फ़ोरग्राउंड सेवा शुरू करने पर पाबंदियां
Android 12 या उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन, बैकग्राउंड में चलने के दौरान फ़ोरग्राउंड सेवाएं शुरू नहीं कर सकते. हालांकि, कुछ खास मामलों में यह सुविधा काम नहीं करती. अगर कोई ऐप्लिकेशन बैकग्राउंड में चलने के दौरान, फ़ोरग्राउंड सेवा शुरू करने की कोशिश करता है और फ़ोरग्राउंड सेवा, किसी खास मामले के हिसाब से नहीं है, तो सिस्टम 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
इवेंट मिलता है.ऐसे ऐप्लिकेशन जिनके पास सिस्टम में कुछ खास भूमिकाएं या अनुमतियां हों. जैसे, डिवाइस के मालिक और प्रोफ़ाइल के मालिक.
आपका ऐप्लिकेशन, Companion Device Manager का इस्तेमाल करता है और
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