singletop flag_activity_single_top configchanges allowbackup activity android android-activity singleinstance

flag_activity_single_top - android:configchanges



startActivityForResult no funciona correctamente con launchMode singleInstance (2)

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 anterior de ListActivity cuando se cambia otra instancia de esa ListActivity (¿o hay una manera fácil de hacerlo? ).

Utilice un modelo consistente. Por ejemplo, sus datos se encuentran en una base de datos. Cada ListActivity tiene un Cursor en la parte de la base de datos que necesita. Haga que ese Cursor sea ​​un "Cursor administrado" (a través de startManagingCursor() ), y sus ListViews se actualizarán automáticamente en onResume() . A continuación, realice los cambios en su modelo a través de la base de datos.

Tengo un menú y si voy a la pantalla de mi bandeja de entrada, luego voy a la pantalla de mi Lista rápida, y luego vuelvo a la pantalla de mi bandeja de entrada, se crea una nueva actividad en la bandeja de entrada.

Eso es lo que se supone que debe hacer. Citando la documentation :

Los modos "estándar" y "singleTop" difieren entre sí en un solo aspecto: cada vez que hay una nueva intención para una actividad "estándar", se crea una nueva instancia de la clase para responder a esa intención. Cada instancia maneja un solo intento. De manera similar, también se puede crear una nueva instancia de una actividad "singleTop" para manejar una nueva intención. Sin embargo, si la tarea de destino ya tiene una instancia existente de la actividad en la parte superior de su pila, esa instancia recibirá la nueva intención (en una llamada onNewIntent ()); no se crea una nueva instancia. En otras circunstancias, por ejemplo, si una instancia existente de la actividad "singleTop" está en la tarea de destino, pero no en la parte superior de la pila, o si está en la parte superior de una pila, pero no en la tarea de destino, una Se crearía una nueva instancia y se empujaría en la pila.

(negrita agregada para énfasis)

En este momento, en mi lista de actividades, tengo launchMode configurado a singleInstance.

Por favor no hagas esto.

Me gustaría que Actividades en la pila de actividades de mi aplicación tenga solo 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 anterior de ListActivity cuando otra instancia de esa ListActivity se cambia (se agrega, se edita, se elimina, etc.) (¿O hay una manera fácil de hacer esto?).

Nota: He leído que singleTop logrará esto (aunque destruye la Actividad si presionas el botón Atrás), pero no funciona. Tengo un menú y si voy a la pantalla de mi bandeja de entrada, luego voy a la pantalla de mi Lista rápida, y luego vuelvo a la pantalla de mi bandeja de entrada, se crea una nueva actividad en la bandeja de entrada.

En este momento, en mi lista de actividades, tengo launchMode configurado a singleInstance. El problema es: si lanzo otra Actividad utilizando startActivityForResult, el controlador onActivityResult se activa de inmediato (antes de que se cree la nueva Actividad). Cuando realizo la acción necesaria en la siguiente pantalla para devolver el resultado, el controlador onActivityResult no se activa.

Que esta pasando?

Así es como disparo la nueva actividad:

Intent intentLaunchQuickList = new Intent(ActivityMyList.this, ActivityQuickList.class); startActivityForResult(intentLaunchQuickList, REQUEST_QUICKLIST);

Así es como devuelvo 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í está mi controlador 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); } } } } }


De la documentación de startActivityForResult : "Por ejemplo, si la actividad que está iniciando utiliza el modo de inicio de Tarea única, no se ejecutará en su tarea y, por lo tanto, recibirá un resultado de cancelación de inmediato". singleInstance actividades de una singleInstance son de la misma manera.

En otras palabras, si desea usar sAFR, deberá manejar múltiples instancias de actividad. Lo que recomendaría es almacenar el estado de la lista para sus instancias de onPause en onPause en algún lugar global de la aplicación (un singleton o lo que sea), y cargar desde allí en onResume . Luego, incluso si se ListActivity múltiples instancias de ListActivity , la principal siempre actualizará los datos antes de que se reanuden las anteriores, y las listas siempre aparecerán actualizadas para el usuario.

Tenga en cuenta que debería hacer eso de todos modos si sus datos están destinados a ser persistentes, ya que el sistema puede onPause todo el proceso en cualquier momento después de una llamada de onPause , y si no ha guardado ningún cambio en algún momento para cuando vuelva, es probable que se pierdan silenciosamente en algunas circunstancias, a menudo raras e impredecibles. En este caso, desea utilizar archivos locales o bases de datos SQLite, no persistir en la red. onPause debe regresar rápidamente porque el usuario no puede interactuar con el sistema mientras se está ejecutando, así que guarde en el almacenamiento local y luego sincronícelo en la red en algún otro momento, tal vez a través de un servicio lanzado por onPause .