2011-02-12 4 views
19

onResume() मुझे क्या करना है:अजीब "रिसीवर पंजीकृत नहीं" अपवाद

registerReceiver(timeTickReceiver, new IntentFilter(Intent.ACTION_TIME_TICK)); 

और onPause() में:

unregisterReceiver(timeTickReceiver); 

मैं देख रहा हूँ "java.lang.IllegalArgumentException: रिसीवर पंजीकृत नहीं" एंड्रॉइड डेवलपर कंसोल में रिपोर्ट (केवल 2 रिपोर्ट हैं और मेरे ऐप में हजारों उपयोगकर्ता हैं)। अपवाद रजिस्ट्रार() द्वारा अपवाद को ट्रिगर किया जाता है। क्या हो रहा है? मुझे कोशिश करने के साथ बस इसे घेरने के लिए बहुत आत्मविश्वास महसूस नहीं होता है।

+0

यह एपीआई संस्करण किस पर होता है? –

+0

मुझे नहीं पता, मैं त्रुटि रिपोर्ट में नहीं देख सकता। – fhucho

+0

मुझे लगता है कि कुछ फोनों पर 'ऑनर्यूम' घटना हमेशा 'ऑनक्रेट' के बाद नहीं आती है जो बदले में इस गतिविधि के लिए पहले 'ऑन पॉज़' में समस्याएं पैदा करती है। – Xion

उत्तर

19

हम जब एक पर एक लंबे प्रेस कर रही इस त्रुटि को देखा है विशेष स्क्रीन, और फिर तुरंत दो अभिविन्यास परिवर्तन कर रहे हैं (उदाहरण के लिए डिवाइस को उल्टा करना)।

unregisterReceiver के लिए एपीआई डॉक्स का कहना है:

अपंजीकृत एक पहले से पंजीकृत BroadcastReceiver।

यह स्पष्ट रूप से नहीं कहता है, लेकिन जैसा कि आपने देखा है, तो आपने IllegalArgumentException: Receiver not registered मारा है यदि यह पहले से पंजीकृत नहीं है।

मैं जिस कामकाज का उपयोग कर रहा हूं वह मेरे रिसीवर को सदस्य क्षेत्र के रूप में स्टोर करना है, और जब भी यह पंजीकृत नहीं होता है, तो यह शून्य हो जाता है, यानी मैं इसे शून्य करने के लिए प्रारंभ करता हूं, और फिर इसे पंजीकृत करते समय इसे सेट करता हूं। यह सही नहीं हो सकता है, लेकिन यह मेरी दुर्घटनाओं को हल करता है!

private Receiver mReceiver = null; 
से

मेरी onServiceConnected:

sLog.debug("Registering receiver"); 
mReceiver = new Receiver(); 
registerReceiver(mReceiver, filter); 

से मेरी onServiceDisconnected:

if (mReceiver == null) 
{ 
    sLog.info("Do not unregister receiver as it was never registered"); 
} 
else 
{ 
    sLog.debug("Unregister receiver"); 
    unregisterReceiver(mReceiver); 
    mReceiver = null; 
} 
2

मुझे लगता है कि कुछ ऐसे राज्य हो सकते हैं जहां रिसीवर वास्तव में पहले पंजीकृत नहीं है। एक उपयोगकर्ता ऐप से बाहर निकलता है।

आप अपंजीकृत चलाने से पहले रिसीवर के लिए एक जांच जोड़ने का प्रयास करना चाहते हो सकता है, (मैं इस कई मामलों में किया है):

protected void onPause() { 
    if(timeTickReceiver != null) { 
    unregisterReceiver(timeTickReceiver); 
    } 
} 
0

एक BroadcastReceiveronCreate() जीवन चक्र विधि में पंजीकृत किया जाना चाहिए:

private BroadcastReceiver receiver; 

@Overrride 
public void onCreate(Bundle savedInstanceState){ 
    IntentFilter filter = new IntentFilter(); 

    receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      ... 
     } 
    } 

    registerReceiver(receiver, filter); 
}  

और एक BroadcastReceiveronDestory() जीवन चक्र विधि में अपंजीकृत किया जाना चाहिए:

@Override 
protected void onDestroy() { 
    unregisterReceiver(receiver); 
} 

यह एक BroadcastReceiver जो अब तक पंजीकृत नहीं किया गया है पंजीकरण रद्द की परिदृश्य नहीं कर पाएगा।

+0

नष्ट होने पर (https://developer.android.com/reference/android/app/Activity.html#onDestroy%28%29) नहीं कहा जा सकता है, इसे रिज्यूम-ऑन पॉज़ – Picci

5

एक प्रसारण रिसीवर की कोशिश/कोड के आसपास कैच ब्लॉक रैप करने के लिए onPause() जीवन चक्र विधि

protected void onPause() { 
    this.unregisterReceiver(reciever); 
    super.onPause(); 
} 
+0

पर बाध्य करने का एक बेहतर विचार है स्रोत कहां है ? –

2

सबसे आसान विकल्प होगा में अपंजीकृत होना चाहिए।

try{ 
    ... 
    this.unregisterReceiver(reciever); 
    } 
    catch(IllegalArgumentException e) 
    { 
     // TODO: handle exception 
    } 
    catch (Exception e) { 
     // TODO: handle exception 
    }