java - setresult - protected void oncreate(bundle savedinstancestate)
¿OnResume() se invocó antes onActivityResult()? (3)
Con los fragmentos, ni siquiera es tan simple como onActivityResult()
se llama antes de la llamada a onResume()
. Si la actividad que está volviendo se eliminó getActivity()
tanto, encontrará que las llamadas a (por ejemplo) getActivity()
desde onActivityResult()
devolverán null. Sin embargo, si la actividad no se ha eliminado, una llamada a getActivity()
devolverá la actividad que contiene.
Esta incoherencia puede ser una fuente de defectos difíciles de diagnosticar, pero puede verificar el comportamiento de su aplicación al habilitar la opción de desarrollador "No mantener actividades". Tiendo a mantener esto activado, prefiero ver una NullPointerException
en desarrollo que en producción.
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 solicitar el inicio de sesión de nuevo
¿Cómo puedo conseguir esto?
Aquí está mi actividad principal:
@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 onResume () se llama beforeActivityResult () así que cuando el usuario ha iniciado sesión exitosamente, mi actividad principal no se notifica porque onResume () se llama primero.
¿Dónde está el mejor lugar para solicitar el inicio de sesión?
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 de desde el estado de la actividad.
La llamada a onActivityResult ocurre antes onResume, en realidad (ver los documentos ). ¿Estás seguro de que realmente estás comenzando la actividad que querías con startActivityForResult
y de que estás configurando el resultado de la actividad invocada en RESULT_OK
antes de devolver un valor a tu actividad? Intente simplemente colocar una declaración de Log
en su onActivityResult
para registrar ese valor y asegurarse de que reciba un golpe. Además, ¿dónde establece el valor de la preferencia isLoggedIn
? Parece que deberías establecer eso como true
en tu actividad de inicio de sesión antes de que regrese de todos modos, pero eso claramente no está sucediendo.