Home » Android » java – Activity has leaked IntentReceiver – LollipopBrowserAccessibilityManager

java – Activity has leaked IntentReceiver – LollipopBrowserAccessibilityManager

Posted by: admin May 14, 2020 Leave a comment

Questions:

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.cont[email protected]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.cont[email protected]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

How to&Answers:

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/

Answer:

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.