Evento OnHaga clic en un botón en una notificación personalizada

Tengo una notificación personalizada con un botón. Para configurar la notificación y usar el evento OnClick en mi botón, he usado este código:

//Notification and intent of the notification Notification notification = new Notification(R.drawable.stat_notify_missed_call, "Custom Notification", System.currentTimeMillis()); Intent mainIntent = new Intent(getBaseContext(), NotificationActivity.class); PendingIntent pendingMainIntent = PendingIntent.getActivity(getBaseContext(), 0, mainIntent , 0); notification.contentIntent = pendingMainIntent; //Remoteview and intent for my button RemoteViews notificationView = new RemoteViews(getBaseContext().getPackageName(), R.layout.remote_view_layout); Intent activityIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:190")); PendingIntent pendingLaunchIntent = PendingIntent.getActivity(getBaseContext(), 0, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT); notificationView.setOnClickPendingIntent(R.id.button1, pendingLaunchIntent); notification.contentView = notificationView; notificationManager.notify(CUSTOM_NOTIFICATION_ID, notification); 

Con este código tengo una notificación personalizada con mi diseño personalizado … ¡pero no puedo hacer clic en el botón! cada vez que bash hacer clic en el botón, hago clic en la notificación completa y, por lo tanto, el script inicia el “mainIntent” en lugar de “activityIntent”.

He leído en Internet que este código no funciona en todas las terminales. Lo he probado en el emulador y en un HTC Magic, pero siempre tengo el mismo problema: ¡no puedo hacer clic en el botón!

Mi código es correcto? ¿Puede ayudarme alguien?

Gracias,

Simone

Estoy escribiendo código en mi clase MyActivity.java que amplía android.app.Activity

Crea una notificación personalizada, cuando el usuario hace clic en el botón envía una broadcast . Hay un receptor de difusión que recibe la broadcast .

 private void createDownloadNotification() { Intent closeButton = new Intent("Download_Cancelled"); closeButton.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingSwitchIntent = PendingIntent.getBroadcast(this, 0, closeButton, 0); RemoteViews notificationView = new RemoteViews(getPackageName(), R.layout.widget_update_notification); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setSmallIcon(R.drawable.ic_launcher).setTicker("Ticker Text").setContent(notificationView); notificationView.setProgressBar(R.id.pb_progress, 100, 12, false); notificationView.setOnClickPendingIntent(R.id.btn_close, pendingSwitchIntent); notificationManager.notify(1, builder.build()); } public static class DownloadCancelReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { System.out.println("Received Cancelled Event"); } } 

Registrar el receptor en AndroidManifest.xml

      

Como es de clase interna, debe usar el signo $

Widget xml está aquí

      

mira esto

  1. Crea un archivo de diseño xml para tu 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 usé 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

parece que setOnClickPendingIntent no funciona cuando se usa dentro de colecciones.

Intente setPendingIntentTemplate en lugar de setOnClickPendingIntent . para más información debajo del enlace del desarrollador de Android …

Haga clic aquí para obtener más detalles: visite el sitio para desarrolladores de Android.

parece que setOnClickPendingIntent no funciona cuando se usa dentro de colecciones:

http://developer.android.com/reference/android/widget/RemoteViews.html#setOnClickPendingIntent(int,%20android.app.PendingIntent)

Intenta usar setPendingIntentTemplate en su lugar.

Debe crear el servicio para detectar el evento Click: por ejemplo, Create NotificationIntentService.class y poner debajo del código:

 public class NotificationIntentService extends IntentService { /** * Creates an IntentService. Invoked by your subclass's constructor. */ public NotificationIntentService() { super("notificationIntentService"); } @Override protected void onHandleIntent(Intent intent) { switch (intent.getAction()) { case "left": android.os.Handler leftHandler = new android.os.Handler(Looper.getMainLooper()); leftHandler.post(new Runnable() { @Override public void run() { Toast.makeText(getBaseContext(), "You clicked the left button", Toast.LENGTH_LONG).show(); } }); break; case "right": android.os.Handler rightHandler = new android.os.Handler(Looper.getMainLooper()); rightHandler.post(new Runnable() { @Override public void run() { Toast.makeText(getBaseContext(), "You clicked the right button", Toast.LENGTH_LONG).show(); } }); break; } } 

}

Agregue este método a su actividad: private void sendNotification () {

  RemoteViews expandedView = new RemoteViews(getPackageName(), R.layout.view_expanded_notification); expandedView.setTextViewText(R.id.timestamp, DateUtils.formatDateTime(this, System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME)); expandedView.setTextViewText(R.id.notification_message, mEditText.getText()); // adding action to left button Intent leftIntent = new Intent(this, NotificationIntentService.class); leftIntent.setAction("left"); expandedView.setOnClickPendingIntent(R.id.left_button, PendingIntent.getService(this, 0, leftIntent, PendingIntent.FLAG_UPDATE_CURRENT)); // adding action to right button Intent rightIntent = new Intent(this, NotificationIntentService.class); rightIntent.setAction("right"); expandedView.setOnClickPendingIntent(R.id.right_button, PendingIntent.getService(this, 1, rightIntent, PendingIntent.FLAG_UPDATE_CURRENT)); RemoteViews collapsedView = new RemoteViews(getPackageName(), R.layout.view_collapsed_notification); collapsedView.setTextViewText(R.id.timestamp, DateUtils.formatDateTime(this, System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME)); NotificationCompat.Builder builder = new NotificationCompat.Builder(this) // these are the three things a NotificationCompat.Builder object requires at a minimum .setSmallIcon(R.drawable.ic_pawprint) .setContentTitle(NOTIFICATION_TITLE) .setContentText(CONTENT_TEXT) // notification will be dismissed when tapped .setAutoCancel(true) // tapping notification will open MainActivity .setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0)) // setting the custom collapsed and expanded views .setCustomContentView(collapsedView) .setCustomBigContentView(expandedView) // setting style to DecoratedCustomViewStyle() is necessary for custom views to display .setStyle(new android.support.v7.app.NotificationCompat.DecoratedCustomViewStyle()); // retrieves android.app.NotificationManager NotificationManager notificationManager = (android.app.NotificationManager) getSystemService(NOTIFICATION_SERVICE); notificationManager.notify(0, builder.build()); } 

}