83

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

  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() が最初に呼び出されるため、メインのアクティビティに通知されないことです。

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

4

4 に答える 4

105

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

編集

ドキュメントは言う:

アクティビティが再開するとき、onResume() の直前にこの呼び出しを受け取ります。

于 2010-11-23T05:56:06.663 に答える
31

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

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

于 2013-04-28T16:21:10.330 に答える
2

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

于 2010-11-23T05:58:47.870 に答える