68

Вот как мое приложение выложено:Вызывается onResume() перед onActivityResult()?

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

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

ответ

80

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

+0

Я устанавливаю isLoggedIn после того, как пользователь вошел в систему. См. Мой обновленный код. не уверен, что случилось? – 2010-11-23 06:18:02

2

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

21

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

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

Смежные вопросы