Android Services
Introduction to Android Services
इससे पहले की आप जाने की service क्या होती है आइये जानते है की service क्या नहीं होती है -
- एक service separate प्रोसेस नहीं होती है। ये आपकी एप्लीकेशन का ही पार्ट होती है।
- एक service thread नहीं होती है।
आइये अब देखते है service क्या होती है -
- Service एक facility होती है जिससे आप android system को बता सकते है की आप कोई काम background में करते रहना चाहते है।
- Service एक facility होती है जिससे एक एप्लीकेशन अपनी कुछ functionality दूसरी applications को expose कर सकती है।
हर service क्लास का <service> declaration AndroidManifest.xml file में होना चाहिए। Services को आप context.startService() और context.bindService() मेथड्स से स्टार्ट कर सकते है।
जब service component क्रिएट होता है तो android system component को initiate करता है और इसके onCreate() मेथड को कॉल कर देता है. जब सभी life cycle method execute हो जाते है तो ये service पर depend करता है की उसको टास्क कैसे complete करना है।
एक service की 2 forms हो सकती है-
- Started - एक service started service कहलाती है जब कोई component startService() मेथड कॉल करता है। एक बार स्टार्ट होने के बाद service बैकग्राउंड में execute होती रहेगी चाहे इसे क्रिएट करने वाला component destroy हो जाये। जब operation कम्पलीट हो जाता है तो service automatically stop हो जाती है।
- Bounded - एक एप्लीकेशन bound होती है जब कोई component bindService() मेथड कॉल करके service को bind करता है। एक bound service client server interface प्रोवाइड करती है जिससे component service के साथ interact कर सकता है।
एक service create करने के लिए आपको एक जावा क्लास create करनी पड़ती है जो base Service क्लास को extend करती है. एक service में callback मेथड्स होते है जिन्हे आप implement कर सकते है और appropriate stage पर अपना काम कम्पलीट कर सकते है। किसी भी service को आप 2 तरह से स्टार्ट कर सकते है एक तो आप startService() मेथड कॉल कर सकते है या आप bindService() मेथड कॉल कर सकते है। Service base क्लास कुछ methods प्रोवाइड करती है जिन्हे आप अपनी जरुरत के हिसाब से implement कर सकते है। कुछ important मेथड्स निचे दिए जा रहे है-
- onStartCommand() - Android system इस मेथड को तब कॉल करता है जब कोई दूसरा component जैसे की कोई activity startService() कॉल करके service को start करने के लिए request करता है। जैसे ही ये मेथड कॉल होता है service स्टार्ट हो जाती है और बैकग्राउंड में execute होती रहती है। अगर आप इस मेथड को implement करते है तो stopService() मेथड कॉल करके service को स्टॉप करना आपकी जिम्मेदारी होती है।
- onBind() - Android system ये मेथड तब कॉल करता है जब कोई component bindService() मेथड कॉल करके service के साथ bind होना चाहता है। जब आप इस मेथड को implement करे तो आपको एक interface प्रोवाइड करना चाहिए जिससे clients service से communicate कर सके।
- onCreate() - Android system इस method को तब कॉल करता है जब service फर्स्ट टाइम क्रिएट होती है। ये मेथड सिर्फ एक बार ही कॉल होता है।
- onDestroy() - Android system इस मेथड को तब कॉल करता है जब service अपना काम पूरा कर लेती है और destroy होती है।
अगर कोई component service को startService() मेथड कॉल करके स्टार्ट करता है तो service तब तक रन होती रहती है जब तक या तो वो stopSelf () मेथड कॉल करके खुद को स्टॉप ना कर ले या दूसरा component stopService() मेथड कॉल करके service को स्टॉप कर दे।
अगर कोई component service को bindService() मेथड कॉल करके स्टार्ट करता है तो service तब तक ही रन करेगी जब तक component service से bound है। जैसे ही service सभी clients से unbound होती है android system service को destroy कर देता है।
Android system service को तब ही forcefully stop करेगा जब memory बहुत कम होगी और सिस्टम को user focus activity के लिए resources फ्री करने होंगे।
Declaring Service in AndroidManifest.xml File
Activities की तरह आपको सभी services को AndroidManifest.xml file में डिक्लेअर करना होता है।
Service को डिक्लेअर करने के लिए आप <service> एलिमेंट को <application> एलिमेंट के child की तरह लिखते है। जैसे की
<manifest...>
...
....
<application ...>
<Service android:name=".YourService" />
...
</application>
</manifest>
और भी दूसरे attribute है जो आप service एलिमेंट में include कर सकते है और properties को डिफाइन कर सकते है जैसे service को स्टार्ट करने के लिए permissions और जिस process में service रन होगी वो भी आप डिफाइन कर सकते है। android : name attribute में आप service क्लास specify करते है।
Creating a Service
Started Service
एक started service वो service होती है जो दूसरे components startService() मेथड कॉल करके स्टार्ट करते है। जब service start हो जाती है तो इसकी एक life cycle होती है जो स्टार्ट करने वाले component से अलग होती है। यदि स्टार्ट करने वाला component destroy भी हो जाये तो भी service बैकग्राउंड में रन होती रहती है।
Started service create करने के लिए हमारे पास 2 क्लासेज available है-
Service - ये सभी services की बेस क्लास है। जब आप इस क्लास को एक्सटेंड करते है तो ये जरुरी हो जाता है की आप services का काम करने के लिए एक नयी thread क्रिएट करे। क्योंकि by default service main thread को यूज़ करती है ऐसा होने से आपकी activity की performance slow हो जाती है।
IntentService - ये Service क्लास की sub class है. सभी request को हैंडल करने के लिए ये class एक worker थ्रेड provide करती है. लेकिन ये क्लास एक बार में एक ही request हैंडल कर सकती है। यदि आपकी एप्लीकेशन में एक साथ बहुत सी requests को हैंडल करना मायने नहीं रखता तो IntentService क्लास को implement करना आपके लिए सबसे अच्छा ऑप्शन है।
आइये अब हम ये जानने का प्रयास करते की आप किसी component में से activity को कैसे स्टार्ट कर सकते है-
किसी component से service स्टार्ट करने के लिए आप startService() मेथड में intent पास कर सकते है। Android system service का onStartCommand() मेथड कॉल करता है और उसे intent पास करता है।
Intent yrIntent = new Intent(this.yrclass.class);
startService(yrIntent);
आइये अब देखते है की service को stop कैसे करते है -
Started service को stop करने की जिम्मेदारी android system की नहीं होती है. Service को खुद ही stopSelf() method कॉल करके खुद को stop करना होता है या फिर कोई दूसरा component stopService() मेथड कॉल करके service को stop कर सकता है।
Bounded Service
एक bounded service वो service होती है जिसके साथ दूसरे components bindService() मेथड कॉल करके bind होते है। आपको bound service तब create करनी चाहिए जब आप चाहते है की activity और दूसरे components service के साथ interact कर सके। Bound service के द्वारा आप अपनी एप्लीकेशन की कुछ functionality दूसरी एप्लीकेशन को expose कर सकते है।
Bound service क्रिएट करने के लिए आपको Service क्लास का onBind() method implement करना होता है ये मेथड एक IBinder return करता है जो service के साथ communication के लिए interface define करता है।
दूसरे components bindService() मेथड कॉल करके interface से जुड़ सकते है। जब तक service से bounded components destroy नहीं होते तक तक service भी destroy नहीं होती है।