Así es como se presenta mi aplicación:
- Se solicita al usuario onResume () que inicie sesión
- Si el usuario inicia sesión, puede seguir usando la aplicación. 3. Si el usuario cierra la sesión en cualquier momento, quiero que vuelva a solicitar el inicio de sesión.
¿Cómo puedo conseguir esto?
Aquí está mi MainActivity:
@Override
protected void onResume(){
super.onResume();
isLoggedIn = prefs.getBoolean("isLoggedIn", false);
if(!isLoggedIn){
showLoginActivity();
}
}
Aquí está mi 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);
}
}
}
Después de que el usuario haya iniciado sesión correctamente:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
Toast.makeText(getApplicationContext(), "BOOM SHAKA LAKA!",Toast.LENGTH_SHORT).show();
}
}
El problema es que se llama a onResume () antes que a onActivityResult (), por lo que cuando el usuario ha iniciado sesión correctamente, mi actividad principal no recibe una notificación porque se llama primero a onResume ().
¿Cuál es el mejor lugar para solicitar el inicio de sesión?
fuente
onActivityResult
también se llama antesonStart
, lo que muchas personas consideran un error: code.google.com/p/android/issues/detail?id=17787Con los fragmentos, ni siquiera es tan simple como
onActivityResult()
ser llamado antes de la llamada aonResume()
. Si la actividad a la que está regresando se eliminó en el ínterin, encontrará que las llamadas a (por ejemplo)getActivity()
desdeonActivityResult()
devolverán un valor nulo. Sin embargo, si la actividad no se ha eliminado, una llamada agetActivity()
devolverá la actividad que la contiene.Esta inconsistencia puede ser una fuente de defectos difíciles de diagnosticar, pero puede verificar el comportamiento de su aplicación habilitando la opción de desarrollador "No mantener actividades". Tiendo a mantener esto encendido, prefiero ver un
NullPointerException
en desarrollo que en producción.fuente
Es posible que desee considerar abstraer el estado de inicio de sesión de la actividad. Por ejemplo, si un usuario puede publicar comentarios, deje que la acción onPost haga ping para el estado de inicio de sesión y vaya desde allí, en lugar del estado de actividad.
fuente
Los métodos de devolución de llamada como
onResume
no son lugares adecuados para lograr la funcionalidad solicitada. Sugeriría hacer una clase y agregar la funcionalidad de inicio / cierre de sesión allí. cuando se reciba una devolución de llamada de cierre de sesión, llame a la función de inicio de sesión.fuente