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