2013-02-04 69 views
1

我在動態註冊BroacasrReceiver CallReceiver時遇到問題。當CallReceiveronReceive方法被觸發時,引發致命異常。動態註冊BroadcastReceiver - 接收器未註冊

... 
private boolean isCRRegistered = false; 

public int onStartCommand (Intent intent, int flags, int startId) { 

    if(!isCRRegistered) { 
    IntentFilter filter2 = new IntentFilter("android.intent.action.PHONE_STATE"); 
    CallReceiver mCallReceiver = new CallReceiver(); 
    registerReceiver(mCallReceiver, filter2); 

    //registering some listener 
    mCallReceiver.registerListener(this); 
    } 
} 

註銷:

if(isCRRegistered) { 
     unregisterReceiver (mCallReceiver); 
} 

的logcat:

02-04 14:41:50.286: E/AndroidRuntime(28328): FATAL EXCEPTION: main 
02-04 14:41:50.286: E/AndroidRuntime(28328): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.PHONE_STATE flg=0x20000000 (has extras) } in [email protected] 
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:934) 
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.os.Handler.handleCallback(Handler.java:587) 
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.os.Handler.dispatchMessage(Handler.java:92) 
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.os.Looper.loop(Looper.java:143) 
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.app.ActivityThread.main(ActivityThread.java:4914) 
02-04 14:41:50.286: E/AndroidRuntime(28328): at java.lang.reflect.Method.invokeNative(Native Method) 
02-04 14:41:50.286: E/AndroidRuntime(28328): at java.lang.reflect.Method.invoke(Method.java:521) 
02-04 14:41:50.286: E/AndroidRuntime(28328): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
02-04 14:41:50.286: E/AndroidRuntime(28328): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
02-04 14:41:50.286: E/AndroidRuntime(28328): at dalvik.system.NativeStart.main(Native Method) 
02-04 14:41:50.286: E/AndroidRuntime(28328): Caused by: java.lang.IllegalArgumentException: Receiver not registered: [email protected] 
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.app.ActivityThread$PackageInfo.forgetReceiverDispatcher(ActivityThread.java:812) 
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:822) 
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331) 
02-04 14:41:50.286: E/AndroidRuntime(28328): at com.kris.intellignetringer.StateChecker.serviceDestroy(StateChecker.java:126) 
02-04 14:41:50.286: E/AndroidRuntime(28328): at com.kris.intellignetringer.StateChecker.onPhoneStateChange(StateChecker.java:36) 
02-04 14:41:50.286: E/AndroidRuntime(28328): at com.kris.intellignetringer.CallReceiver.onReceive(CallReceiver.java:50) 
02-04 14:41:50.286: E/AndroidRuntime(28328): at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:917) 
02-04 14:41:50.286: E/AndroidRuntime(28328): ... 9 more 
+0

http://stackoverflow.com/questions/4805269/programmatically-register-a-broadcast-receiver http://stackoverflow.com/questions/6508300/how-to-register-broadcast-receiver –

+0

我對你的回答當您嘗試註銷時,上一個問題會捕獲'IllegalArgumentException'。 –

回答

5

的錯誤不是在這裏!錯誤是當您註銷接收器時。看來你有條件地註冊接收器。

因此,在註銷接收器之前,請確保您已經真正註冊了它。

您可以使用註冊接收器後設置的布爾值。然後,當你想取消註冊接收者時,確保布爾值被設置,否則(如果不是(false)),你不註銷。

+0

按照你的建議我已經更新了我的代碼,但同樣的問題仍然存在。 – Kristopher

+1

@soulreaver你確定這是你唯一呼叫'unregisterReceiver'的地方! –

+0

你的評論已經清除了我的想法:)。謝謝! – Kristopher