web-dev-qa-db-ja.com

onActivityResult()の前にonResume()が呼び出されますか?

アプリのレイアウトは次のとおりです。

  1. onResume()ユーザーはログインを求められます
  2. ユーザーがログインした場合、彼はアプリの使用を続けることができます。ユーザーがいつでもログアウトした場合、再度ログインを要求します

どうすればこれを達成できますか?

ここに私の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();
        }
    }

問題は、onActivityResult()の前にonResume()が呼び出されるため、ユーザーが正常にログインしたときに、onResume()が最初に呼び出されるため、メインアクティビティが通知されないことです。

ログインを促す最適な場所はどこですか?

74
Sheehan Alam

OnActivityResultの呼び出しは、実際にはonResumeの前に発生します( ドキュメント を参照)。 startActivityForResultを使用して必要なアクティビティを実際に開始していて、アクティビティに値を返す前に、呼び出されたアクティビティの結果をRESULT_OKに設定していると確信していますか? LogonActivityResultステートメントを挿入して、その値を記録し、ヒットすることを確認してください。また、isLoggedIn設定の値をどこで設定していますか?とにかく戻る前に、ログインアクティビティでtrueに設定する必要があるようですが、それは明らかに起きていません。

91
Yoni Samlan

フラグメントでは、onActivityResult()への呼び出しの前にonResume()が呼び出されるほど簡単ではありません。戻り先のアクティビティが暫定的に破棄された場合、(たとえば)getActivity()からonActivityResult()への呼び出しはnullを返します。ただし、アクティビティが破棄されていない場合、getActivity()を呼び出すと、含まれているアクティビティが返されます。

この不整合は、診断が困難な欠陥の原因となる可能性がありますが、開発者オプション「アクティビティを保持しない」を有効にすることで、アプリケーションの動作を確認できます。私はこれをオンにしておく傾向があります-本番よりも開発中にNullPointerExceptionが見たいです。

28
Phil

アクティビティからログイン状態を抽象化することを検討することもできます。たとえば、ユーザーがコメントを投稿できる場合、onPostアクションにログイン状態をpingさせ、アクティビティ状態からではなくそこから移動します。

2
sgarman