Activity has leaked IntentReceiver - LollipopBrowserAccessibilityManager

若如初见. 提交于 2019-12-18 19:27:16

问题


I hope to find some help here because I'm not familiar with BroadcastReceivers in Android. This piece of code opens a WebView redirect you to a login page and receives the login token once a URL change is detected. After that, the Activity is closed.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    mLoginWebView = (WebView) findViewById(R.id.webview_login);

    redirectUrl = getString(R.string.app_redirect_url);


    //RECEIVE PLATFORM ID
    Bundle bundle = getIntent().getExtras();
    if(bundle != null){
        platform = bundle.getInt(ConstantsHelper.LOGIN_EXTRA_TOKEN);
    }

    mLoginWebView.setWebViewClient(new WebViewClient() {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            Log.d(TAG, "URL change to to " + url + " was detected");

            if (url.contains(redirectUrl) || url.contains("passport.twitch.tv")) {

                Log.d(TAG, "Login with platform " + platform);

                switch (platform){

                    //GET INSTAGRAM AUTH TOKEN
                    case ConstantsHelper.ID_INSTAGRAM:{
                        String accessToken = url.split("=")[1];

                        SharedPreferenceHelper.putString(ConstantsHelper.PREF_INST_ACCESS_TOKEN, accessToken);
                        NetworkManager.getInstance().catchTokens();

                    }

                    //GET TWITCH AUTH TOKEN
                    case ConstantsHelper.ID_TWITCH:{
                        String accessToken = url.substring(url.indexOf("=") + 1, url.indexOf("&"));

                        SharedPreferenceHelper.putString(ConstantsHelper.PREF_TWITCH_ACCESS_TOKEN, accessToken);
                        NetworkManager.getInstance().catchTokens();

                    }

                }
                finish(); //Activity is closed
                return true;
            }
            return false;
        }


    });

    switch (platform){
        case 1: mLoginWebView.loadUrl(NetworkManager.getInstance().getInstagramAuthUrl(getApplicationContext()));
        case 4: mLoginWebView.loadUrl(NetworkManager.getInstance().getTwitchAuthUrl(getApplicationContext()));
    }


}

Nothing happens and LogCat is displaying this error:

Activity com.maximutan.socialmedia_feed_merger.activities.LoginActivity has leaked IntentReceiver org.chromium.content.browser.accessibility.LollipopBrowserAccessibilityManager$1@25014a that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Activity com.maximutan.socialmedia_feed_merger.activities.LoginActivity has leaked IntentReceiver org.chromium.content.browser.accessibility.LollipopBrowserAccessibilityManager$1@25014a that was originally registered here. Are you missing a call to unregisterReceiver()?
at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:962)
at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:763)
at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1179)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1159)
at android.app.ContextImpl.registerReceiver(ContextImpl.java:1153)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:554)
at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:554)
at org.chromium.content.browser.accessibility.LollipopBrowserAccessibilityManager.<init>(LollipopBrowserAccessibilityManager.java:3)
at org.chromium.content.browser.accessibility.BrowserAccessibilityManager.create(BrowserAccessibilityManager.java:2)
at org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)

at org.chromium.base.SystemMessageHandler.handleMessage(
SystemMessageHandler.java:7)  
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5527)
,at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(
ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)

My problem is that I don't know which BroadcastReceiver I have to unregister since I hadn't created and initialized one.

Thanks for your help


回答1:


This issue occurs when destroy() is called on the WebView when the WebView is still attached to its parent view.

The crash can be resolved by first removing the Webview from it's parent view before calling destroy().

Note that even if you are not calling destroy() manually (like was the case for me) this crash can still occur. I found that the key is that you have to explicitly destroy a WebView (at least in a fragment), as Android doesn’t handle this for you, and prior to doing that, you have to remove it from its parent view.

For example, if you have a WebView fragment:

 @Override
    public void onDestroyView() {
        super.onDestroyView();

        // destroy the WebView completely
        if (mWebView != null) {
            // the WebView must be removed from the view hierarchy before calling destroy
            // to prevent a memory leak
            // See https://developer.android.com/reference/android/webkit/WebView.html#destroy%28%29
            ((ViewGroup) mWebView.getParent()).removeView(mWebView);
            mWebView.removeAllViews();
            mWebView.destroy();
            mWebView = null;
        }
    }

Full credit to Billy Brawner: https://brawner.tech/2017/12/03/webview-memory-leak/




回答2:


Are you using any of the following WebSettings?

    settings.setAllowContentAccess(true);
    settings.setAllowFileAccessFromFileURLs(true);
    settings.setAllowUniversalAccessFromFileURLs(true);
    settings.setAllowFileAccess(true);

I found that by disabling these options, (I didn't actually need them in my instance), the error went away. I'm guessing it has something to do with a compatibility library needed for one of these.



来源:https://stackoverflow.com/questions/45744881/activity-has-leaked-intentreceiver-lollipopbrowseraccessibilitymanager

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!