usando onResume y onPause
Supongamos que tengo dos actividades, actividad1 y actividad2. Quiero navegar de activity1 a activity2, conseguir una cierta información de activity2 e insertarla de nuevo a activity1 y también no quiero perder el estado anterior de activity1 como dejé. ¿cómo puedo salvar su estado?
- Uso de onResume () para actualizar la actividad
- Determine si la actividad se adelantó debido a la navegación posterior
- ¿Cómo reinicio una actividad en android?
- ciclo de vida de la actividad Android
- Fragmento onResume no llamado
- Cómo pausar y reanudar un TimerTask / Timer
- ¿Por qué onResume se llama cuando abro por primera vez la pestaña de un tabhost?
- Comportamiento del botón de retroceso de Android
- ViewPager con fragmentos - onPause (), onResume ()?
- Get onPause & onResume como eventos en el nivel de aplicación / tarea
- La aplicación se bloquea cuando se reanuda
- ¿Por qué onResume () se llama cuando se inicia una actividad?
- onQueryTextChange activado después del restablecimiento de la aplicación
lo que está describiendo es la razón clásica perfecta para utilizar el método Activity.startActivityForResult()
.
esto lo que google escribió en este método de documentación:
Inicie una actividad para la que desea un resultado cuando termine. Cuando salga esta actividad, su método onActivityResult () será llamado con el requestCode dado
así que lo que debes hacer es: desde tu activity1 iniciar la actividad de result, y de activity2 usar el setResult(int resultCode, Intent data)
con los datos que quieres que tu activity1 devuelva y call finish()
to onActivityResult()
en el mismo estado activity1 fue antes ..).
onSaveInstanceState(Bundle)
en activity1
para guardar los datos que desee y, a continuación, onRestoreInstanceState(Bundle)
en la misma actividad para recuperar los valores. Usando Bundle
, puede almacenar casi todos los datos que desee. Recomiendo algo como esto:
public class MainActivity extends Activity { ... public static final String DATA1_KEY = "data1"; private boolean value1; ... @Override protected void onSaveInstanceState (Bundle outState) { outState.putBoolean(DATA1_KEY, value1); } @Override protected void onRestoreInstanceState (Bundle savedInstanceState) { value1 = savedInstanceState.getBoolean(DATA1_KEY); } }
Debe anular onSaveInstanceState(Bundle savedInstanceState)
Por favor, compruebe esta respuesta por ejemplo código
O use SharedPreferences
. Compruebe este código
Si desea mantener sus datos vivos sólo en tiempo de ejecución, considere el uso de miembros estáticos. A continuación, puede acceder y manipular a estos miembros de cualquier actividad. por ejemplo:
public class FirstActivity extends Activity { public static String data = null; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(...); data = "This is a test!"; } }
Desde tu segunda actividad puedes acceder a estas variables estáticas como
public class SecondActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(...); if(FirstActivity.data!=null) { //You can use it: System.out.println(FirstActivity.data); } } }
Por supuesto, puede agregar funciones getter / setter para hacerlo más seguro y más elegante.
Si desea almacenarlos durante más tiempo, considere utilizar:
- Preferencias compartidas
- SQLite
- o almacenar sus datos en una base de datos en línea.
El usuario realiza una acción en su aplicación que inicia una nueva actividad. La actividad actual se detiene cuando se crea la segunda actividad. Si el usuario presiona el botón Atrás, se reinicia la primera actividad.
Cuando se detiene la actividad, el objeto Activity se mantiene residente en la memoria y se recupera cuando se reanuda la actividad. No es necesario volver a inicializar los componentes que se crearon durante cualquiera de los métodos de devolución de llamada antes del estado Reanudado. El sistema también realiza un seguimiento del estado actual de cada vista en el diseño, por lo que si el usuario introdujo texto en un widget EditText, ese contenido se conserva para que no sea necesario guardarlo ni restaurarlo.
Nota : Incluso si el sistema destruye su actividad mientras está detenido, aún conserva el estado de los objetos Ver (como texto en un EditText) en un Bundle (un bloque de pares clave-valor) y los restaura si el usuario vuelve a navegar a la misma instancia de la actividad.
CommonsWare aquí dice:
Cuando el usuario "presiona el botón ATRÁS", entonces el paquete de onSaveInstanceState () (si lo hay) se descarta, ya que el usuario ha indicado que han terminado con la actividad. El paquete onSaveInstanceState () se utiliza en los casos en que el usuario no ha dicho que han terminado con la actividad (por ejemplo, aceptaron una llamada telefónica entrante), pero Android elige destruir la actividad para liberar RAM.
Y la documentación dice:
Tenga en cuenta que es importante guardar los datos persistentes en onPause () en lugar de onSaveInstanceState (Bundle) porque el último no forma parte de las devoluciones de llamada del ciclo de vida, por lo que no se llamará en todas las situaciones descritas en su documentación.
En otras palabras, ponga su código de guardar / restaurar para objetos no Ver en onPause () y onResume () en lugar de onSaveInstanceState (Bundle) y onRestoreInstanceState (Bundle). Finalmente, supongo que no necesitas guardar ningún estado si solo tienes objetos View y si tienes otros estados puedes usar preferences
, file
o sqlite
para guardarlos en onPause()
y onResume()
en onResume()
.
Puede ver más detalles en estas páginas:
Detención y reinicio de una actividad
Estado de la actividad de almacenamiento en Android
Android no guardará el estado actual de una actividad