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

Вот как выкладывается мое приложение:

  • onResume() пользователю предлагается войти в систему
  • Если пользователь входит в систему, он может продолжить использование приложения 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(), поэтому, когда пользователь успешно вошел в систему, моя основная активность не получает уведомления, потому что firstResume() сначала вызывается.

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

Ответ 1

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

Изменить

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

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

Ответ 2

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

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

Ответ 3

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