बैकग्राउंड सेवा बनाना

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

IntentService की कुछ सीमाएं हैं:

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

हालांकि, ज़्यादातर मामलों में बैकग्राउंड में आसान कार्रवाइयां करने के लिए, IntentService का इस्तेमाल करना सबसे सही होता है.

इस गाइड में, ये काम करने का तरीका बताया गया है:

  • IntentService की अपनी खुद की सब-क्लास बनाएं.
  • ज़रूरी कॉलबैक तरीका onHandleIntent() बनाएं.
  • अपनी मेनिफ़ेस्ट फ़ाइल में IntentService की जानकारी दें.

नए इंटेंट मैनेज करें

अपने ऐप्लिकेशन के लिए IntentService कॉम्पोनेंट बनाने के लिए, ऐसी क्लास तय करें जो IntentService को एक्सटेंड़ करती हो. साथ ही, उसमें ऐसा तरीका तय करें जो onHandleIntent() को बदल दे. उदाहरण के लिए:

Kotlin

class RSSPullService : IntentService(RSSPullService::class.simpleName)

    override fun onHandleIntent(workIntent: Intent) {
        // Gets data from the incoming Intent
        val dataString = workIntent.dataString
        ...
        // Do work here, based on the contents of dataString
        ...
    }
}

Java

public class RSSPullService extends IntentService {
    @Override
    protected void onHandleIntent(Intent workIntent) {
        // Gets data from the incoming Intent
        String dataString = workIntent.getDataString();
        ...
        // Do work here, based on the contents of dataString
        ...
    }
}

ध्यान दें कि किसी सामान्य Service कॉम्पोनेंट के दूसरे कॉलबैक, जैसे कि onStartCommand(), IntentService से अपने-आप शुरू हो जाते हैं. IntentService में, आपको इन कॉलबैक को बदलने से बचना चाहिए.

IntentService बनाने के बारे में ज़्यादा जानने के लिए, IntentService क्लास को बढ़ाना लेख पढ़ें.

मेनिफ़ेस्ट में इंटेंट सेवा तय करना

IntentService के लिए, आपके ऐप्लिकेशन मेनिफ़ेस्ट में भी एंट्री की ज़रूरत होती है. इस एंट्री को <service> एलिमेंट के तौर पर दें, जो <application> एलिमेंट का चाइल्ड हो:

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name">
        ...
        <!--
            Because android:exported is set to "false",
            the service is only available to this app.
        -->
        <service
            android:name=".RSSPullService"
            android:exported="false"/>
        ...
    </application>

android:name एट्रिब्यूट, IntentService की क्लास का नाम बताता है.

ध्यान दें कि <service> एलिमेंट में इंटेंट फ़िल्टर नहीं होता. इस सेवा को काम के अनुरोध भेजने वाला Activity, साफ़ तौर पर Intent का इस्तेमाल करता है. इसलिए, किसी फ़िल्टर की ज़रूरत नहीं है. इसका यह भी मतलब है कि एक ही ऐप्लिकेशन या एक ही उपयोगकर्ता आईडी वाले दूसरे ऐप्लिकेशन के कॉम्पोनेंट ही इस सेवा को ऐक्सेस कर सकते हैं.

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