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?
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
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á:
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.
Si se activa, la actividad no se iniciará si ya se está ejecutando en la parte superior de la pila del historial.
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;
}
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" />
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.
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