取消注册接收器无法取消注册 onDestroy

use*_*565 2 android localbroadcastmanager

我在主活动中使用 BroadcastReceiver 并在 OnCreate 中注册它并尝试在 Destroy 上取消注册它,但有时应用程序崩溃,因为它表明我正在尝试取消注册已取消注册的接收器。这是我的代码:

\n\n
@Override\n    public void onCreate(Bundle savedInstanceState) {\n        ...\nLocalBroadcastManager.getInstance(this).registerReceiver(forceLogoutRequest, new IntentFilter(CommonUtils.FORCE_LOGOUT));\n}\n\n @Override\n    public void onDestroy() {\n super.onDestroy();\nif(forceLogoutRequest!=null) {\n            unregisterReceiver(forceLogoutRequest);\n            forceLogoutRequest = null;\n        }\n}\n\n\n  private BroadcastReceiver forceLogoutRequest = new BroadcastReceiver() {\n        @Override\n        public void onReceive(Context context, Intent intent) {\n            ..\n            ..\n\n        }\n    };\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是我在控制台中得到的:

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

sha*_*mar 6

用这个代替

LocalBroadcastManager.getInstance(this).unregisterReceiver(forceLogoutRequest);
Run Code Online (Sandbox Code Playgroud)

有关使用 localBroadCastManager 的更多信息,请查看此链接https://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html