studio start intent from example desde crear cannot boton activity abrir android android-activity android-intent

android - intent - start activity from fragment



New Intent() inicia una nueva instancia con Android: launchMode="singleTop" (6)

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

Si voy a la Actividad B , C y D , tengo atajos de menú para regresar a la actividad raíz de mis aplicaciones ( A ).

El código se ve así:

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

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

Este no es el comportamiento esperado, ¿verdad?


Cita de 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 único intento. Del mismo modo, también se puede crear una nueva instancia de una actividad "singleTop" para manejar un nuevo intento. Sin embargo, si la tarea objetivo 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 ()); una nueva instancia no se crea.

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

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


En primer lugar, se puede examinar la estructura de la pila. Para el modo de lanzamiento: singleTop
Si una instancia de la misma actividad ya se encuentra en la parte superior de la pila de tareas, esta instancia se reutilizará para responder a la intención.

Todas las actividades se mantienen en la pila ("primero en salir por última vez"), por lo tanto, si su actividad actual está en la parte superior de la pila y si la define en el archivo manifest.file como singleTop

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

si está en la Actividad, vuelva a crear la actividad en la que no entrará. Crear reanudará onNewIntent () y podrá ver creando una notificación. No: Si no implementa onNewIntent (Intención), no obtendrá una nueva intención.

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 debería funcionar.

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

Cuando crea una intención para iniciar el uso de la aplicación:

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

Esto es que debería ser necesario.


Esto se debe a que la actividad original A ya está siendo destruida cuando usted la inicia desde B, C o D. Por lo tanto, se llamará a onCreate en lugar de onNewIntent (). Una forma de resolver esto es destruir siempre la A existente (usando FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK conjunción cuando startActivity) antes de comenzar una nueva A, por lo que onCreate siempre será invocado, y usted pone el código de onNewIntent () en onCreate marcando si getIntent ( ) es la intención con la que comenzó.


Lo que realmente funcionó para mí al final fue esto:

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


Puede volver a la misma instancia existente de Actividad con android:launchMode="singleInstance"

en el manifiesto Cuando regrese a A desde B , puede ser necesario finish() para destruir B