Me gustaría que las Actividades en la pila de actividades de mi aplicación solo tengan una instancia. Tengo varias pantallas que son ListActivities y me gustaría no pasar por el dolor y el sufrimiento de actualizar las listas en una instancia previa de ListActivity cuando otra instancia de esa ListActivity se cambia (se agrega, se edita, se elimina de, etc.) (¿o hay una manera fácil de hacer esto?).startActivityForResult no funciona correctamente con launchMode singleInstance
Nota: He leído que singleTop logrará esto (aunque destruye la actividad si presiona el botón Atrás), pero no funciona. Tengo un menú y si voy a la pantalla de la Bandeja de entrada, voy a la pantalla de Lista rápida y vuelvo a la pantalla de la Bandeja de entrada, y crea una nueva Actividad de Bandeja de entrada.
En este momento, en mi ListActivities, tengo launchMode configurado para singleInstance. El problema es: si lanzo otra actividad usando startActivityForResult, el controlador onActivityResult se dispara inmediatamente (antes de que se cree la nueva actividad). Cuando realizo la acción necesaria en la pantalla siguiente para devolver el resultado, el controlador onActivityResult no se activa.
¿Qué está pasando?
Aquí es cómo enciendo la nueva actividad:
Intent intentLaunchQuickList = new Intent(ActivityMyList.this, ActivityQuickList.class);
startActivityForResult(intentLaunchQuickList, REQUEST_QUICKLIST);
Aquí es cómo devolver el resultado:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
QuickListItem qlItem = m_Adapter.getItem(position);
if (qlItem != null && qlItem.getQLId() != -1) {
Intent data = new Intent();
data.putExtra("ql_id", qlItem.getQLId());
if (getParent() == null) {
setResult(Activity.RESULT_OK, data);
}
else {
getParent().setResult(Activity.RESULT_OK, data);
}
}
finish();
}
Aquí es mi manejador onActivityResult:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_QUICKLIST) {
if (resultCode == Activity.RESULT_OK) {
Bundle extras = data.getExtras();
if (extras != null) {
int id = extras.getInt("ql_id");
if (id > 0) {
launchQLItemsThread(id);
}
}
}
}
}
Gracias por su respuesta. Entiendo lo que quiere que haga, sin embargo, ¿no causará problemas? Obviamente tendré que hacer lo mismo en los controladores onSaveInstanceState y onRestoreInstanceState. Si en onResume y onPause leo y guardo información de la base de datos, mi aplicación leerá innecesariamente de la base de datos y leerá desde SavedInstanceState si alguna vez golpea el controlador onRestoreInstanceState, ¿sí? Además, ¿esto es realmente lo que es una práctica común para los desarrolladores de Android? ¿Guardar datos de ListActivity en un singleton para múltiples instancias de ListActivity? De nuevo, gracias por ayudar – Andrew
Además, ¿podría explicar por qué singleTop no funciona para mí? ¿O no lo entiendo? – Andrew
SavedInstanceState solo es útil para restaurar el estado de una instancia particular de una actividad; úselo para guardar la posición de desplazamiento, etc., no para mostrar el contenido. Lo que desea hacer es que todas las instancias de su actividad compartan algún estado, por lo que desea colocar ese estado en una base de datos si es persistente o en un miembro estático si solo se trata de un caché de datos de la red.Sugiero lo último en función de lo que ha dicho; solo use un DB para almacenar los datos que aún necesita enviar a través de la red en el futuro para que no los pierda. –