Reanudar una actividad de una notificación
Tengo una notificación en la barra de estado de mi aplicación:
Notification notification = new Notification(R.drawable.icon, null, System.currentTimeMillis()); Intent notificationIntent = new Intent(this.parent, MainActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(this.parent, 0, notificationIntent, 0); ... notification.flags = Notification.FLAG_ONGOING_EVENT; mNotificationManager.notify(NOTIFICATION_ID, notification);
El problema con esto es que cuando presionas el botón de inicio de la aplicación (empujándolo al fondo) y luego presionas la notificación en la lista a la que se accede desde la barra de estado, se inicia una copia nueva de la actividad. Lo único que quiero hacer es reanudar la aplicación (como cuando pulsas prolongadamente el botón de inicio y pulsas en el icono de la aplicación). ¿Existe una manera de crear una Intención para hacer esto?
- ¿Notificación para restaurar una tarea en lugar de una actividad específica?
- ¿Cómo iniciar una actividad cuando se hace clic en la notificación?
- Cómo evitar notificaciones claras cuando la actividad termina
- ¿Cómo abrir la última actividad de la barra de estado de la notificación?
- Cómo crear un icono de barra de estado en el lado derecho? (Androide)
- Notificaciones de la barra de estado de Android: abre la actividad correcta al seleccionar una notificación
- Aplicación de notificación de Android
- Instancia Única de Actividad
- Actividad iniciada desde la notificación abierta en la parte superior de la pila de actividades
- Actividad transparente se está abriendo sobre la actividad principal. ¿Cómo abrirlo no sobre la actividad principal?
- Haga clic en la notificación inicia la actividad dos veces.
He solucionado este problema cambiando el launchMode
de launchMode
de mi actividad a singleTask
en el archivo androidManifest.xml.
El valor predeterminado de esta propiedad es standard
, lo que permite ejecutar cualquier número de instancias.
Las actividades "singleTask" y "singleInstance" solo pueden iniciar una tarea. Están siempre en la raíz de la pila de actividades. Además, el dispositivo puede contener sólo una instancia de la actividad a la vez, sólo una tarea de este tipo. […]
Los modos "singleTask" y "singleInstance" también difieren entre sí en un solo aspecto: Una actividad de "singleTask" permite que otras actividades formen parte de su tarea. Siempre está en la raíz de su tarea, pero otras actividades (necesariamente "estándar" y "singleTop" actividades) pueden ser lanzados en esa tarea. Por otra parte, una actividad de "singleInstance" no permite que ninguna otra actividad sea parte de su tarea. Es la única actividad en la tarea. Si inicia otra actividad, esa actividad se asigna a una tarea diferente, como si FLAG_ACTIVITY_NEW_TASK estuviera en la intención.
Puede encontrar una explicación detallada en la Guía de desarrolladores de Android
espero que esto ayude
Acabo de encontrar una solución a este problema: He creado getPreviousIntent método y se lo dio a PendingIntent que `s todo:
private Intent getPreviousIntent(Intent newIntent) { final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); final List<ActivityManager.RecentTaskInfo> recentTaskInfos = am.getRecentTasks(1024,0); String myPkgNm = getPackageName(); if (!recentTaskInfos.isEmpty()) { ActivityManager.RecentTaskInfo recentTaskInfo; for (int i = 0; i < recentTaskInfos.size(); i++) { recentTaskInfo = recentTaskInfos.get(i); if (recentTaskInfo.baseIntent.getComponent().getPackageName().equals(myPkgNm)) { newIntent = recentTaskInfo.baseIntent; newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } } } return newIntent; }
Yo estaba teniendo un problema similar y la forma correcta de manejar esto es utilizar los indicadores: Intent.FLAG_ACTIVITY_CLEAR_TOP y Intent.FLAG_ACTIVITY_SINGLE_TOP como así
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
De la documentación esto:
FLAG_ACTIVITY_CLEAR_TOP
Si se establece, y la actividad que se está iniciando ya se está ejecutando en la tarea actual, entonces en lugar de iniciar una nueva instancia de esa actividad, todas las otras actividades en la parte superior de la misma se cerrará y esta Intención se entregará a la (ahora en Arriba) actividad antigua como una nueva Intención.
FLAG_ACTIVITY_SINGLE_TOP
Si se establece, la actividad no se iniciará si ya se está ejecutando en la parte superior de la pila de historial.
Yo suelo:
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); notificationIntent.setAction(Intent.ACTION_MAIN);
No está seguro de que estos son los valores que necesita establecer, pero la respuesta está en los métodos / flags.
Necesita iniciar su actividad tal como lo hace el lanzador. Ver: Reanudar la aplicación y apilar desde la notificación