Pregunta

No puedo encontrar una manera de enviar parámetros a mi actividad de mi notificación.

Tengo un servicio que crea una notificación. Cuando el usuario hace clic en la notificación Quiero abrir mi actividad principal, con algunos parámetros especiales. Por ejemplo un identificador de elemento, por lo que mi actividad puede cargar y presentar una visión especial detalle del artículo. Más específica, estoy descargando un archivo, y cuando se haya descargado el archivo que he deseable que la notificación tiene la intención de que cuando se hace clic se abre mi actividad en un modo especial. He intentado utilizar putExtra en mi intención, pero parece que no puede extraerlo, por lo que creo que estoy haciendo mal.

Código de mi servicio que crea la Notificación:

        // construct the Notification object.
     final Notification notif = new Notification(R.drawable.icon, tickerText, System.currentTimeMillis());


    final RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.custom_notification_layout);
    contentView.setImageViewResource(R.id.image, R.drawable.icon);
    contentView.setTextViewText(R.id.text, tickerText);
    contentView.setProgressBar(R.id.progress,100,0, false);
    notif.contentView = contentView;        

    Intent notificationIntent = new Intent(context, Main.class);
    notificationIntent.putExtra("item_id", "1001"); // <-- HERE I PUT THE EXTRA VALUE
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
    notif.contentIntent = contentIntent;

    nm.notify(id, notif);

Código de mi actividad que intenta recoger el parámetro extra de la notificación:

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);


    Bundle extras = getIntent().getExtras();
    if(extras != null){
        Log.i( "dd","Extra:" + extras.getString("item_id") );
    }

La extras es siempre nula y nunca consigue nada en mi registro.

Por cierto ... el onCreate es la única carrera cuando mi actividad comienza, si ya se ha iniciado mi actividad también quiero recoger los extras y presentar mi actividad de acuerdo con el item_id recibo.

¿Alguna idea?

¿Fue útil?

Solución

Tome un vistazo a esta guía ( crear una notificación ) y para muestras ApiDemos "StatusBarNotifications" y "NotificationDisplay".

Para la gestión de la actividad, si ya se está ejecutando tiene dos formas:

  1. Añadir FLAG_ACTIVITY_SINGLE_TOP de la bandera de la Intención al iniciar la actividad, y luego en la clase de actividad implementar onNewIntent (intención Intención) controlador de eventos, de esa manera se puede acceder a la nueva intención que fue llamado para la actividad (que no es lo mismo que simplemente llamando getIntent (), esto siempre devolverá el primer intento que puso en marcha su actividad.

  2. Igual que el número uno, pero en lugar de añadir una bandera a la Intención debe agregar "singleTop" en su actividad AndroidManifest.xml.

Si utiliza extras intención, remeber para llamar PendingIntent.getActivity() con el PendingIntent.FLAG_UPDATE_CURRENT bandera, de lo contrario los mismos extras serán reutilizados para cada notificación.

Otros consejos

tuve el mismo problema mi aplicación muestra notificaciones de mensajes. Cuando hay múltiples notificaciones y hacer clic en cada notificación que muestra el detalle de que la notificación de una actividad de mensajes vista. He resuelto el problema de los mismos parámetros adicionales se recibe en el mensaje vista intención.

Aquí está el código que fija esto. Código para crear la intención de notificación.

 Intent notificationIntent = new Intent(getApplicationContext(), viewmessage.class);
    notificationIntent.putExtra("NotificationMessage", notificationMessage);
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingNotificationIntent = PendingIntent.getActivity(getApplicationContext(),notificationIndex,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notification.setLatestEventInfo(getApplicationContext(), notificationTitle, notificationMessage, pendingNotificationIntent);

Código de Actividad vista mensaje.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    onNewIntent(getIntent());
}

@Override
public void onNewIntent(Intent intent){
    Bundle extras = intent.getExtras();
    if(extras != null){
        if(extras.containsKey("NotificationMessage"))
        {
            setContentView(R.layout.viewmain);
            // extract the extra-data in the Notification
            String msg = extras.getString("NotificationMessage");
            txtView = (TextView) findViewById(R.id.txtMessage);
            txtView.setText(msg);
        }
    }


}

Tal vez un poco tarde, pero: en lugar de esto:

public void onNewIntent(Intent intent){
    Bundle extras = intent.getExtras();
    Log.i( "dbg","onNewIntent");

    if(extras != null){
        Log.i( "dbg", "Extra6 bool: "+ extras.containsKey("net.dbg.android.fjol"));
        Log.i( "dbg", "Extra6 val : "+ extras.getString("net.dbg.android.fjol"));

    }
    mTabsController.setActiveTab(TabsController.TAB_DOWNLOADS);
}

Utilice esta:

Bundle extras = getIntent().getExtras();
if(extras !=null) {
    String value = extras.getString("keyName");
}

Encuentro misma cuestión aquí. Resuelvo mediante el uso de diferentes códigos de solicitud, el uso mismo ID que la notificación, mientras que la creación PendingIntent. pero todavía no se sabe por qué esto debe hacerse.

PendingIntent contentIntent = PendingIntent.getActivity(context, **id**, notificationIntent, 0);
notif.contentIntent = contentIntent;
nm.notify(**id**, notif);

Después de leer algunas de las listas de correo electrónico y otros foros me encontré con que el truco parece añadir som datos únicos a la intención.

como esto:

   Intent notificationIntent = new Intent(Main.this, Main.class);
   notificationIntent.putExtra("sport_id", "sport"+id);
   notificationIntent.putExtra("game_url", "gameURL"+id);

   notificationIntent.setData((Uri.parse("foobar://"+SystemClock.elapsedRealtime()))); 

No entiendo por qué esto tiene que hacerse, tiene algo que ver con la intención no puedo ser identificado sólo por sus extras ...

He intentado todo, pero nada funcionó.

finalmente se le ocurrió la solución siguiente.

1- En Agregar manifiesto para la actividad             android: launchMode = "singleTop"

2- mientras que hace intención pendiente hacer lo siguiente, haz de uso en lugar de directamente a través de intent.putString () o intent.putInt ()

                    Intent notificationIntent = new Intent(getApplicationContext(), CourseActivity.class);

                    Bundle bundle = new Bundle();
                    bundle.putString(Constants.EXAM_ID,String.valueOf(lectureDownloadStatus.getExamId()));
                    bundle.putInt(Constants.COURSE_ID,(int)lectureDownloadStatus.getCourseId());
                    bundle.putString(Constants.IMAGE_URL,lectureDownloadStatus.getImageUrl());

                    notificationIntent.putExtras(bundle);

                    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                            Intent.FLAG_ACTIVITY_SINGLE_TOP);
                    PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(),
                            new Random().nextInt(), notificationIntent,
                            PendingIntent.FLAG_UPDATE_CURRENT); 

AndroidManifest.xml

Incluir launchMode = "singleTop"

<activity android:name=".MessagesDetailsActivity"
        android:launchMode="singleTop"
        android:excludeFromRecents="true"
        />

SMSReceiver.java

Establecer las banderas de la intención y PendingIntent

Intent intent = new Intent(context, MessagesDetailsActivity.class);
    intent.putExtra("smsMsg", smsObject.getMsg());
    intent.putExtra("smsAddress", smsObject.getAddress());
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent contentIntent = PendingIntent.getActivity(context, notification_id, intent, PendingIntent.FLAG_UPDATE_CURRENT);

MessageDetailsActivity.java

onResume () -. Cada vez que se vuelve a llamar, cargar los extras

Intent intent = getIntent();
    String extraAddress = intent.getStringExtra("smsAddress");
    String extraBody = intent.getStringExtra("smsMsg");

Espero que ayuda, que se basa en otras respuestas aquí en StackOverflow, pero esta es la más actualizada que trabajó para mí.

Es fácil, este es mi solución utilizando objetos!

Mi POJO

public class Person implements Serializable{

    private String name;
    private int age;

    //get & set

}

Notificación Método

  Person person = new Person();
  person.setName("david hackro");
  person.setAge(10);

    Intent notificationIntent = new Intent(this, Person.class);
    notificationIntent.putExtra("person",person);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.notification_icon)
                .setAutoCancel(true)
                .setColor(getResources().getColor(R.color.ColorTipografiaAdeudos))
                .setPriority(2)
                .setLargeIcon(bm)
                .setTicker(fotomulta.getTitle())
                .setContentText(fotomulta.getMessage())
                .setContentIntent(PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT))
                .setWhen(System.currentTimeMillis())
                .setContentTitle(fotomulta.getTicketText())
                .setDefaults(Notification.DEFAULT_ALL);

Nueva actividad

 private Person person;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_notification_push);
    person = (Person) getIntent().getSerializableExtra("person");
}

Buena suerte !!

Después de hacer algunas búsqueda me dieron solución a partir de guía para desarrolladores Android

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 extra Intención en la clase Actividad de prueba que necesita para escribir código siguiente:

 Intent intent = getIntent();
 String extra = intent.getStringExtra("extra") ;

Si utiliza

android:taskAffinity="myApp.widget.notify.activity"
android:excludeFromRecents="true"

en su archivo AndroidManifest.xml para la actividad para poner en marcha, usted tiene que utilizar lo siguiente en su intención:

Intent notificationClick = new Intent(context, NotifyActivity.class);
    Bundle bdl = new Bundle();
    bdl.putSerializable(NotifyActivity.Bundle_myItem, myItem);
    notificationClick.putExtras(bdl);
    notificationClick.setData(Uri.parse(notificationClick.toUri(Intent.URI_INTENT_SCHEME) + myItem.getId()));
    notificationClick.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);  // schließt tasks der app und startet einen seperaten neuen

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addParentStack(NotifyActivity.class);
    stackBuilder.addNextIntent(notificationClick);

    PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
    mBuilder.setContentIntent(notificationPendingIntent);

importante es único conjunto de datos, por ejemplo, con un ID único como:

notificationClick.setData(Uri.parse(notificationClick.toUri(Intent.URI_INTENT_SCHEME) + myItem.getId()));

Servicios para su uso PendingIntent.FLAG_UPDATE_CURRENT

para mi trabajo.

Por favor, use como PendingIntent mismo tiempo que muestra la notificación de lo que se resuelva.

PendingIntent intención = PendingIntent.getActivity (esto, 0,                 notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Añadir PendingIntent.FLAG_UPDATE_CURRENT como último campo.

En la implementación de la notificación, utilice un código como el siguiente:

NotificationCompat.Builder nBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
...
Intent intent = new Intent(this, ExampleActivity.class);
intent.putExtra("EXTRA_KEY", "value");

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
nBuilder.setContentIntent(pendingIntent);
...

Para obtener valores adicionales Intención en el ExampleActivity, utilice el siguiente código:

...
Intent intent = getIntent();
if(intent!=null) {
    String extraKey = intent.getStringExtra("EXTRA_KEY");
}
...

NOTA MUY IMPORTANTE: la Intención :: putExtra () método es una sobrecargado uno. Para obtener la llave extra, es necesario utilizar extra Método Intención :: get [Tipo] ().

Nota: NOTIFICATION_ID y NOTIFICATION_CHANNEL_ID son una constantes declaradas en ExampleActivity

G'day, Yo también puedo decir que he intentado todo lo mencionado en estos puestos y algunos más de otros lugares. El problema # 1 para mí fue que el nuevo Intención siempre tenía un paquete nulo. Mi problema estaba en centrarse demasiado en los detalles de ".Esta tiene Incluí o .que". Mi solución fue en tomar un paso atrás en el detalle y mirando a la estructura general de la notificación. Cuando lo hice me las arreglé para colocar las piezas clave del código en la secuencia correcta. Por lo tanto, si usted está teniendo problemas similares de verificación para:

1. Intent notificationIntent = new Intent(MainActivity.this, NotificationActivity.class);

2a. Bundle bundle = new Bundle();

// me gusta que especifica el tipo de datos mucho mejor. por ejemplo bundle.putInt

2b. notificationIntent.putExtras(bundle);
3. PendingIntent contentIntent = PendingIntent.getActivity(MainActivity.this, WIZARD_NOTIFICATION_ID, notificationIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
4. NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
5.          NotificationCompat.Builder nBuilder =
                    new NotificationCompat.Builder(this)
                            .setSmallIcon(R.drawable.ic_notify)
                            .setContentTitle(title)
                            .setContentText(content)
                            .setContentIntent(contentIntent)
                            .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)
                            .setAutoCancel(false)//false is standard. true == automatically removes the notification when the user taps it.
                            .setColor(getResources().getColor(R.color.colorPrimary))
                            .setCategory(Notification.CATEGORY_REMINDER)
                            .setPriority(Notification.PRIORITY_HIGH)
                            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
            notificationManager.notify(WIZARD_NOTIFICATION_ID, nBuilder.build());

Con este secuencia I Obtener un conjunto válido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top