android notification - ¿Cómo enviar parámetros desde una notificación-clic a una actividad?




click event (11)

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.

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?


AndroidManifest.xml

Incluir launchMode = "singleTop"

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

SMSReceiver.java

Establezca las banderas para el Intent and 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 (): se llama cada vez, carga los extras.

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

Espero que ayude, se basó en otras respuestas aquí en , pero esta es la más actualizada que funcionó para mí.


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

¡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") ;

Después de leer algunas listas de correo electrónico y otros foros, descubrí que el truco parece agregar algunos datos únicos a la intención.

Me gusta 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é es necesario hacer esto, tiene algo que ver con la intención de no ser identificado solo por sus extras ...


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.


Tuve el problema similar de que mi aplicación muestra notificaciones de mensajes. Cuando hay varias notificaciones y hace clic en cada notificación, muestra ese detalle de notificación en una actividad de mensaje de vista. Resolví el problema de que se reciban los mismos parámetros adicionales a la vista del intento de mensaje.

Aquí está el código que solucionó 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 para ver la actividad del 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);
        }
    }


}

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

Tenga en cuenta que había mencionado el uso de SharedPreference . Tiene una API simple y es accesible a través de las actividades de una aplicación. Pero esta es una solución torpe, y es un riesgo de seguridad si pasa información confidencial. Es mejor usar intenciones. Tiene una lista extensa de métodos sobrecargados que se pueden usar para transferir mejor muchos tipos de datos diferentes entre actividades. Echa un vistazo a intent.putExtra . Este link presenta el uso de putExtra bastante bien.

Al pasar datos entre actividades, mi enfoque preferido es crear un método estático para la actividad relevante que incluya los parámetros necesarios para lanzar la intención. Que a continuación, proporciona una fácil configuración y recuperación de parámetros. Así puede verse así

public class MyActivity extends Activity {
    public static final String ARG_PARAM1 = "arg_param1";
...
public static getIntent(Activity from, String param1, Long param2...) {
    Intent intent = new Intent(from, MyActivity.class);
        intent.putExtra(ARG_PARAM1, param1);
        intent.putExtra(ARG_PARAM2, param2);
        return intent;
}

....
// Use it like this.
startActivity(MyActvitiy.getIntent(FromActivity.this, varA, varB, ...));
...

Luego, puede crear una intención para la actividad prevista y asegurarse de que tiene todos los parámetros. Se puede adaptar para fragmentos a. Un ejemplo simple arriba, pero entiendes la idea.





android android-intent bundle notifications