【问题标题】:Local Broadcast Receiver Exception: android.app.IntentReceiverLeaked?本地广播接收器异常:android.app.IntentReceiverLeaked?
【发布时间】:2018-10-08 07:38:01
【问题描述】:

注意:带有android:excludeFromRecents="true"的活动标志

@Override
    protected void onDestroy() {

        sendBroadcast(new Intent("com.android.servicerestart"));
        if(broadcastReceiver != null) {
            try {
                unregisterReceiver(broadcastReceiver);
            }
            catch (IllegalArgumentException E)
            {

            }
        }

        super.onDestroy();
        Log.e("Activity","In OnDestroy");
    }

    @Override
    protected void onPause() {

        if(broadcastReceiver != null) {
            try {
                unregisterReceiver(broadcastReceiver);
            }
            catch (IllegalArgumentException E)
            {
                E.printStackTrace();
            }
        }
        super.onPause();
        Log.e("Activity","In OnPause");
    }

    @Override
    protected void onResume() {

        registerReceiver();
        super.onResume();
        Log.e("Activity","In onResume");
    }

    @Override
    protected void onStart() {
        super.onStart();
        try {
            registerReceiver();
        }
        catch (Exception E)
        {

        }
    }

registerReceiver();

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

        }
    };

    try {
        registerReceiver(broadcastReceiver, new IntentFilter("*******.receive.service.download"));
    }
    catch (Exception E)
    {

    }
}

日志

E/ActivityThread: Activity **********.activity.MainActivity has leaked IntentReceiver **********.activity.MainActivity$3@3318724 that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Activity **********.activity.MainActivity has leaked IntentReceiver **********.activity.MainActivity$3@3318724 that was originally registered here. Are you missing a call to unregisterReceiver()?
    at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:1164)
    at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:951)
    at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1308)
    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1288)
    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1282)
    at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:586)
    at **********.activity.MainActivity.registerReceiver(MainActivity.java:203)
    at **********.activity.MainActivity.onStart(MainActivity.java:156)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1255)
    at android.app.Activity.performStart(Activity.java:6853)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2712)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2810)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1530)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6256)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:793)

【问题讨论】:

  • 为什么你注册和注销接收器两次?只需在 onResume() 和 onPause() 中注册和注销即可
  • 注册和注销接收器两次?为什么为什么? onPause() -&gt; onStop(),这是生命周期。现在,onPause() 已经注销了您的接收器,并出现了后者的onStop() 调用,它试图注销以前未注册的接收器,这就是您收到此异常的原因。我建议您在 resume-pause 或 start-stop lifecylce 方法对中注册-取消注册——不要同时使用。
  • 发生这种情况是因为我注册了接收者和未注册的接收者两次?
  • 我清楚地看到的一件事是,您应该在每次调用 unregisterReceiver(broadcastReceiver); 后设置 broadcastReceiver = null
  • @ZeekHuge 好的,我会试试的

标签: java android broadcastreceiver intentfilter


【解决方案1】:

这是一个生命周期问题

startresume 都注册了一个接收器 - 但是没有检查一个接收器是否已经存在(所以你注册了两个单独的接收器)

这意味着在pausedestroy 方法上只能看到第二个,而第一个被泄露。

最好的解决方法是移除启动/销毁块。否则,您可以将 new BroadcastReceiver 块包装在 if (broadcastReceiver == null)

【讨论】:

  • 对不起先生小姐了解活动生命周期
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多