Background Service एक Android घटक है जो बिना यूजर इंटरफ़ेस के पृष्ठभूमि में लंबी अवधि के संचालन करने के लिए डिजाइन किया गया है। Activity के विपरीत, Service एप्लिकेशन के छोटे होने या उपयोगकर्ता के दूसरे एप्लिकेशन पर स्विच करने के बाद भी काम करता रहता है। Android Developers, 2026 के अनुसार, तीन प्रकार की सेवाएँ हैं: Started Service, Bound Service और Foreground Service, प्रत्येक अपने जीवन चक्र और उपयोग क्षेत्र के साथ।
मुख्य बातें
Background Service (या बस Service) Activity, BroadcastReceiver और ContentProvider के साथ एक Android एप्लिकेशन के चार मूल घटकों में से एक है। Activity के विपरीत, Service में कोई दृश्य इंटरफ़ेस नहीं है और यह उन संचालनों को निष्पादित करने के लिए डिजाइन किया गया है जो एप्लिकेशन के अग्रिम में होने या न होने के बावजूद जारी रहने चाहिए।
Service एप्लिकेशन के मुख्य थ्रेड पर चलता है, इसलिए इसके अंदर किसी भी अवरोधक संचालन के लिए एक अलग थ्रेड बनाने की आवश्यकता होती है। यदि ऐसा नहीं किया जाता है, तो सिस्टम ANR (Application Not Responding) फैंक करेगा। सरल पृष्ठभूमि संचालनों के लिए, Android IntentService प्रदान करता है जो स्वचालित रूप से एक वर्कर थ्रेड बनाता है। आधुनिक परियोजनाओं में, मुख्य थ्रेड को अवरुद्ध किए बिना अतुल्युगमी प्रसंस्करण के लिए Service के अंदर CoroutineScope के साथ Kotlin कोरूटिन का उपयोग करने की अनुशंसा की जाती है।
Service का मुख्य उद्देश्य संगीत बजाना, फ़ाइलें डाउनलोड करना, नेटवर्क अनुरोधों को संभालना, डेटा सिंक करना और अन्य कार्य जो उपयोगकर्ता के एप्लिकेशन से बाहर निकलने के बाद भी जारी रहने चाहिए। हालांकि, Android 8 से, डिव्लपरों को पृष्ठभूमि कार्य प्रतिबंधों को ध्यान में रखते हुए सेवा प्रकारों के बीच सावधानीपूर्वक चयन करना चाहिए।
Service का अपना जीवन चक्र होता है जो Activity से अलग है। इसमें चार मुख्य विधियाँ शामिल हैं: onCreate, onStartCommand, onBind और onDestroy। मेमरी लीक के बिना पृष्ठभूमि कार्यों को सही ढंग से लागू करने के लिए इस चक्र को समझना आवश्यक है।
onCreate विधि सेवा बनने पर एक बार बुलाई जाती है। यहाँ टाइमर, डेटाबेस कनेक्शन और सॉकेट जैसे संसाधनों को आरंभ किया जाता है। onStartCommand विधि हर बार startService के साथ बुलाई जाती है, जो पहले से चल रही सेवा को आदेश भेजने की अनुमति देता है। वापसी मान पुनरारंभ पर सिस्टम के व्यवहार को निर्धारित करता है।
class DownloadService : Service() {
override fun onCreate() {
super.onCreate()
initializeDownloader()
}
override fun onStartCommand(
intent: Intent?,
flags: Int,
startId: Int
): Int {
downloadFile(intent?.getStringExtra("url"))
return START_STICKY
}
override fun onBind(intent: Intent): IBinder? = null
}
onBind bindService के माध्यम से सेवा को बाँधने पर बुलाई जाती है और ग्राहक संवाद के लिए एक IBinder ऑब्जेक्ट लौटाती है। यह विधि केवल Bound Service के लिए उपयोग की जाती है। onDestroy सेवा के नष्ट होने से पहले अंतिम काल है। यहाँ सभी संसाधन जारी किए जाते हैं, थ्रेड रोके जाते हैं और कार्य रद्द किए जाते हैं।
Android तीन प्रकार की Service प्रदान करता है, प्रत्येक अपने परिदृश्य के लिए डिजाइन किया गया है। गलत प्रकार चुनने से एप्लिकेशन का अस्थिर व्यवहार या बैटरी की खपत हो सकती है।
Started Service startService को कॉल करके शुरू किया जाता है और stopSelf या stopService कॉल करने तक चलता है। यह उन कार्यों के लिए उपयुक्त है जिन्हें तुरंत निष्पादित करने की आवश्यकता होती है: एनलिटिक्स भेजना, एक छवि का प्रसंस्करण, एक फ़ाइल डाउनलोड करना। अपना काम पूरा करने के बाद, सेवा स्वयं रुक जाती है।
Bound Service एक ग्राहक-सर्वर इंटरफ़ेस प्रदान करता है, जो Activity, Fragment या अन्य घटक को सेवा के साथ बातचीत करने की अनुमति देता है। सेवा तब तक चलती है जब तक कम से कम एक ग्राहक जुड़ा हो। जब सभी ग्राहक अलग हो जाते हैं, तो सेवा नष्ट हो जाती है। Bound Service द्विपक्षीय संचार की आवश्यकता वाले कार्यों के लिए सुविधाजनक है: संगीत प्लेयर, नेविगेशन।
Foreground Service स्टैटस बार में एक स्थायी अधिसूचना के साथ एक Started Service है। सिस्टम एसी सेवा को सक्रिय मानता है और कम मेमरी होने पर भी इसे नहीं मारता। Foreground Service संगीत प्लेयबैक, ऑडियो रिकॉर्डिंग, लोकेशन ट्रैकिंग और उपयोगकर्ता के लिए महत्वपूर्ण अन्य कार्यों के लिए अनिवार्य है।
| पैरामीटर | Started | Bound | Foreground |
|---|---|---|---|
| शुरूआत | startService | bindService | startForeground |
| आयु | stopSelf तक | जब तक ग्राहक हैं | stopForeground तक |
| अधिसूचना | नहीं | नहीं | आवश्यक |
| मारनी योग्य | हाँ | हाँ | नहीं |
| उदाहरण | डाउनलोड | प्लेयर | संगीत |
Service बनाना Service से विरासत पाने वाली क्लास घोषित करने और इसे AndroidManifest.xml में पंजीकृत करने से शुरू होता है। मैनिफ़ेस्ट में पंजीकरण के बिना, सिस्टम सेवा शुरू नहीं कर पाएगा, और startService का कोई भी कॉल एक अपवाद का कारण बनेगा।
// AndroidManifest.xml में पंजीकरण
@SuppressLint("ForegroundServiceType")
class SyncService : Service() {
override fun onStartCommand(
intent: Intent?,
flags: Int,
startId: Int
): Int {
startForeground(
NOTIFICATION_ID,
createNotification()
)
performSync(intent)
return START_NOT_STICKY
}
}
Activity या Fragment से सेवा शुरू करने के लिए, सेवा क्लास के स्पष्ट संदर्भ के साथ एक Intent का उपयोग किया जाता है। Android 8 से शुरू करते हुए, Foreground Service को मैनिफ़ेस्ट में FOREGROUND_SERVICE अनुमति की आवश्यकता होती है।
// Started Service शुरू करना
val intent = Intent(this, SyncService::class.java)
intent.putExtra("action", "sync")
startService(intent)
// Foreground Service शुरू करना (Android 8+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent)
} else {
startService(intent)
}
Android 8 से शुरू करते हुए (API 26), Google ने पृष्ठभूमि सेवाओं पर सख्त प्रतिबंध लागू किए हैं। पृष्ठभूमि सेवा शुरूआत (जब एप्लिकेशन अग्रिम में नहीं है) केवल असामान्य मामलों में ही अनुमत है: पुश नोटिफिकेशन प्राप्त करने पर, डिवाइस बूट के बाद, या JobScheduler के माध्यम से।
उन लंबे कार्यों के लिए जिन्हें तुरंत निष्पादन की आवश्यकता नहीं है, WorkManager या JobScheduler का उपयोग करने की अनुशंसा की जाती है। यदि एक एप्लिकेशन को वास्तव में एक चलने वाली सेवा की आवश्यकता है, तो एकमात्र तरीका उपयोगकर्ता को दिखने वाली अधिसूचना के साथ Foreground Service है। बिना अधिसूचना के पृष्ठभूमि में सेवा शुरू करने को सिस्टम द्वारा अनदेखा किया जाएगा।
JobIntentService एक विशेषिकृत क्लास है जो Android 5+ पर काम करने के लिए सपोर्ट लाइब्रेरी में दिखाई दी। यह IntentService (स्वचालित वर्कर थ्रेड, अनुक्रमिक प्रसंस्करण) के व्यवहार को JobScheduler के माध्यम से शेड्यूलिंग के साथ जोड़ता है। Android 8+ पर, JobIntentService अंदर ही JobScheduler का उपयोग करता है, और पुराने संस्करणों पर एक सामान्य Service। यह अतिरिक्त Android संस्करण जांच के बिना पृष्ठभूमि कार्यों का एकसमान हैंडलिंग की अनुमति देता है।
class UploadJobService : JobIntentService() {
companion object {
private const val JOB_ID = 1000
fun enqueueWork(context: Context, work: Intent) {
enqueueWork(
context,
UploadJobService::class.java,
JOB_ID,
work
)
}
}
override fun onHandleWork(intent: Intent) {
val fileUri = intent.getStringExtra("file_uri")
// एक पृष्ठभूमि थ्रेड में चलता है
uploadFile(fileUri)
}
}
Background Service के साथ काम करते समय एक सामान्य समस्या मेमरी लीक है। चूँकि Service किसी Activity से अधिक समय तक चल सकती है, Service के अंदर Activity के संदर्भ (listener, callback या broadcast के माध्यम से) UI घटकों के कचरा संग्रहण को रोकते हैं। Service-से-UI संचार के लिए WeakReference, ViewModel या LiveData का उपयोग करने की अनुशंसा की जाती है। onDestroy में, सभी सदस्यताएँ रद्द करना, थ्रेड रोकना और कर्सर बंद करना न भूलें।
Background Service और WorkManager के बीच चुनाव परिदृश्य पर निर्भर करता है। Service उन कार्यों के लिए उपयुक्त है जो तुरंत और लगातार चलने चाहिए: संगीत प्लेयबैक, ऑडियो रिकॉर्डिंग, GPS ट्रैकिंग। WorkManager विलंबित, गारंटीड कार्यों के लिए बेहतर है: सिंक, एनलिटिक्स भेजना, लॉग अपलोड करना। WorkManager डिवाइस रिबूट पर भी जीवित रहता है, जबकि Service नहीं। Service अधिसूचना के साथ Foreground हो सकती है, जबकि WorkManager पृष्ठभूमि में चुपचाप काम करता है। व्यावहारिक रूप से, डिव्लपर दोनों दृष्टिकोणों को जोड़ते हैं: उपयोगकर्ता के लिए महत्वपूर्ण कार्यों के लिए Foreground Service और पृष्ठभूमि रखरखाव के लिए WorkManager।
Android 12 ने android:foregroundServiceType फ़्लैग पेश किया, जिसके लिए सेवा प्रकार निर्दिष्ट करना आवश्यक है: dataSync, camera, connectedDevice, location, mediaPlayback और अन्य। गलत प्रकार निर्देश शुरूआत पर एक अपवाद का कारण बनता है। यह प्रथा Background Service को उपयोगकर्ता और सिस्टम दोनों के लिए अधिक पारदर्शी बनाती है।
मैनिफ़ेस्ट में Service का उचित पंजीकरण exported विशेषता (बाहरी एप्लिकेशनों के लिए उपलब्धता), foregroundServiceType (Android 12+ पर पृष्ठभूमि सेवा प्रकार) और अनुमति शामिल करता है। Bound Service के लिए, आपको JobIntentService के लिए android:permission="android.permission.BIND_JOB_SERVICE" घोषित करने की भी आवश्यकता है। मैनिफ़ेस्ट में पंजीकरण के बिना, कोई भी startService या bindService कॉल एक अपवाद फैंक करेगा, इसलिए Service-संबंधित समस्याओं का निदान करते समय मैनिफ़ेस्ट की जांच पहला कदम है।
अक्सर पूछे जाने वाले प्रश्न
Service एप्लिकेशन के मुख्य थ्रेड (UI Thread) पर चलती है। onStartCommand या onHandleIntent के अंदर कोई भी अवरोधक संचालन एक अलग थ्रेड या कोरूटिन में ले जाना चाहिए, अन्यथा सिस्टम 5 सेकंड के बाद ANR फैंक करेगा।
IntentService Service का एक उपवर्ग है जो स्वचालित रूप से एक वर्कर थ्रेड बनाता है और आदेशों को अनुक्रमिक रूप से संसाधित करता है। अंतिम कार्य पूरा करने के बाद, IntentService स्वयं रुक जाता है। Android 8 से शुरू करते हुए, IntentService को JobIntentService या WorkManager के पक्ष में बहिष्कृत माना जाता है।
Android 12 पर पृष्ठभूमि से Started Service शुरू करना प्रतिबंधित है। अपवाद मैनिफ़ेस्ट में घोषित foregroundServiceType और एक वैध अधिसूचना के साथ Foreground Service है। एक उच्च-प्राथमिकता वाले FCM संदेश प्राप्त करने के बाद एक छोटी शुरूआत की भी अनुमति है।
तीन तरीके हैं: स्थानीय प्रसारण के साथ BroadcastReceiver, Handler के माध्यम से Messenger तंत्र, और एक साझा ViewModel के साथ MVVM आर्किटेक्चर में LiveData/Flow। Bound Service के लिए, IBinder का उपयोग सीधे विधि कॉल के साथ किया जाता है।
यदि Service को START_STICKY फ़्लैग के साथ शुरू किया गया था, तो सिस्टम कम मेमरी के कारण प्रक्रिया के समाप्त होने के बाद इसॅ पुनर्व्यारंभ करेगा। START_NOT_STICKY फ़्लैग का अर्थ है कि सिस्टम सेवा को पुनर्व्यारंभ नहीं करेगा। START_REDELIVER_INTENT START_STICKY के समान है लेकिन अंतिम Intent पहुंचाता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें