Вот как устроено мое приложение:
- onResume () пользователю предлагается войти в систему
- Если пользователь входит в систему, он может продолжить использование приложения 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 () вызывается первым.
Где лучше всего запрашивать вход?
onActivityResult
это также вызывается раньшеonStart
, что многие люди считают ошибкойС фрагментами это даже не так просто, как
onActivityResult()
вызов до вызоваonResume()
. Если действие, к которому вы возвращаетесь, было удалено за это время, вы обнаружите, что вызовы (например)getActivity()
fromonActivityResult()
вернут null. Однако, если действие не было удалено, вызовgetActivity()
вернет содержащее действие.Это несоответствие может быть источником трудно диагностируемых дефектов, но вы можете проверить поведение своего приложения, включив параметр разработчика «Не сохранять действия». Я обычно оставляю это включенным - я бы предпочел увидеть
NullPointerException
в разработке, чем в производстве.источник
Вы можете абстрагироваться от состояния входа в систему от действия. Например, если пользователь может оставлять комментарии, позвольте действию onPost проверить состояние входа в систему и перейти оттуда, а не из состояния активности.
источник
Такие методы обратного вызова, как
onResume
не подходят для достижения требуемой функциональности. Я бы предложил создать класс и добавить туда функцию входа / выхода. когда получен обратный вызов выхода, вызовите функцию входа.источник