reanudar una actividad a partir 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 presiona el botón de inicio de la aplicación (empujándolo al fondo) y luego presiona la notificación en la lista a la que se accede desde la barra de estado, se inicia una nueva copia de la actividad. Todo lo que quiero hacer es reanudar la aplicación (como cuando presionas el botón de inicio y presionas el icono de la aplicación). ¿Hay alguna manera de crear una Intención para hacer esto?

Author: mazbox, 2010-03-05

5 answers

He resuelto este problema cambiando el launchMode de mi actividad a singleTask en el AndroidManifest.archivo xml.

El valor predeterminado de esta propiedad es standard, que permite ejecutar cualquier número de instancias.

Las actividades"singleTask" y "singleInstance" solo pueden comenzar una tarea. Siempre están en la raíz de la pila de actividades. Además, el dispositivo solo puede contener una instancia de la actividad a la vez, solo una de esas tareas. [...]

El "singleTask" y Los modos " singleInstance "también difieren entre sí en un solo aspecto: Una actividad" singleTask " permite que otras actividades formen parte de su tarea. Siempre está en la raíz de su tarea, pero otras actividades (necesariamente actividades "estándar" y "singleTop") se pueden lanzar en esa tarea. Por otra parte, una actividad" de una sola instancia " no permite que otras actividades formen 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 intent.

Puedes encontrar una explicación detallada en la Guía para Desarrolladores de Android

Espero que esto ayude

 30
Author: rekaszeru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-12 07:48:23

Estaba teniendo un problema similar y la forma correcta de manejar esto es usar las banderas: Intent.FLAG_ACTIVITY_CLEAR_TOP e Intent.FLAG_ACTIVITY_SINGLE_TOP like so

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

De la documentación esto será:

FLAG_ACTIVITY_CLEAR_TOP

Si se establece, y la actividad que se está lanzando ya se está ejecutando en la tarea actual, entonces en lugar de lanzar una nueva instancia de esa actividad, todas las demás actividades en la parte superior de ella se cerrarán y esta Intent se entregará a la (ahora en la parte superior) actividad antigua como una nueva intención.

FLAG_ACTIVITY_SINGLE_TOP

Si se activa, la actividad no se iniciará si ya se está ejecutando en la parte superior de la pila del historial.

 1
Author: Nick.D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-07 01:13:47

Acabo de encontrar una solución a este problema: Creé getPreviousIntent método y se lo di a PendingIntent eso es 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;
}
 0
Author: nAkhmedov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-14 14:14:21

Agregue esta línea a la actividad correspondiente en el archivo de manifiesto de su aplicación.

android:launchMode="singleTask"

Eg:

<activity
    android:name=".Main_Activity"
    android:label="@string/title_main_activity"
    android:theme="@style/AppTheme.NoActionBar"
    android:launchMode="singleTask" />
 0
Author: Nabil Mohammed Nalakath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-24 15:36:17

Utilizo:

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
notificationIntent.setAction(Intent.ACTION_MAIN);

No estoy seguro de que estos sean los valores que necesita establecer, pero la respuesta está en esos métodos/indicadores.

 -1
Author: gnobal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-05 13:11:48