2012-01-24 10 views
24

Estoy encontrando que en mi aplicación, el usuario puede estar bastante 'anidado' en las diversas actividades que se abren mientras el usuario está usando la aplicación.¿Hay alguna forma de tener una y solo una instancia de cada actividad?

Por ejemplo:

  1. Menú Principal
  2. lista de objetos
  3. detalles de objeto
  4. de edición de objetos
  5. detalles de objeto
  6. objeto secundario detalles
  7. objeto secundario Editar
  8. Objeto hijo Detalles

Ahora, cuando el usuario presiona la espalda, tiene que pasar por "objeto Detalles del niño dos veces (el mismo objeto, cuando se edita vuelve a la página detallada), y lo mismo sucede para los 'Detalles del objeto principal'.

¿Hay alguna forma de reutilizar las actividades, si ya están abiertas en la pila, y reordenarlas al frente? La única forma que he visto es en actividades con el atributo launcher. Creo que vi singleTask y singleTop.

Si se supone que estoy usando estos dos atributos, singleTask y singleTop, ¿cómo se supone que debo usarlos? Cuando traté de incluirlos en la aplicación, no hizo ninguna diferencia. ¿También necesito establecer una bandera mientras lanzo la intención usando startActivity?

Respuesta

30

en propiedad Actividad manifiesto que puede dar este parámetro android:launchMode="singleInstance"

Leer en más detalle aquí http://developer.android.com/guide/topics/manifest/activity-element.html

+6

** No use esto sin entender todas las implicaciones de 'launchMode =" singleInstance "'. Esto no _realiza_realiza_actividades_ **, porque obliga a la actividad a estar en una tarea separada por completo (es decir, aparecerá separada de la aplicación en la lista de Aplicaciones recientes). Entonces, si haces esto para cada actividad en tu aplicación, verás cada una de ellas como entradas separadas en la lista de Aplicaciones recientes. Al menos eso es lo que dicen los doctores. La [realidad es un poco diferente] (https://inthecheesefactory.com/blog/understand-android-activity-launchmode/en). –

+0

Mi recomendación es usar 'Intent.FLAG_ACTIVITY_REORDER_TO_FRONT' en su lugar (como se sugiere en la respuesta de Vikram a continuación), aunque no es una solución perfecta. –

6

Sí, puede exigir que solo se cree una instancia de estas actividades, pero en general no se recomienda. Si simplemente le preocupa la historia, eche un vistazo al Intent.FLAG_ACTIVITY_CLEAR_TOP.

17

¡Esta es tu bandera! http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT

intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) 

la Nota de la addFlags '. También tenga en cuenta que onCreate no se invocará en esta actividad cuando se le entregue una nueva intención. Se entregará a través del onNewIntent().

Esto no garantiza que haya una sola instancia de la actividad ejecutándose. Para garantizar que, mira esto: http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

0

Añadir Banderas intención como

Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP); StartActivity(srcActivity.java, DesiredActivity.class);

Luego, en onPause() DeseadoActividad

Agregar finish(), Esto hizo el trabajo por mí.

14

Usando android: launchMode = "singleTask" es probablemente el mejor enfoque, ya que no volverá a crear la actividad si ya se está ejecutando. Solo agréguelo a la actividad en su AndroidManifest.xml, y debe estar todo listo.

<activity 
    android:name=".MyActivity" 
    android:label="@string/app_name" 
    android:launchMode="singleTask" 
    > 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

He aquí otra pregunta que pueda ser útil: Android singleTask or singleInstance launch mode?

0
Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_NO_HISTORY); 

Funciona para mí :)

1

Esto funcionó para mí.

Intent intent = new Intent(this, MyActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
startActivity(intent); 

Si una instancia de esta Actividad ya existe, entonces se moverá a la parte delantera. Si una instancia NO existe, se creará una nueva instancia.

Cuestiones relacionadas