2014-05-11 7 views
7

अब गतिविधि तीन में से एक तरीके का उपयोग कर सेवाओं से कनेक्ट कर सकते हैं: AIDL सेवा और गतिविधि के बीच संवाद करने का सबसे अच्छा तरीका कौन सा है?

  • BroadcastReceivers
  • Messengers
  • मुझे लगता है कि BroadcastReceivers संवाद करने के लिए सबसे आसान तरीका है, लेकिन मैं सोच रहा हूँ क्यों और कब अन्य तरीकों का उपयोग करें? या दूसरे शब्दों में किस मामले में संदेशवाहक या एआईडीएल प्रसारणकर्ताओं की तुलना में उपयोग करने का सबसे अच्छा अभ्यास होगा?

+1

आपको यह विचार करने से शुरू करना चाहिए कि आपकी सेवा आपकी गतिविधि की एक ही प्रक्रिया में चल रही है या फिर यह आपकी गतिविधि के बाद एक अलग प्रक्रिया पर चल रही है। – Eido95

+0

हाँ मैंने अपने नवीनतम प्रोजेक्ट से पहले और पहले बाध्यकारी उपयोग किया है, मैंने ब्रॉडकास्ट का उपयोग किया और प्रसारण – yeahman

उत्तर

8

आप BroadcastReceiver जब तुम डब्ल्यू का उपयोग कर सकते आपके आवेदन में Service और Activity के बीच संचार चींटी।

Messenger और AIDL का मुख्य रूप से उपयोग किया जाता है जब आपके एप्लिकेशन को अन्य प्रक्रियाओं (IPC) से संवाद करने की आवश्यकता होती है। इस मामले में आपके इंटरफेस में Service होना चाहिए जो Handler को परिभाषित करता है जो विभिन्न प्रकार के Message ऑब्जेक्ट्स का जवाब देता है।

अब Messenger और AIDL के बीच का अंतर बहुत आसान है। जब आप Messenger का उपयोग करते हैं, तो यह सभी अनुरोधों को एक थ्रेड में कतार देता है। तो आपके Service को थ्रेड सुरक्षित नहीं होना चाहिए। यदि, आप एक साथ कई अनुरोधों को संभालने के लिए अपने Service चाहते हैं, तो आप सीधे AIDL का उपयोग कर सकते हैं। इस मामले में, आपके Service को बहु-थ्रेडिंग करने में सक्षम होना चाहिए और थ्रेड-सुरक्षित बनाया जाना चाहिए। वास्तव में MessengerAIDL के शीर्ष पर लागू किया गया है।

बेहतर समझ के लिए Bound Services

को देखो आप भी अपनी service is used only by the local application हैं से BroadcastReceiver or Messenger via Handler

10

मैं ज्यादातर LocalBroadcasts का उपयोग करता हूं। वे अनिवार्य रूप से असली प्रसारण की तरह हैं, लेकिन केवल आपके आवेदन के लिए दृश्यमान हैं।

private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if(Intent.SOME_ACTION.equals(action)) { 
      // Do your work 
     } 
    } 
}; 

फिर आप रजिस्टर और BroadcastReceiver इस तरह का पंजीकरण रद्द कर सकते हैं::

@Override 
public void onResume() { 
    super.onResume(); 

    IntentFilter intentFilter = new IntentFilter(Intent.SOME_ACTION); 

    LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity()); 
    manager.registerReceiver(broadcastReceiver, intentFilter); 
} 

@Override 
public void onPause() { 
    super.onPause(); 

    LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity()); 
    manager.unregisterReceiver(broadcastReceiver); 
} 

और अंत में आप अपने Service से एक प्रसारण भेज सकते हैं सबसे पहले आप की तरह आप एक सामान्य प्रसारण के साथ ही किसी BroadcastReceiver बनाने के लिए या इस तरह अपने आवेदन में कहीं और:

Intent intent = new Intent(Intent.SOME_ACTION); 

LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity()); 
manager.sendBroadcast(intent); 
+2

से सहमत होने के लिए बहुत आसान है। यह, या तृतीय-पक्ष संदेश बसें (स्क्वायर ओटो, ग्रीनबोट का इवेंटबस), वर्तमान सर्वोत्तम प्रथाएं हैं। – CommonsWare

+0

बहुत कुछ, लेकिन मैं सोच रहा हूं कि कब दूतों का उपयोग करना है !! –

+0

'मेसेंजर' का आमतौर पर उपयोग नहीं किया जाता है, यही कारण है कि इस विषय पर बहुत कम दस्तावेज क्यों है। वे ज्यादातर विभिन्न प्रक्रियाओं में संचार के लिए उपयोग किया जाता है। –

2

जवाब की जांच होनी चाहिए और, तो आप अपने खुद Binder class अपने ग्राहक प्रत्यक्ष प्रावधान है कि लागू कर सकते हैं प्रक्रियाओं में काम करने की जरूरत नहीं है public methods in the service तक पहुंच।

नोट: यह केवल तभी काम करता है जब ग्राहक और सेवा एक ही एप्लिकेशन और प्रक्रिया में हों, जो सबसे आम है।

बाइंडर वर्गhttp://developer.android.com/guide/components/bound-services.html#Binder

3

Xaver Kapeller के जवाब विस्तार वास्तव में एक अच्छी से एक है। हालांकि, इसमें एक (प्रमुख) दोष है: प्रसारण याद किया जा सकता है।

जब उपयोगकर्ता Activity (उदाहरण के लिए हालिया ऐप्स दिखाकर) से दूर निकलता है, तो आप अपने BroadcastReceiver s को अनधिकृत करते हैं। यदि प्रसारण उस पल में भेजा जाता है, तो आपके Activity इसे प्राप्त नहीं करता है। अपने Activity पर वापस जाकर, यह एक अमान्य स्थिति में हो सकता है।


ResultReceiver का उपयोग करके, आपको अभी भी इस मामले में परिणाम प्राप्त होता है। इसके अलावा, ResultReceiverparcelable है, इसलिए आप इसे जीवन चक्र घटनाओं में सहेज और पुनर्स्थापित कर सकते हैं।
हालांकि यह कुछ ओवरहेड का कारण बनता है, इसलिए मैंने इसे कम करने के लिए this experimental library बनाया है। अभी के लिए यह केवल IntentService एस का उपयोग करता है, लेकिन यह विस्तार करने के लिए काफी आसान होना चाहिए।

+0

हाँ यह सच है कि ब्रॉडकास्ट को याद किया जा सकता है, लेकिन आम तौर पर यदि आपका ऐप प्रसारण करने पर निर्भर करता है तो आप कुछ गलत कर रहे हैं। वास्तव में डेटा या कुछ भी स्थानांतरित करने के लिए स्थानीय प्रसारण का उपयोग कभी नहीं किया जाना चाहिए। उदाहरण के लिए स्थानीय प्रसारण के लिए एक केस केस यह होगा कि आप एक 'फ्रैगमेंट' को सूचित करते हैं कि कोई कार्य समाप्त हो गया है या डेटा बदल गया है और इसे पुनः लोड करने की आवश्यकता है, दूसरे शब्दों में जो ऐप की स्थिति के लिए अप्रासंगिक हैं, वे बस देते हैं अतिरिक्त - लेकिन अनिवार्य रूप से अनावश्यक - जानकारी। –

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

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