studio programacion móviles desarrollo curso aplicaciones android

android - programacion - Reanudar la solicitud y la pila de la notificación



manual de programacion android pdf (7)

Quiero reanudar mi aplicación desde una notificación de barra de estado de la misma manera que cuando el usuario toca su ícono en el iniciador.

Es decir: quiero que la pila esté en el mismo estado que antes de que el usuario la dejara.

El problema al establecer un intento pendiente en la notificación es que siempre se dirige a una actividad específica. No quiero esto Necesito reanudar la aplicación como lo hace el iniciador.

Entonces, si el usuario está en la actividad A, quiero reanudar la actividad A. Si ha lanzado la actividad B desde la actividad A, entonces quiero que se muestre B cuando el usuario toca la notificación, y la pila que se restaurará para que A obtenga reanudado cuando el usuario toca el botón Atrás en B.

Hay otras preguntas sobre preguntas con títulos similares, pero ninguna aborda mi problema.


Creando una actividad y luego estableciendo las categorías y las banderas respectivas ... Esta fue la forma en que esto funcionó para mí, tuve que hacerlo de esta manera porque lo hice para apoyar Api lvl 8

intent.addCategory(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setClass(this, YourActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT| Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

y en el AndroidManifest

android:launchMode="singleTask"

Entonces, ¿qué hizo el truco fue el Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT junto con la línea configurada en el manifiesto.

Espero que ayude a otras personas.


Esto es muy simple abre tu archivo de manifiesto y establece el atributo Modo de inicio singleTop en tu atributo de actividad


Para situaciones en las que no desea / no puede codificar con dificultad la actividad del iniciador, esta solución funciona

Intent i = getPackageManager() .getLaunchIntentForPackage(getPackageName()) .setPackage(null) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, i, 0); return new NotificationCompat.Builder(context) ... .setContentIntent(pendingIntent) .build();

La parte setPackage (null) fue clave en mi caso, ya que sin ella, la aplicación no se reanudó hasta la tarea anterior. Comparé mi intención con la intención del iniciador de Android y noté que el paquete no estaba allí, así que así fue como se me ocurrió eliminar el nombre del paquete del intento.

Mi situación particular era que la notificación se había creado en una biblioteca, por lo que no podía saber cuál sería la actividad del iniciador.


Podría haber una manera más simple, pero podría almacenar los datos en la base de datos sqlite y cada vez que reinicie la aplicación, cualquiera sea el estado que haya guardado en la base de datos, puede recuperar y establecer sus valores en lo que necesitan estar.


Simplemente use los mismos filtros de intención que usa Android cuando inicia la aplicación:

final Intent notificationIntent = new Intent(context, YourActivity.class); notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER); notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

Como la Intent que creó para abrir su Activity desde la barra de notificaciones es la misma que la de Android utilizada para iniciar su aplicación, se mostrará la Activity abierta anteriormente en lugar de crear una nueva.


También tuve el mismo problema e intento resolver el problema como la respuesta de @ GrAnd:

final Intent notificationIntent = new Intent(context,YourActivity.class); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER);

Esto funciona, no hay dudas al respecto, pero el problema es cuando configuras tu intento como ACTION_MAIN. Entonces no podrás configurar ningún paquete para la intención. Es decir, tus datos primitivos no se recibirán de la actividad objetivo porque ACTION_MAIN no puede contener datos adicionales.

En lugar de esto, puede simplemente configurar sus actividades como singleTask y llamar a su intención normalmente sin establecer ACTION_MAIN y recibir el intento del método onNewIntent () de su actividad objetivo.

Pero beaware si llama, super.onNewIntent (intención); luego se creará una segunda instancia de la actividad.


<uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.REORDER_TASKS" /> private void bringApplicationToForeground(){ ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { List<ActivityManager.AppTask> tasksList = am.getAppTasks(); for (ActivityManager.AppTask task : tasksList){ task.moveToFront(); } }else{ List<ActivityManager.RunningTaskInfo> tasksList = am.getRunningTasks(Integer.MAX_VALUE); if(!tasksList.isEmpty()){ int nSize = tasksList.size(); for(int i = 0; i < nSize; i++){ if(tasksList.get(i).topActivity.getPackageName().equals(getPackageName())){ am.moveTaskToFront(tasksList.get(i).id, 0); } } } } }