intent - show notifications in android




¿Cómo enviar parámetros desde una notificación-clic a una actividad? (8)

Puedo encontrar una forma de enviar parámetros a mi actividad desde 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, una identificación de artículo, por lo que mi actividad puede cargarse y presentar una vista de detalles de elementos especiales. Más específicamente, estoy descargando un archivo, y cuando el archivo se descarga quiero que la notificación tenga la intención de que cuando se haga clic abra mi actividad en un modo especial. Intenté usar putExtra en mi intento, pero parece que no puedo extraerlo, así que creo que lo 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 obtener el parámetro adicional 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") );
    }

Los extras siempre son nulos y nunca obtengo nada en mi registro.

Por cierto ... el onCreate solo se ejecuta cuando se inicia mi actividad, si mi actividad ya está comenzada también quiero recoger los extras y presentar mi actividad de acuerdo con el item_id que recibo.

¿Algunas ideas?


¡Es fácil, esta es mi solución usando objetos!

Mi POJO

public class Person implements Serializable{

    private String name;
    private int age;

    //get & set

}

Notificación de 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úsquedas obtuve una solución de la guía para desarrolladores de 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 adicional en la clase de actividad de prueba, debe escribir el siguiente código:

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

Eche un vistazo a esta guía ( creando una notificación ) y muestree ApiDemos "StatusBarNotifications" y "NotificationDisplay".

Para gestionar si la actividad ya se está ejecutando, tiene dos formas:

  1. Agregue el indicador FLAG_ACTIVITY_SINGLE_TOP al Intento cuando lance la actividad y luego en la clase de actividad implemente el controlador de eventos onNewIntent (intención intencional) , de esa manera puede acceder al nuevo intento que fue llamado para la actividad (que no es lo mismo que llamar a getIntent (), esto siempre devolverá la primera intención que inició su actividad.

  2. Igual que el número uno, pero en lugar de agregar un indicador al Intento, debe agregar "singleTop" en su actividad AndroidManifest.xml.

Si usa extras de intención, PendingIntent.getActivity() llamar a PendingIntent.getActivity() con el indicador PendingIntent.FLAG_UPDATE_CURRENT , de lo contrario los mismos extras se reutilizarán para cada notificación.


Encuentro el mismo problema aquí. Lo resuelvo utilizando un código de solicitud diferente, uso la misma identificación como notificación, mientras creo PendingIntent. pero todavía no sé por qué esto debe hacerse.

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

Si utiliza

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

en su archivo AndroidManifest.xml para que se inicie la actividad, debe usar lo siguiente en su intento:

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 establecer datos únicos, por ejemplo, usando una identificación única como:

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

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);
}

Utilizar esta:

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

Utilice como PendingIntent mientras se muestra la notificación de lo que se resolverá.

PendingIntent intent = PendingIntent.getActivity (this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Agregue PendingIntent.FLAG_UPDATE_CURRENT como último campo.


para Servicios use PendingIntent.FLAG_UPDATE_CURRENT

para mi trabajo





notifications