Pregunta

Tengo A Actividad con android:launchMode="singleTop" en el manifiesto.

Si voy a B Actividad, C y D no tengo accesos directos del menú para volver a mi actividad de las aplicaciones de la raíz (A).

El código es el siguiente:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
startActivity(myIntent);

Sin embargo, en lugar de regresar a la A instancia ya existente de mi MainActivity.class se crea una nueva instancia -> va a onCreate() en lugar de onNewIntent()

.

Esto no es el comportamiento esperado, ¿verdad?

¿Fue útil?

Solución

Esto debería hacer el truco.

<activity ... android:launchMode="singleTop" />

Cuando se crea una intención de iniciar el uso de aplicaciones:

Intent intent= new Intent(context, YourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

Este es el caso que fuera necesaria.

Otros consejos

Lo que realmente trabajó para mí en el final fue la siguiente:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(myIntent);

href="http://developer.android.com/intl/de/guide/topics/manifest/activity-element.html" documentación :

  

Los modos y "estándar" "" singleTop   diferir entre sí en un solo   respecto: Cada vez que hay nuevo intento   para una actividad de "estándar", un nuevo   instancia de la clase que se crea   responder a esa intención. cada instancia   maneja un solo intento. Del mismo modo, una   nueva instancia de una actividad "singleTop"   También se pueden crear 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á   el nuevo intento (en un onNewIntent ()   llamada); una nueva instancia no se crea.

No estoy 100% seguro de lo que "ya tiene una instancia existente de la actividad en la parte superior de su pila" significa, pero tal vez su actividad no está cumpliendo con esta condición.

Me singleTask o el trabajo singleInstance para usted? O tal vez usted podría intentar establecer FLAG_ACTIVITY_SINGLE_TOP en la intención que está creando para ver si eso hace la diferencia, aunque no creo que lo hará.

Puede volver a la misma instancia de actividad existentes con android:launchMode="singleInstance"

en el manifiesto. Cuando regresa al A de B, puede ser necesaria para destruir finish() B.

En primer lugar, la estructura de pila puede ser examinado. Para el modo de puesta en marcha: singleTop
Si una instancia de la misma actividad ya está en la parte superior de la pila de tareas, y este caso se volverá a utilizar para responder a la intención.

Todas las actividades son de retención en la pila ( "primero en último out") por lo que si su actividad actual es en la parte superior de la pila y si se define en el manifest.file como singleTop

android:name=".ActivityA"
android:launchMode="singleTop"

Si usted está en el ActivityA recrear la actividad no entrará onCreate se reanudará onNewIntent () y se puede ver mediante la creación de una notificación No:. Si no se implementa onNewIntent (Intención) no obtendrá nuevo intento

Intent activityMain = new Intent(ActivityA.this,
                        ActivityA.class);

                activityMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                startActivity(activityMain);




    @Override
        protected void onNewIntent(Intent intent) {

            super.onNewIntent(intent);

            notify("onNewIntent");
        }

        private void notify(String methodName) {

            String name = this.getClass().getName();
            String[] strings = name.split("\\.");

            Notification noti = new Notification.Builder(this)
                    .setContentTitle(methodName + "" + strings[strings.length - 1])
                    .setAutoCancel(true).setSmallIcon(R.drawable.ic_launcher)
                    .setContentText(name).build();
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            notificationManager.notify((int) System.currentTimeMillis(), noti);

        }

Esto es porque el original una actividad que ya está siendo destruido por el momento se inicia desde B, C o D. Por lo tanto, onCreate será llamado en lugar de onNewIntent (). Una manera de resolver esto es para destruir siempre el vigente A (usando FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK junto al startActivity) antes de iniciar un nuevo A, por lo onCreate siempre se llamará, y se pone el código de onNewIntent () en onCreate comprobando si getIntent ( ) es la intención que empezó.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top