Nueva Intención () inicia nueva instancia con Android: launchMode = “singleTop”
-
19-09-2019 - |
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?
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);
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ó.