Чи викликається onResume () перед onActivityResult ()?


79

Ось як викладається мій додаток:

  1. користувачеві onResume () буде запропоновано увійти
  2. Якщо користувач увійде в систему, він зможе продовжувати користуватися програмою 3. Якщо користувач вийде в будь-який час, я хочу знову запропонувати ввійти

Як я можу цього досягти?

Ось моя основна діяльність:

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

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

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

Ось моя Вхідна активність:

@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, що багатьма вважається помилкою: code.google.com/p/android/issues/detail?id=17787
Денис Княжев,

30

З фрагментами це навіть не так просто, як onActivityResult()викликати до дзвінка onResume(). Якщо діяльність, до якої ви повертаєтесь, була утилізована у тимчасовий період, ви виявите, що дзвінки до (наприклад) getActivity()from onActivityResult()повернуть нуль. Однак, якщо дія не була утилізована, виклик до getActivity()поверне відповідну активність.

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


2

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


0

Методи зворотного дзвінка, наприклад onResume, не є відповідними місцями для досягнення необхідної функціональності. Я б запропонував зробити клас та додати туди функціонал входу / виходу. коли отримано зворотний виклик під час виходу, тоді зателефонуйте до функції входу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.