onActivityResult () 전에 onResume ()이 호출됩니까?


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많은 사람들이 버그로 간주됩니다 : code.google.com/p/android/issues/detail?id=17787
데니스 Kniazhev

30

프래그먼트를 사용하면을 onActivityResult()호출하기 전에 호출되는 것만 큼 ​​간단하지도 않습니다 onResume(). 반환중인 활동이 중간에 삭제 된 경우 getActivity()from (예 :)에 대한 호출이 onActivityResult()null을 반환 한다는 것을 알 수 있습니다. 그러나 활동이 삭제되지 않은 경우를 호출 getActivity()하면 포함 된 활동이 반환됩니다.

이러한 불일치는 진단하기 어려운 결함의 원인이 될 수 있지만 개발자 옵션 "활동을 유지하지 않음"을 활성화하여 애플리케이션의 동작을 확인할 수 있습니다. 나는 이것을 계속 켜놓는 경향이있다-나는 NullPointerException생산에서 보다는 개발에서 보는 것을 더 좋아한다 .


2

활동에서 로그인 상태를 추상화하는 것을 고려할 수 있습니다. 예를 들어 사용자가 댓글을 게시 할 수있는 경우 onPost 작업이 로그인 상태를 핑하고 활동 상태가 아닌 거기에서 이동하도록합니다.


0

같은 콜백 메소드 onResume는 요청 된 기능을 달성하기에 적합한 장소가 아닙니다. 수업을 만들고 거기에 로그인 / 로그 아웃 기능을 추가하는 것이 좋습니다. 사인 아웃 콜백이 수신되면 로그인 기능을 호출합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.