Notificación de Android con botones en ella

Estoy tratando de hacer una notificación con 2 botones:

  • uno me lleva de vuelta a la actividad
  • el otro lo cierra

¿Alguien tiene una idea sobre cómo atrapar el evento de clic de botón (recuerde que la Actividad está en pausa)?

¡Me complace publicarlo! Después de trabajar toda la noche encontré algo. ¡Así que, aquí vamos!

1. Cree un archivo de diseño xml para su notificación.

2. Crea la notificación usando Notification.Builder. Después de agregar todo lo que desee (íconos, sonidos, etc.) haga esto:

//R.layout.notification_layout is from step 1 RemoteViews contentView=new RemoteViews(ctx.getPackageName(), R.layout.notification_layout); setListeners(contentView);//look at step 3 notification.contentView = contentView; 

3. Crea un método setListeners. Dentro de este método debes escribir esto:

  //HelperActivity will be shown at step 4 Intent radio=new Intent(ctx, packagename.youractivity.class); radio.putExtra("AN_ACTION", "do");//if necessary PendingIntent pRadio = PendingIntent.getActivity(ctx, 0, radio, 0); //R.id.radio is a button from the layout which is created at step 2 view.setOnClickPendingIntent(R.id.radio, pRadio); //Follows exactly my code! Intent volume=new Intent(ctx, tsapalos11598712.bill3050.shortcuts.helper.HelperActivity.class); volume.putExtra("DO", "volume"); //HERE is the whole trick. Look at pVolume. I used 1 instead of 0. PendingIntent pVolume = PendingIntent.getActivity(ctx, 1, volume, 0); view.setOnClickPendingIntent(R.id.volume, pVolume); 

4. Para mis requisitos utilicé una HelperActivity que responde a los bashs. Pero para ti no creo que sea necesario.

Si quieres el código fuente completo, puedes navegarlo o descargarlo desde mi git repo. El código es para uso personal, así que no espere leer un código precioso con muchos comentarios. https://github.com/BILLyTheLiTTle/AndroidProject_Shortcuts

TODO LO ANTERIOR, RESPONDE LA PREGUNTA DE CAPTAR EL EVENTO DE DIFERENTES BOTONES.

Acerca de cancelar la notificación, te redirecciono aquí

Cómo borrar una notificación en Android

Solo recuerde usar la identificación que analizó en el método de notificación cuando llamó a la notificación por primera vez

En cuanto a ICS, la pregunta es simple de responder porque el comportamiento requerido refleja la notificación predeterminada: puede cerrar una notificación deslizándola hacia la derecha, y puede definir a qué actividad enviar al usuario cuando la presiona simplemente usando PendingIntent :

 // The PendingIntent to launch our activity if the user selects this // notification. Note the use of FLAG_CANCEL_CURRENT so that, if there // is already an active matching pending intent, cancel it and replace // it with the new array of Intents. PendingIntent contentIntent = PendingIntent.getActivities(this, 0, makeMessageIntentStack(this, from, message), PendingIntent.FLAG_CANCEL_CURRENT); 

código tomado de http://developer.android.com/guide/topics/ui/notifiers/notifications.html

Si desea asignar un bash específico a un botón:

 views.setOnClickPendingIntent(R.id.your_button_id, pendingIntent); 

Supongo que solo necesita enviar un bash cuando se hace clic en el botón, por lo que debe EVITAR la configuración del bash de notificación principal.

 notification.contentIntent = yourPendingIntent; 

De lo contrario (si establece “notification.contentIntent = pendingIntent;” como de costumbre) se llamarán ambos bashs, que pueden no ser los que usted desea / el usuario espera.

Si aún desea presionar otras partes de la notificación para invocar ese bash general (o cualquier otro) puede usar el mismo método de asignación de intención por visión que el anterior. No te olvides de configurar

 android:clickable="true" 

a cualquier vista que quiera rastrear en Click () para.

Puedes rastrear estos bashs por sus extras en la actividad a la que llaman. Si lo está llamando actividad principal / iniciador , entonces los rastreará aquí (como viene de javadoc para este método):

 @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); Bundle data = intent.getExtras(); if (data != null && data.containsKey(YOUR_INTENT_KEY_SOURCE_CONSTANT)) { // process your notification intent } // go on with smth else } 

Simplemente puede agregar botones de acción en su Notification configurando la acción en su Notification.Builder y definiendo PendingIntent para cada acción

a continuación está el código de muestra:

  NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.notification_icon) .setContentTitle("My notification") .setContentText("Hello World!") .addAction(R.drawable.action_posetive,"posetive",PendingIntent.getActivity(0,intent,0)) .addAction(R.drawable.action_clear,"clear",PendingIntent.getActivity(0,intent,0)); NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(0, mBuilder.build()); 

Hay un ejemplo completo para ti aquí

  //Add this code to onCreate or some onclick Buttton NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext()); long when = System.currentTimeMillis(); builder.setSmallIcon(R.drawable.ic_notification); Intent notificationIntent = new Intent(getApplicationContext(), notificationActivity.class).putExtra("notification", "1"); PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 1, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(contentIntent); Notification notification = builder.getNotification(); notification.when = when; RemoteViews remoteViews = new RemoteViews(getApplicationContext().getPackageName(), R.layout.notification_view); remoteViews.setTextViewText(R.id.tvName, "New Name"); listener(remoteViews,getApplicationContext()); notification.contentView = remoteViews; notification.flags |= Notification.FLAG_AUTO_CANCEL; manager.notify(1, notification); 

y luego puedes definir el método del oyente:

  public void listener(RemoteViews remoteViews, Context context) { // you have to make intetns for each action (your Buttons) Intent intent = new Intent("Accept"); Intent intent2 = new Intent("Reject"); PendingIntent pendingIntent = PendingIntent.getBroadcast(context,1,intent,0); PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context,1,intent2,0); // add actions here ! IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("Accept"); intentFilter.addAction("Reject"); BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals("Accept")){ Toast.makeText(context, "Accepted !!", Toast.LENGTH_SHORT).show(); } else if(intent.getAction().equals("Reject")) { Toast.makeText(context, "Rejected !!", Toast.LENGTH_SHORT).show(); } } }; context.registerReceiver(receiver,intentFilter); remoteViews.setOnClickPendingIntent(R.id.ivRequest,pendingIntent); remoteViews.setOnClickPendingIntent(R.id.ivReject,pendingIntent2); } 

y aquí está el diseño de notification_view para personalizar su notificación.