android - studio - La intención de la notificación no tiene extras
notification overview android (6)
Si no es necesario, evite establecer su actividad en manifiesto como una tarea única. omita esta línea o cámbiela a singleTop si puede:
android:launchMode="singleTask”
Si debe tener una sola tarea, entonces en las banderas de conjunto de intentos pendientes: Intento. FLAG_ACTIVITY_NEW_TASK | Intención. FLAG_ACTIVITY_CLEAR_TASK Y PendingIntent. FLAG_CANCEL_CURRENT .
resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TASK); pIntent = PendingIntent.getActivity(context, 0, resultIntent, PendingIntent.FLAG_CANCEL_CURRENT );
Si tiene una sola tarea: restablezca los extras en su actividad dentro de NewIntent () por setIntent (intención);
protected void onNewIntent(Intent intent) { setIntent(intent); ... }
Este parece ser un problema común y revisé todas las preguntas relacionadas que pude encontrar: La actividad no está recogiendo un nuevo intento , ¿Por qué los datos adicionales (enteros) no se envían en la intención de notificación de Android? , La notificación supera los antiguos extras de intención , no se pueden agregar extras para un intento de notificación , problema de notificación pendiente de android ; pero todavía no puedo resolver esto.
El problema es lo mismo Configuré una notificación con un PendingIntent que llevaba información adicional y no la recibí del otro lado.
Aquí está el código para generar la notificación:
Notification notification = new Notification(R.drawable.icon, getResources().getString(R.string.notification_ticker), System.currentTimeMillis());
notification.flags = Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONLY_ALERT_ONCE;
Intent start_test = new Intent(this, MyActivity.class);
start_test.putExtra("start_test", true);
start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pi = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), start_test, PendingIntent.FLAG_CANCEL_CURRENT);
notification.setLatestEventInfo(this, getResources().getString(R.string.notification_title), getResources().getString(R.string.notification_content, expired), pi);
nm.notify(NOTIFICATION_ID, notification);
Y en el otro lado:
boolean start_test=getIntent().getBooleanExtra("start_test", false);
El paquete no está realmente allí (getExtras () devuelve nulo).
PendingIntent.getActivity
las diferentes banderas para PendingIntent.getActivity
( FLAG_UPDATE_CURRENT
, FLAG_CANCEL_CURRENT
, FLAG_ONE_SHOT
), ninguna de ellas ayudó.
Como se muestra en el código, uso getCurrentMillis para asegurarme de que el requestID cambie ...
También se encontró que en MyActivity, onCreate
y onNewIntent
no reciben ninguna llamada. solo en onResume
es. Aunque FLAG_ACTIVITY_NEW_TASK
está establecido ...?
¿Me estoy perdiendo algo muy simple?
Acabo de agregar el indicador PendingIntent.FLAG_UPDATE_CURRENT
a mi intención pendiente, y comenzó a funcionar para mí (saltó todos los indicadores para Intent).
Código de ejemplo:
PendingIntent pendIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Configurar FLAG_ACTIVITY_NEW_TASK
para la intención de notificación causará lo siguiente:
Si la actividad no se está ejecutando en una tarea, se iniciará una nueva tarea y la intención se entregará a la actividad en
onCreate()
Sin embargo, si la actividad ya se está ejecutando en una tarea, esa tarea pasará a primer plano. Eso es todo. La intención no se entregará y
onNewIntent()
no seonNewIntent()
.
Si desea que se entregue realmente la intención, debe especificar:
start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_SINGLE_TOP);
No launchMode
si launchMode
de la actividad es singleTop
o no, aún debe especificar Intent.FLAG_ACTIVITY_SINGLE_TOP
en el Intent.
Nota: Si la actividad ya se está ejecutando en una tarea y la actividad no se encuentra en la parte superior de la pila de actividades en esa tarea, la tarea pasará a primer plano. Eso es todo. La intención no será entregada. La única forma de que esto ocurra sería agregar Intent.FLAG_ACTIVITY_CLEAR_TOP
a los otros 2 indicadores, pero puede que esto no sea lo que quieres que ocurra (depende de tu escenario específico).
Ver mi problema (aún) abierto en el código de Google en http://code.google.com/p/android/issues/detail?id=17137
Enfoque más simple: el problema real es que el Intención, al ser el mismo objetivo, se reemplaza. Lo resolví con un nuevo servicio, un "NotificationDismissalService". La única intención de ir a ese servicio es el elemento setDeleteIntent. Debido a que es un servicio único, los parámetros no se reemplazan. El cuerpo de NotificationDismissalService (y realmente sería uno de esos servicios de rechazo por tipo de intención único) es una implementación simple de "onStartCommand" que envía un intento al servicio preferido (leer / escribir los parámetros correctos). Debido a que es un envío real de un servicio, sin un pendiente en medio, funciona bien.
He usado algo como esto
Intent myIntent = new Intent(context, DoSomething.class);
PendingIntent pendingIntent = PendingIntent.getActivity(
context,
0,
myIntent,
Intent.FLAG_ACTIVITY_NEW_TASK);
Mira el ejemplo completo here
Puede enviar extras en la intención siguiendo el camino
PendingIntent contentIntent ;
Intent intent = new Intent(this,TestActivity.class);
intent.putExtra("extra","Test");
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ArticleDetailedActivity.class);
contentIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
Para obtener un valor adicional en la clase de actividad de prueba, debe escribir el siguiente código:
Intent intent = getIntent();
String extra = intent.getStringExtra("extra") ;