2013-02-27 27 views
11

दबाए जाने पर मैंने अपने ऐप द्वारा अपना headset buttons get recognized प्राप्त करने में कामयाब रहा, लेकिन बटनों में से एक को MyCustomActivity में एक विधि को कॉल करने की आवश्यकता है। समस्या onReceive के 1 पैरामीटर एक प्रसंग है कि गतिविधि में ढाला नहीं जा सकता है और एक MyCustomActivity के भीतरी वर्गwon't work in Android 4.1 का उपयोग कर जब तक यह स्थिर है (है ही।ब्रॉडकास्ट रिसीवर के उप-वर्ग में पैरामीटर कैसे पास करें?

MyCustomActivity की विधि का उपयोग करने की अक्षमता की समस्या तो एकमात्र विकल्प छोड़ दिया है जो मेरे लिए (क्रम दोनों 2.x और 4.1 का समर्थन करने के) RemoteControlReceiver को पैरामीटर के रूप गतिविधि पारित करने के लिए है

लेकिन मैं कैसे करते हो कि, जब एक ही रास्ता का दृष्टांत को यह माध्यम से होता है:।

private ComponentName mRemoteControlReceiver = new ComponentName(this, RemoteControlReceiver.class); 

जो acc नहीं है कोई अतिरिक्त पैरामीटर ept?

कोई विचार इस सीमा के आसपास कैसे काम करना है?

नोट: अगर मैं एक पैरामीटर के साथ एक निर्माता होने के रूप में RemoteControlReceiver परिभाषित करने की कोशिश, मैं निम्नलिखित अपवाद प्राप्त करते हैं:

E/AndroidRuntime(2836): java.lang.RuntimeException: Unable to instantiate receiver com.example.RemoteControlReceiver: java.lang.InstantiationException: can't instantiate class com.example.RemoteControlReceiver; no empty constructor 

Caused by: 
E/AndroidRuntime(2836): Caused by: java.lang.InstantiationException: can't instantiate class com.example.RemoteControlReceiver; no empty constructor 
E/AndroidRuntime(2836):  at java.lang.Class.newInstanceImpl(Native Method) 
E/AndroidRuntime(2836):  at java.lang.Class.newInstance(Class.java:1319) 
E/AndroidRuntime(2836):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2205) 

तो यह स्पष्ट है कि इस नए registerMediaButtonEventReceiver आवश्यकता (Android 4.1 में प्रस्तुत) खाली कन्स्ट्रक्टर की अपेक्षा करता है।

क्या इस के आसपास काम करने का कोई तरीका नहीं है?

उदाहरण के लिए, वास्तविक रिमोट कंट्रोल रिसीवर ऑब्जेक्ट का संदर्भ प्राप्त करने का कोई तरीका है (तत्काल अप्रत्यक्ष रूप से mAudioManager.registerMediaButtonEventReceiver() के माध्यम से)? ताकि मैं के बाद RemoteControlReceiver के डेटा-सदस्य को सेट करने के लिए एक्सेसर का उपयोग कर सकूं, इसे तुरंत चालू किया गया है?

+1

आप ब्रॉडकास्ट रेसियर को ऑनस्यूम/ऑनक्रेट ऑफ द एक्टिविटी में बना और पंजीकृत कर सकते हैं और अंदर/ऑनस्टॉप पर पंजीकरण रद्द कर सकते हैं। इस तरह से वर्तमान गतिविधि अपने जीवनकाल का ख्याल रख सकती है और रिसीवर अपने कंटेनर (गतिविधि) से संवाद करने में सक्षम होना चाहिए। –

+2

@ सुदर्शनमलन मैंने पहले ही यह कोशिश की है। यह [केवल एंड्रॉइड 2.x में काम करता है] (http://stackoverflow.com/questions/15058743/how-do-i-register-in-manifest-an-inner-media-button-broadcastreciver#comment21174031_15058783)। यह 4.1 में काम नहीं करता है। मुझे किसी भी तरह से 'रिमोट कंट्रोल रिसीवर' (ब्रॉडकास्ट रिसीवर!) को MyCustomActivity के बारे में जानने में सक्षम होना चाहिए। धन्यवाद। – an00b

+0

यह एक कठिन है लेकिन यहां एक विचार है: क्या आप [अतिरिक्त] (http://stackoverflow.com/a/14383023/418055) को इरादे पर प्राप्त कर सकते हैं? या इस [ग्लोबल वैरिएबल चाल] का उपयोग करें (http://stackoverflow.com/a/6980006/418055)? –

उत्तर

6

registerMediaButtonEventReceiver को एप्लिकेशन प्रकट में ब्रॉडकास्ट रिसीवर घोषित करने की आवश्यकता है। इसका मतलब है कि रिसीवर एक स्टैंडअलोन क्लास होना चाहिए, जिसका अर्थ है कि यह आपकी वर्तमान गतिविधि या सेवा के बारे में कुछ भी नहीं जानता है। रिसीवर इसे करने के लिए संदेश को अग्रेषित कर सकते हैं ताकि

  • गतिविधि या सेवा के लिए एक स्थिर वैश्विक का उपयोग करें:

    आदेश अपनी गतिविधि या सेवा के लिए यह संदेश प्राप्त करने के लिए, आप विकल्पों की एक संख्या है। यह आमतौर पर एक अच्छा विचार नहीं है क्योंकि यह लीक की ओर जाता है और जब आप कोड को बाद में बदलना चाहते हैं तो बहुत अनुकूल नहीं होता है। आम तौर पर अवशेषों से बचा जाना चाहिए।

  • एक विशिष्ट वर्ग को संदेश दोबारा प्रसारित करें, जो उस गतिविधि या सेवा का आंतरिक वर्ग होता है जिसे आप आमंत्रित करना चाहते हैं। जैसे registerMediaButtonEventReceiver के लिए BroadcastReceiver में:

    // Standalone class, declared in the manifest 
    public class ButtonReceiver extends BroadcastReceiver { 
        @Override 
        public void onReceive(final Context context, final Intent intent) { 
         Intent intent = new Intent(); 
         intent.setAction("com.foo.ACTION"); 
    
         // Rebroadcasts to your own receiver. 
         // This receiver is not exported; it'll only be received if the receiver is currently registered. 
         context.sendBroadcast(intent); 
        } 
    } 
    

और अपनी गतिविधि में:

class MyActivity extends Activity { 
     private BroadcastReceiver myReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(final Context context, final Intent intent) { 
       MyActivity.this.onMessageReceived(); 
      } 
     } 
     @Override 
     protected void onResume() { 
      registerReceiver(myReceiver, new IntentFilter("com.foo.ACTION")); 
     } 

     @Override 
     protected void onPause() { 
      unregisterReceiver(myReceiver); 
     } 

     private void onMessageReceived() { 
     } 
    } 
  • उपरोक्त विधि की तरह, यह जरूरी एक प्रसारण होने के लिए नहीं है, यह हो सकता है आपके उपयोग के मामले के आधार पर, गतिविधि के लिए एक इरादा पास किया गया।SendBroadcast का उपयोग करने के बजाय ऐसा करने के लिए, आप startActivity (या यदि आप सेवा का उपयोग कर रहे हैं तो स्टार्ट सेवा) का उपयोग करेंगे।
+2

अपने पुनः प्रसारण नुस्खा एक आकर्षण की तरह काम करता है। धन्यवाद! – an00b

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