2016-01-07 6 views
7

के बीच एंड्रॉइड का अंतर वर्तमान में मैं एक एंड्रॉइड प्रोग्राम लिख रहा हूं जिसके लिए IntentService की आवश्यकता है। जब मैं onHandleIntent फ़ंक्शन में कोड डालता हूं, तो कोड नहीं चलता है, लेकिन यह MainActivity में त्रुटियां नहीं देता है। लेकिन जब मैं अपना कोड onStartCommand में कॉपी करता हूं, तो यह पूरी तरह से चलता है।Android एंड्रॉइड और ऑनस्टार्ट कॉमांड

समस्या यह है कि मैं जानना चाहता हूं कि onHandleIntent और onStartCommand के बीच अंतर क्या हैं। धन्यवाद।

कोड:

onHandleIntent में:

System.out.println("SERVICE STARTED! ! !"); 
//System.out.println(intent.getBooleanExtra("once", Boolean.FALSE)); 
if (intent.getBooleanExtra("once", Boolean.FALSE)) { 
    Check(); 
} 
mHandler.postDelayed(mRunnable, 3000); 

उत्तर

21

रूप the docs से:

  • एक डिफ़ॉल्ट कार्यकर्ता धागा है कि सभी को निष्पादित करता है बनाता है:

    IntentService निम्नलिखित करता हैआपके आवेदन के मुख्य धागे से अलग onStartCommand() पर दिए गए इरादे।

  • एक कार्य कतार बनाता है जो आपके onHandleIntent() कार्यान्वयन के लिए एक समय में एक इरादा पास करता है, इसलिए आपको बहु-थ्रेडिंग के बारे में चिंता करने की ज़रूरत नहीं है।
  • सभी प्रारंभ अनुरोधों को संभालने के बाद सेवा बंद कर देता है, इसलिए आपको stopSelf() पर कॉल करने की आवश्यकता नहीं है।
  • onBind() का डिफ़ॉल्ट कार्यान्वयन प्रदान करता है जो null देता है।
  • कि आपके onHandleIntent() कार्यान्वयन के लिए काम कतार में आशय भेजता है और उसके बाद onStartCommand() की डिफ़ॉल्ट कार्यान्वयन प्रदान करता है।

और यह भी:

यह सब तथ्य onHandleIntent() लागू ग्राहक द्वारा प्रदान काम करने के लिए है कि तुम सब करने की जरूरत है अप करने के लिए कहते हैं। (हालांकि, आप भी सेवा के लिए एक छोटा सा निर्माता प्रदान करने के लिए की जरूरत है।)

तो एक IntentService एक "कस्टम" उन विशेष गुणों के साथ Service है। इसलिए onStartCommand(), वास्तव में, को ओवरराइड करने की कोई आवश्यकता नहीं है, आपको इसे नहीं करना चाहिए जबतक कि आप नियमित Service कक्षा का उपयोग नहीं कर रहे हों।

IntentService उपयोग के कुछ उदाहरण:

Activity.java

Intent it = new Intent(getApplicationContext(), YourIntentService.class); 
it.putExtra("Key", "Value"); 
startService(it); 

YourIntentService।जावा

public YourIntentService() { 
    super("YourIntentService"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 

    if (intent != null) { 
     String str = intent.getStringExtra("key"); 
     // Do whatever you need to do here. 
    } 
    //... 
} 

तुम भी अधिक जानकारी के बारे में Service और IntentService के लिए this tutorial या this one देख सकते हैं।

इसके अलावा, the docs देखें।

+2

वाह, यह अविश्वसनीय रूप से पूरी तरह से था। अच्छा उत्तर! – AdamMc331

+0

मैं ट्यूटोरियल के माध्यम से चला गया है, वे महान हैं! लेकिन क्या समस्या यह है कि मैंने 'ऑनस्टार्ट कमांड' या 'ऑनहेन्डइन्टेंट' पर 'ओवरइड' नहीं किया है? – Chromium

+0

आपने इस सवाल पर बताया कि आपने 'ऑनस्टार्ट कमांड' को ओवरराइड किया है, और आपको इसे 'IntentService' पर नहीं करना चाहिए। इसके बजाय 'onHandleIntent' का उपयोग करें, इसे स्वचालित रूप से बुलाया जाता है। – Mauker

3

onStartCommand का उपयोग तब किया जाता है जब आप Service का उपयोग करते हैं। जब आप IntentService का उपयोग करते हैं तो onHandleIntent का उपयोग किया जाना चाहिए। IntentServiceService फैलाता है। और प्रति प्रलेखन

के रूप में "आप अपने IntentService के लिए इस विधि (onStartCommand) पर हावी नहीं होना चाहिए। इसके बजाय, ओवरराइड onHandleIntent(Intent), जब IntentService एक शुरुआत के अनुरोध प्राप्त करता है जो प्रणाली कहते हैं।"

यदि आपने onStartCommand ओवरराइड किया है, तो हो सकता है कि आपका onHandleIntent कॉल न हो।

+1

यदि आप 'IntentService' का उपयोग करते समय ** ऑनस्टार्ट कमांड()' ओवरराइड करते हैं तो आपको अपना 'ऑनंडलइन्टेंट()' बाद में नहीं भेजा जाएगा, ** ** ** आपके 'ऑनस्टार्ट कमांड() 'की अंतिम पंक्ति है 'सुपर रिटर्न। ऑनस्टार्ट कमांड (इरादा, झंडे, startId) '। – GeertVc

1

आपको अपने इरादे सेवा के लिए onStartCommand() ओवरराइड नहीं करना चाहिए।

यदि आप करते हैं, तो return super.onStartCommand(); पर सुनिश्चित करें, क्योंकि यह कार्य कतार का इरादा भेजता है और फिर आपके ऑनंडलेंटेंट() कार्यान्वयन को भेजता है।

संबंधित मुद्दे