java - para - manual de programacion android pdf
reanudar una actividad desde una notificación (5)
Tengo una notificación en la barra de estado para 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 desde la aplicación (empujándolo hacia el fondo) y luego presiona la notificación en la lista a la que se accede desde la barra de estado, comienza una nueva copia de la actividad. Todo lo que quiero hacer es reanudar la aplicación (como cuando presiona prolongadamente el botón de inicio y presiona el ícono de la aplicación). ¿Hay alguna manera de crear una intención para hacer esto?
Acabo de encontrar una solución a este problema: creé el método getPreviousIntent 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;
}
Agregue esta línea a la actividad correspondiente en el archivo de manifiesto de su aplicación.
android:launchMode="singleTask"
p.ej:
<activity
android:name=".Main_Activity"
android:label="@string/title_main_activity"
android:theme="@style/AppTheme.NoActionBar"
android:launchMode="singleTask" />
Estaba teniendo un problema similar y la forma correcta de manejar esto es usar las banderas: Intent.FLAG_ACTIVITY_CLEAR_TOP y Intent.FLAG_ACTIVITY_SINGLE_TOP como tal
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
De la documentación esto:
Si se establece, y la actividad que se está iniciando ya se está ejecutando en la tarea actual, en lugar de lanzar una nueva instancia de esa actividad, todas las demás actividades que se encuentren encima se cerrarán y esta intención se entregará al (ahora encendido arriba) actividad anterior como un nuevo propósito.
Si se establece, la actividad no se iniciará si ya se está ejecutando en la parte superior de la pila del historial.
He resuelto este problema cambiando el launchMode
de mi actividad a singleTask
en el archivo androidManifest.xml.
El valor predeterminado para esta propiedad es standard
, lo que permite que se ejecute cualquier cantidad 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. [...]
Los modos "singleTask" y "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 las actividades "estándar" y "singleTop") pueden iniciarse en esa tarea. Una actividad de "instancia única", por otro lado, no permite que otras actividades formen parte de su tarea. Es la única actividad en la tarea. Si comienza otra actividad, esa actividad se asigna a una tarea diferente, como si FLAG_ACTIVITY_NEW_TASK estuviera en el intento.
puede encontrar una explicación detallada en la Guía para desarrolladores de Android
espero que esto ayude
Yo suelo:
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.