Вызывается ли onResume () перед onActivityResult ()?

79

Вот как устроено мое приложение:

  1. onResume () пользователю предлагается войти в систему
  2. Если пользователь входит в систему, он может продолжить использование приложения 3. Если пользователь выйдет из системы в любое время, я хочу снова запросить вход.

Как я могу этого добиться?

Вот моя MainActivity:

@Override
    protected void onResume(){
        super.onResume();

        isLoggedIn = prefs.getBoolean("isLoggedIn", false);

        if(!isLoggedIn){
            showLoginActivity();
        }
    }

Вот моя LoginActivity:

@Override
        protected void onPostExecute(JSONObject json) {
            String authorized = "200";
            String unauthorized = "401";
            String notfound = "404";
            String status = new String();

            try {
                // Get the messages array
                JSONObject response = json.getJSONObject("response");
                status = response.getString("status");

                if(status.equals(authorized)){
                    Toast.makeText(getApplicationContext(), "You have been logged into the app!",Toast.LENGTH_SHORT).show();
                    prefs.edit().putBoolean("isLoggedIn",true);

                    setResult(RESULT_OK, getIntent());
                    finish();
                }
                else if (status.equals(unauthorized)){
                    Toast.makeText(getApplicationContext(), "The username and password you provided are incorrect!",Toast.LENGTH_SHORT).show();
                     prefs.edit().putBoolean("isLoggedIn",true);
                }
                else if(status.equals(notfound)){
                    Toast.makeText(getApplicationContext(), "Not found",Toast.LENGTH_SHORT).show();
                     prefs.edit().putBoolean("isLoggedIn",true);
                }
            } catch (JSONException e) {
                System.out.println(e);
            } catch (NullPointerException e) {
                System.out.println(e);
            }
        }
    }

После того, как пользователь успешно вошел в систему:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            Toast.makeText(getApplicationContext(), "BOOM SHAKA LAKA!",Toast.LENGTH_SHORT).show();
        }
    }

Проблема в том, что onResume () вызывается перед onActivityResult (), поэтому, когда пользователь успешно вошел в систему, мое основное действие не получает уведомления, потому что onResume () вызывается первым.

Где лучше всего запрашивать вход?

Шихан Алам
источник

Ответы:

102

На самом деле вызов onActivityResult происходит до onResume (см. Документацию ). Вы уверены, что действительно запускаете действие, с которого хотели, startActivityForResultи что вы устанавливаете результат вызванного действия до того, RESULT_OKкак возвращаете значение для своего действия? Попробуйте просто ввести Logоператор в свой файл, onActivityResultчтобы записать это значение и убедиться, что оно сработало. Кроме того, где вы устанавливаете значение isLoggedInпредпочтения? Похоже, вы должны установить это trueв своей активности входа в систему, прежде чем она все равно вернется, но этого явно не происходит.

редактировать

В документах говорится:

Вы получите этот вызов непосредственно перед onResume () при перезапуске вашей деятельности.

Йони Самлан
источник
Я устанавливаю isLoggedIn после того, как пользователь вошел в систему. см. мой обновленный код. не уверен, что не так?
Sheehan Alam
1
вы правы, onActivityResult () вызывается до onResume (). Не знаете, почему тогда мои предпочтения читаются неправильно?
Sheehan Alam
4
Обратите внимание, что onActivityResultэто также вызывается раньше onStart, что многие люди считают ошибкой
Денис Княжев
30

С фрагментами это даже не так просто, как onActivityResult()вызов до вызова onResume(). Если действие, к которому вы возвращаетесь, было удалено за это время, вы обнаружите, что вызовы (например) getActivity()from onActivityResult()вернут null. Однако, если действие не было удалено, вызов getActivity()вернет содержащее действие.

Это несоответствие может быть источником трудно диагностируемых дефектов, но вы можете проверить поведение своего приложения, включив параметр разработчика «Не сохранять действия». Я обычно оставляю это включенным - я бы предпочел увидеть NullPointerExceptionв разработке, чем в производстве.

Фил Хей
источник
2

Вы можете абстрагироваться от состояния входа в систему от действия. Например, если пользователь может оставлять комментарии, позвольте действию onPost проверить состояние входа в систему и перейти оттуда, а не из состояния активности.

Sgarman
источник
0

Такие методы обратного вызова, как onResumeне подходят для достижения требуемой функциональности. Я бы предложил создать класс и добавить туда функцию входа / выхода. когда получен обратный вызов выхода, вызовите функцию входа.

Мадукар
источник