2017-10-12 130 views
-1

我在我的主要活動中使用BroadcastReceiver並將其註冊到OnCreate並嘗試將其註冊到OnDestroy中,但一段時間應用程序崩潰,因爲它聲明我正試圖取消註冊已註銷的接收器。這裏是我的代碼:Unregister Receiver無法取消註冊onDestroy

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     ... 
LocalBroadcastManager.getInstance(this).registerReceiver(forceLogoutRequest, new IntentFilter(CommonUtils.FORCE_LOGOUT)); 
} 

@Override 
    public void onDestroy() { 
super.onDestroy(); 
if(forceLogoutRequest!=null) { 
      unregisterReceiver(forceLogoutRequest); 
      forceLogoutRequest = null; 
     } 
} 


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

     } 
    }; 

這是我收到的控制檯:

10-12 13:28:34.644 5772-6344/? E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.myapp.nurse, PID: 5772 
    java.lang.RuntimeException: Unable to destroy activity java.lang.IllegalArgumentException: Receiver not registered: [email protected] 
     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3812) 
     at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3830) 
     at android.app.ActivityThread.access$1400(ActivityThread.java:156) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:211) 
     at android.app.ActivityThread.main(ActivityThread.java:5373) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 
    Caused by: java.lang.IllegalArgumentException: Receiver not registered: [email protected] 
     at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:771) 
     at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1671) 
     at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:511) 
     at com.myapp.hp.nurse.activity.MainActivity.onDestroy(MainActivity.java:327) 
     at com.myapp.hp.nurse.activity.NfcEnabledActivity.onDestroy(NfcEnabledActivity.java:49) 
     at android.app.Activity.performDestroy(Activity.java:6169) 
     at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1141) 
     at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3799) 
     at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3830)  
     at android.app.ActivityThread.access$1400(ActivityThread.java:156)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405)  
     at android.os.Handler.dispatchMessage(Handler.java:102)  
     at android.os.Looper.loop(Looper.java:211)  
     at android.app.ActivityThread.main(ActivityThread.java:5373)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at java.lang.reflect.Method.invoke(Method.java:372)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)  
     10-12 13:28:36.316 5772-6344/? I/Process: Sending signal. PID: 5772 SIG: 9 
+0

這可能是接收器被打死你試圖殺死它 – Zoe

+0

檢查這個https://stackoverflow.com/questions前/ 6165070/receiver-not-registered-exception-error/24391706#24391706 – tamtom

+0

可能重複[Receiver not registered exception error?](https://stackoverflow.com/questions/6165070/receiver-not-registered-exception-error ) –

回答

1

用這個代替

LocalBroadcastManager.getInstance(this).unregisterReceiver(forceLogoutRequest); 

有關使用localBroadCastManager更多信息checke此鏈接https://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html

+0

啊,只是在我的代碼中找到這個錯誤。你是對的LocalBroadcastManager註銷這個 – user565

+0

是的,如果你使用全局廣播,那麼你可以直接使用取消註冊。任何快樂編碼:) – Anonymous

1

首先爲了取消註冊接收器,您需要使用LocalBroadcastManager

LocalBroadcastManager.getInstance(this).unregisterReceiver(YOURRECEIVER); 

,那麼你應該在註銷暫停您的接收器,而不是破壞