handleWindowVisibility: no activity for token android.os.BinderProxy

31,550

Solution 1

This code Seems correct but my only suspicion is that when you want to open the new activity in startActivity(intent), the error occurs.
So check the next fired class named SelfieCapture.class to see whether it extends from MyBaseActivity also.
Also consider that when you want to get the currentActivity, if you put it in onCreate, you will get null. For more information please refer to Understand the Activity Lifecycle.

Solution 2

In some cases, I've found that using onCreate with a persistentState parameter can cause the issue:

    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
        super.onCreate(savedInstanceState, persistentState)
    }

Changing the onCreate to only use the savedInstanceState parameter fixes the issue:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

Solution 3

I Don't know Why and How but what i did is I just build > Rebuilt Project then after it rebuilt, I just File > Invalidate Caches / Restart

and then my activity was working perfectly...!

Solution 4

In my case, This occurred when i was trying to pass a really long JSON string through intent extras. From what I can infer , passing a really large value through the extra bundle might lead to memory issues when starting the new intent. Try using shared preferences or serializable objects to share large stuff between activities

Hope that helped!

Share:
31,550
Massoud
Author by

Massoud

Updated on April 13, 2021

Comments

  • Massoud
    Massoud about 3 years

    I have a Login screen and upon success login, it finishes and shows another page that has information about the user.
    I read about this post and also this post.
    I also read a lot about how we extend Application class but still it is not possible for me to run this code.
    Below you can find my code and I will explain the error also.

    This is how I user Volley to call an AsyncTask:
    The error is like no activity for token android.os.BinderProxy and it will come when I call startActivity(intent);.
    I know this error is because the activity is killed and the AsyncTask after Volley response wants to use a killed context but I don't know how to fix it.

    Util.request_function(
         activity,
         MainActivity.user_session,
         key_value,
         new VolleyCallback() {
              @Override
              public void onSuccess(JSONObject result, Context context) {
    
                     Activity activity = 
                     MyBaseActivity.myCustomApplication.getCurrentActivity();
                     Intent intent = new Intent(activity, SelfieCapture.class);
                     startActivity(intent);
                     finish();
              }
              @Override
              public void onError(String result) {
    
              }
    });
    

    I have interfaces as below:
    VolleyCallback.java:

    public interface VolleyCallback {
        void onSuccess(JSONObject result) throws JSONException;
        void onError(String result) throws Exception;
    }
    

    Util.java

    public static void request_function(Context context, CognitoUserSession cognitoUserSession, Map<String, String> key_value, final VolleyCallback callback) {
            JSONObject jsonBody = new JSONObject();
            CustomJSONObjectRequest postRequest = new CustomJSONObjectRequest(Request.Method.POST,
                    MainActivity.API_URL,
                    null,
                    response -> {
                       JSONObject jsonObject = (JSONObject) response;
                       //SoMe Stuff//
                       callback.onSuccess(null);
                 }, error -> {
                       //Log Error//
                 }){
                      @Override
                      public String getBodyContentType() {
                             return "application/json; charset=utf-8";
                      }
    
                      @Override
                      public Map<String, String> getHeaders() {
                      final Map<String, String> headers = new HashMap<>();
                      headers.put("Content-Type", "application/json");
                             return headers;
                      } 
    
                      @Override
                      public byte[] getBody() {
                             return jsonBody.toString().getBytes();
                      }
            };
         // Request added to the RequestQueue
         VolleyController.getInstance(context).addToRequestQueue(postRequest);
    
    

    MyCustomApplication.java

    public class MyCustomApplication extends Application {
    
        private Activity mCurrentActivity = null;
    
        public void onCreate() {
            super.onCreate();
    
        }
    
        public Activity getCurrentActivity() {
            return mCurrentActivity;
        }
    
        public void setCurrentActivity(Activity mCurrentActivity) {
            this.mCurrentActivity = mCurrentActivity;
        }
    }
    

    MyBaseActivity.java

    public class MyBaseActivity extends Activity {
        public static MyCustomApplication myCustomApplication;
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            myCustomApplication = (MyCustomApplication)this.getApplicationContext();
        }
        protected void onResume() {
            super.onResume();
            myCustomApplication.setCurrentActivity(this);
        }
        protected void onPause() {
            clearReferences();
            super.onPause();
        }
        protected void onDestroy() {
            clearReferences();
            super.onDestroy();
        }
    
        private void clearReferences(){
            Activity currActivity = myCustomApplication.getCurrentActivity();
            if (this.equals(currActivity))
                myCustomApplication.setCurrentActivity(null);
        }
    }