bucle de reinicio activiti android N

60 views
Skip to first unread message

Jaume Tugores

unread,
Oct 8, 2016, 2:32:00 PM10/8/16
to desarrollad...@googlegroups.com
Ya estoy aqui otra vez, resolviendo (con su ayuda) problemas derivados de la actualización de mi aplicacion a Android N.
Un nuevo problema me ha surgido y consiste en que algunas activitis me entran en un bucle de reinicio constante, paso a detallarlo.

Una activiti X -> Inicia -> hace comprobaciones y a raiz de una comprobación abro otra activity para mostrar unos datos, el operador los lee y luego la cierra (finish()) y se regresa a la activiti llamante (padre)
Hasta ahora al regresar de la actividad hija, la actividad padre seguia a partir del punto en que se había dejado y todo iba bien.
Ahora con Android N resulta que siempre se reinicia la actividad padre (esto lo he comprobado en varias activitis que tengo y hacen todas lo mismo). con lo cual se entra en el bucle de comprobar datos -> lllamar actividad hija -> volver a la padre que se reinicia y vuelve a empezar y asi en un bucle infinito.
Resulta que al llamar a la actividad hija, la actividad padre se destruye y claro, al volver de la hija, empieza todo de nuevo.

Por supuesto que puedo arreglar la activiti para que a pesar del reinicio no entre en un bucle, pero les quería preguntar si esto es lo normal a partir de ahora  o si de alguna manera se puede hacer que al actividad padre no se destruya y al salir de la hija vuelva en al punto de llamada. En google no he encontrada nada sobre este tema, aunque puede que no haya sabido preguntar, ya que el ingles no es lo mio.

Nota:
Anteriormente si necesitaba este comportamiento de reinicio, tenía que ejecutar estos comandos:
finish(); startActivity(getIntent());

Gracias.

Gabriel Pozo

unread,
Oct 8, 2016, 5:54:32 PM10/8/16
to desarrolladores-android

La verdad que una pregunta así, sin ver código de como esta armado es complicado.
Pero siempre que se modifica el ciclo de vida natural de un activity se corren estos tipos de riesgos. Estoy seguro que es porque algo no está correctamente armado, por ejemplo estoy seguro que por lo que comentas no es realmente necesario el finish() Seguramente comprobando algunas cosas en el onStart o en el onResume sin cerrar el activity podrías lograr el mismo efecto 😉


El sáb., 8 oct. 2016 15:32, Jaume Tugores <jaimet...@gmail.com> escribió:
Ya estoy aqui otra vez, resolviendo (con su ayuda) problemas derivados de la actualización de mi aplicacion a Android N.
Un nuevo problema me ha surgido y consiste en que algunas activitis me entran en un bucle de reinicio constante, paso a detallarlo.

Una activiti X -> Inicia -> hace comprobaciones y a raiz de una comprobación abro otra activity para mostrar unos datos, el operador los lee y luego la cierra (finish()) y se regresa a la activiti llamante (padre)
Hasta ahora al regresar de la actividad hija, la actividad padre seguia a partir del punto en que se había dejado y todo iba bien.
Ahora con Android N resulta que siempre se reinicia la actividad padre (esto lo he comprobado en varias activitis que tengo y hacen todas lo mismo). con lo cual se entra en el bucle de comprobar datos -> lllamar actividad hija -> volver a la padre que se reinicia y vuelve a empezar y asi en un bucle infinito.

Por supuesto que puedo arreglar la activiti para que a pesar del reinicio no entre en un bucle, pero les quería preguntar si esto es lo normal a partir de ahora  o si hay algun seteo que me permita modificar este comportamiento.

Nota:
Anteriormente si necesitaba este comportamiento de reinicio, tenía que ejecutar estos comandos:
finish(); startActivity(getIntent());

Gracias.

--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/desarrolladores-android/0e9cdfe6-99dc-4ddb-9511-1650e435bc70%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Jaume Tugores

unread,
Oct 9, 2016, 9:26:31 AM10/9/16
to desarrolladores-android
La llamada a la activiti hija se hace asi:
startActivityForResult(int1, atencion);
No hay finish() para la act. padre.
La salida de la activiti hija si que lleva finish:
Intent i = getIntent(); //-el intent que ha llamado a este.
setResult(RESULT_OK, i);
finish();

En la activiti padre tengo un onActivityResult:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case SelecOtActiva:
Inicio();
break;
case atencion:
Log.d("inix", "ActiviyResult_atencion");
                //-Aqui debería de regresar de la activiti hija.
break;
}
}
}

Según el seguimiento por log, en la actividad padre, nada más arrancar la aplicación hija con el:startActivityForResult(int1, atencion);, ya pasa por OnDestroy en la padre, 
al salir de la hija con el finish(), automaticamente pasa al OnCreate del padre, en el cual se vuelve a llamar a la hija, luego pasa por onActivityResult (del padre) y luego por el OnCreate de la hija y así sucesivamente...


Gabriel Pozo

unread,
Oct 9, 2016, 8:36:26 PM10/9/16
to desarrolladores-android
Una consulta, porque volvés a enviar el mismo intent con el que abriste el activity ???
https://developer.android.com/training/basics/intents/filters.html
Podrías pasar únicamente el result ok, o crear un nuevo intent, con los datos que desees pasar como resultado ;)


--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.

Jaume Tugores

unread,
Oct 10, 2016, 2:52:29 AM10/10/16
to desarrolladores-android
No se si he entendido tu pregunta,  pero intentare responder.

Si te refieres a esto que publique anteriormente:
Según el seguimiento por log, en la actividad padre, nada más arrancar la aplicación hija con el:startActivityForResult(int1, atencion);, ya pasa por OnDestroy en la padre, 
al salir de la hija con el finish(), automaticamente pasa al OnCreate del padre, en el cual se vuelve a llamar a la hija, luego pasa por onActivityResult (del padre) y luego por el OnCreate de la hija y así sucesivamente...

No es que yo vuelva a llamar al intent padre, es que esto es lo que hace el sistema, yo unicamente tengo un intent de entrada a la actividad padre, luego otro a la hija y finish() de la hija, nada mas, el sistema(Nougat) se monta todo este embrollo el solito, con versiones anteriores esto no pasa.

Gabriel Pozo

unread,
Oct 10, 2016, 12:39:04 PM10/10/16
to desarrolladores-android
Me refiero al código que pasaste:

Intent i = getIntent(); //-el intent que ha llamado a este.
setResult(RESULT_OK, i);
finish();
En ese código, vos estas usando la función "getIntent()":
Si lees esa documentación dice: Return the intent that started this activity.

Porque en vez de hacer eso, no haces algo así?
Intent result = new Intent(RESULT_OK, "este es mi resultado");
setResult
(Activity.RESULT_OK, result);
finish
();
O algo así:
setResult(RESULT_OK);
finish
();
Ya que si vez en la documentación que te pase antes: https://developer.android.com/training/basics/intents/filters.html
Podes pasar solo un entero si es que no te hace falta el intent ;)
Deberías colocar log antes del if en el onActivityResult para ver que te devuelve en el requestCode y resultCode ;)

Otra muy importante, relacionada al ciclo de vida, vos decís que en el bucle pasa por el onCreate del padre y ahí vuelve a llamar a la activity hija? en que momento del onCreate puede hacer esa llamada?????????????? deberíamos ver el código del onCreate
Y colocar log por todos esos lados, y pasarnos una salida del logcat ;)


--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.

Jaume Tugores

unread,
Oct 10, 2016, 4:50:27 PM10/10/16
to desarrolladores-android
El getIntent es para recuperar el intent padre y poder regresar a el y según este enlace es la manera correcta de regresar al padre.


Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();

De todas maneras ya he adaptado mi aplicación a este nuevo comportamiento y ahora me funciona correctamente, es solo que no sabía si era problema mio por una incorrecta programacion o un seteo incorrecto, pero por lo que veo creo que el problema es un cambio en el comportamiento standard de android N. No encuentro ningún otro motivo.

Gabriel Pozo

unread,
Oct 11, 2016, 6:42:17 AM10/11/16
to desarrolladores-android

Y que cambios tuviste que realizar?


--
Para participar es necesario que leas detenidamente las normas del grupo: https://goo.gl/xeTRQm
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/desarrolladores-android.

Jaime Tugores

unread,
Oct 11, 2016, 6:56:18 AM10/11/16
to desarrollad...@googlegroups.com
Pues, en el OnCreate tenía la comprobación de la validez de unos datos, entonces si había algún problema, arrancaba una actividad hija para presentarlos al operador. Ahora esto no va bien porque al salir de la hija siempre entra en el OnCreate, lo que provoca el bucle, entonces lo que he hecho ha sido quitar  esta comprobación del oncreate y ponerla en el onclick de alguno de varios botones(el mas apropiado) que hay en la actividad, de esta manera funciona procticamente igual que funcionaba antes de android N.
Tambien he tenido que revisar todas las actividades y quitar algunos procedimientos que tenía en el oncreate y pasarlos a otro metodo, porque aunque no había bucle, como la actividad ahora se puede reiniciar muchas veces, por el mismo motivo, o por girar el movil, no interesaba repetir estos procedimientos constantemente.
--
______________Saludos Jaume._________________
Reply all
Reply to author
Forward
0 new messages