2012-04-03 6 views
7

मैं एक निम्नलिखित निर्माता के साथ एक सेवा है:एक कन्स्ट्रक्टर के साथ एंड्रॉइड सेवा को तुरंत कैसे चालू करें?

public ShimmerService(Context context, Handler handler) { 
    mHandler = handler; 
} 

मैं इस सेवा वर्ग का दृष्टांत करना चाहते हैं। मैं कोड निम्नलिखित है, लेकिन, मुझे यकीन है कि जहां परमाटर पारित करने के लिए नहीं कर रहा हूँ:

private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder binder) { 
     mShimmerService = ((ShimmerService.ShimmerConfigureBinder) binder) 
       .getService(); 
     Toast.makeText(ConfigureShimmer.this, 
       "Shimmer service has succesfully started.", 
       Toast.LENGTH_SHORT).show(); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     mShimmerService = null; 
    } 
}; 

मैं बंधन सहित सब कुछ किसी और सेटअप प्रारंभ पर और इतने पर, की है। लेकिन मुझे उपरोक्त कोड में त्रुटि मिलती है:

04-03 19:06:10.285: E/AndroidRuntime(16837): java.lang.RuntimeException: Unable to instantiate service com.milanix.androidecg.services.ShimmerService: java.lang.InstantiationException: can't instantiate class com.milanix.androidecg.services.ShimmerService; no empty constructor 

मैं इस समस्या को कैसे ठीक करूं? मुझे पैरामीटर पास करने की आवश्यकता होगी? कोड काम करता है के बाद लेकिन, यह नहीं बल्कि सेवा वर्ग एक वर्ग के रूप में, का उपयोग करता है बल्कि सेवा की तुलना में:

mShimmerService = new ShimmerService(this, mHandler); 

उत्तर

11

आप सेवाओं (या गतिविधियों, या प्रसारण रिसीवर) का निर्माण नहीं होना चाहिए स्पष्ट रूप से। एंड्रॉइड सिस्टम आंतरिक रूप से करता है। सेवा बनाने का उचित तरीका startService() के माध्यम से एक इरादे से है; उस इरादे में अतिरिक्त पैरामीटर जोड़ने के लिए स्वतंत्र महसूस करें।

+0

लेकिन, मैं हैंडलर का उपयोग करके और इरादा कैसे पास करूंगा? कोई उदाहरण? – Milan

+1

आपको उस हैंडलर के लिए क्या चाहिए? क्या आप निश्चित रूप से सेवा में स्क्रैच से हैंडलर का निर्माण करने में मदद नहीं करेंगे? सेवाएं धागे नहीं हैं; सेवा उपभोक्ता कोड के समान यूआई थ्रेड पर निष्पादित होती है। –

+0

मुझे नहीं पता कि इस संबंध में 'बाइंड सेवा 'और' स्टार्ट सेवा 'के बीच कोई अंतर है, लेकिन दस्तावेज़ीकरण और [इस चर्चा] के अनुसार (https://groups.google.com/d/topic/android- डेवलपर/onqqpHz2WQw/चर्चा) अतिरिक्त _might_ वहां नहीं है जब इरादा 'ऑनबिंड' में प्राप्त होता है। – DuneCat

1

सेवा संदर्भ बढ़ाती है, इसलिए आपको वास्तव में अपने कन्स्ट्रक्टर में पैरामीटर के रूप में इसकी आवश्यकता नहीं है, क्योंकि आप उसी उदाहरण का उपयोग कर सकते हैं।

यदि आपके पास कोई अन्य पैरामीटर है जिसे आप सेवा में पास करना चाहते हैं, तो मैं उन्हें अतिरिक्त सेवा के रूप में स्टार्ट सेवा उद्देश्यों में जोड़ने और उन्हें सेवा में लाने की सलाह दूंगा। स्टार्ट कॉमांड विधि।

+0

फिर से, इरादे का उपयोग करके हैंडलर को पास करना कैसे संभव है? – Milan

0

हैंडलर को सेवा में पास न करें, हैंडलर पार्ससेलबल या सीरियलज़ेबल को लागू नहीं करता है, इसलिए मुझे लगता है कि यह संभव नहीं है।

सेवा में हैंडलर बनाएं, और सेवा में इच्छित अतिरिक्त के माध्यम से हैंडलर बनाने के लिए आपको आवश्यक डेटा पास करें।

0

आपको अपनी सेवा कक्षा के लिए कोई तर्क-तर्ककर्ता नहीं होना चाहिए, अन्यथा सिस्टम यह नहीं जानते कि इसे कैसे चालू किया जाए।

0

सेवा के लिए हैंडलर (या जो भी वस्तु) पास करने के बजाय (जिस तरह से संभव नहीं है), आप अपनी गतिविधि कक्षा में ब्रॉडकास्ट रिसीवर बनाते हैं और पंजीकरण करते हैं। जब आपको हैंडलर फ़ंक्शन (या किसी अन्य ऑब्जेक्ट में जो भी फ़ंक्शंस) का आह्वान करने की आवश्यकता होती है तो पंजीकृत रिसीवर (sendBroadcast) पर प्रसारण भेजें। आप इरादे के लिए अतिरिक्त अतिरिक्त पैरामीटर भी डाल सकते हैं और आप पैरामीटर के अनुसार गतिविधि से सीधे सभी आवश्यक कोड को संभाल सकते हैं।

शायद, इस मामले में आपका हैंडलर पूरी तरह से हटा दिया जाएगा (आपको वास्तव में क्या चाहिए इसकी निर्भर करता है।)। प्रसारण रिसीवर के साथ, मुझे स्थिति की कल्पना करने की जानकारी नहीं है जब आपको किसी ऑब्जेक्ट को सेवा में पास करने की आवश्यकता होगी। दूसरी तरफ, आप कुछ अच्छा नहीं कर रहे हैं और आपको आवेदन के डिजाइन की समीक्षा करनी चाहिए।

अगर हम सेवा में कुछ पास करना चाहते हैं, तो हम केवल इरादे में अतिरिक्त पैरामीटर के साथ सेवा शुरू कर सकते हैं। सेवा इस पैरामीटर के अंदर राज्य को संभालती है।

विचार यह है कि सेवा स्वतंत्र रूप से अनुप्रयोगों के अन्य हिस्सों जैसे गतिविधियों से चल सकती है। जब हम सेवा शुरू करते हैं या बाहरी कोड का आह्वान करने के लिए प्रसारण भेजते हैं तो हम इसे अतिरिक्त पैरामीटर के साथ नियंत्रित कर सकते हैं।

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

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