notification example ejemplo android android-intent notifications broadcastreceiver android-4.0

example - notificationmanager android ejemplo



Determinar addAction clic para notificaciones de Android (4)

Estoy tratando de usar la nueva interfaz de notificaciones. Agregué 3 botones a las notificaciones y deseo guardar algo en mi base de datos una vez que se haga clic en cada uno de ellos.

La notificación en sí funciona bien y se muestra cuando se llama, simplemente no sé cómo capturar cada uno de los tres clics de botón diferentes.

Estoy usando un BroadcastReceiver para captar los clics, pero no sé cómo decir en qué botón se hizo clic.

Este es el código de AddAction (he excluido el resto de la notificación, ya que funciona bien) -

//Yes intent Intent yesReceive = new Intent(); yesReceive.setAction(CUSTOM_INTENT); Bundle yesBundle = new Bundle(); yesBundle.putInt("userAnswer", 1);//This is the value I want to pass yesReceive.putExtras(yesBundle); PendingIntent pendingIntentYes = PendingIntent.getBroadcast(this, 12345, yesReceive, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.addAction(R.drawable.calendar_v, "Yes", pendingIntentYes); //Maybe intent Intent maybeReceive = new Intent(); maybeReceive.setAction(CUSTOM_INTENT); Bundle maybeBundle = new Bundle(); maybeBundle.putInt("userAnswer", 3);//This is the value I want to pass maybeReceive.putExtras(maybeBundle); PendingIntent pendingIntentMaybe = PendingIntent.getBroadcast(this, 12345, maybeReceive, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.addAction(R.drawable.calendar_question, "Partly", pendingIntentMaybe); //No intent Intent noReceive = new Intent(); noReceive.setAction(CUSTOM_INTENT); Bundle noBundle = new Bundle(); noBundle.putInt("userAnswer", 2);//This is the value I want to pass noReceive.putExtras(noBundle); PendingIntent pendingIntentNo = PendingIntent.getBroadcast(this, 12345, noReceive, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.addAction(R.drawable.calendar_x, "No", pendingIntentNo);

Este es el código de BroadcastReceiver -

public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.v("shuffTest","I Arrived!!!!"); //Toast.makeText(context, "Alarm worked!!", Toast.LENGTH_LONG).show(); Bundle answerBundle = intent.getExtras(); int userAnswer = answerBundle.getInt("userAnswer"); if(userAnswer == 1) { Log.v("shuffTest","Pressed YES"); } else if(userAnswer == 2) { Log.v("shuffTest","Pressed NO"); } else if(userAnswer == 3) { Log.v("shuffTest","Pressed MAYBE"); } } }

He registrado el BroadcastReceiver en el Manifiesto. Además, quiero mencionar que se llama al BroadcastReceiver cuando hago clic en uno de los botones en la notificación, pero la intención siempre incluye un extra de ''2''.

Esta es la notificación en sí misma -


Es porque estás usando FLAG_UPDATE_CURRENT con Intents que tienen la misma acción

De los documentos:

si el PendingIntent descrito ya existe, guárdelo pero reemplaza sus datos adicionales con lo que está en este nuevo Intent.

Cuando especifica pendingIntentMaybe y pendingIntentNo , el sistema usa PendingIntent creado para pendingIntentYes , pero sobrescribe los extras. Por lo tanto, las tres variables se refieren al mismo objeto, y los últimos extras especificados fueron para pendingIntentNo .

Debe especificar una acción alternativa para cada Intent . Todavía puede tener un BroadcastReceiver , y simplemente hacer que intercepte las tres acciones. Esto sería menos confuso semánticamente también :)

Su cartel de notificación:

//Yes intent Intent yesReceive = new Intent(); yesReceive.setAction(YES_ACTION); PendingIntent pendingIntentYes = PendingIntent.getBroadcast(this, 12345, yesReceive, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.addAction(R.drawable.calendar_v, "Yes", pendingIntentYes); //Maybe intent Intent maybeReceive = new Intent(); maybeReceive.setAction(MAYBE_ACTION); PendingIntent pendingIntentMaybe = PendingIntent.getBroadcast(this, 12345, maybeReceive, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.addAction(R.drawable.calendar_question, "Partly", pendingIntentMaybe); //No intent Intent noReceive = new Intent(); noReceive.setAction(NO_ACTION); PendingIntent pendingIntentNo = PendingIntent.getBroadcast(this, 12345, noReceive, PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.addAction(R.drawable.calendar_x, "No", pendingIntentNo);

Su receptor:

@Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(YES_ACTION.equals(action)) { Log.v("shuffTest","Pressed YES"); } else if(MAYBE_ACTION.equals(action)) { Log.v("shuffTest","Pressed NO"); } else if(NO_ACTION.equals(action)) { Log.v("shuffTest","Pressed MAYBE"); } }


aquí YES_ACTION debe ser su nombre yourfullpackagename.YES

me gusta

private static final String YES_ACTION = "com.example.packagename.YES";

Del mismo modo, puede usar NO_ACTION o MAYBE_ACTION

En BroadcastReceiver tienes que usar el mismo YES_ACTION como se declaró anteriormente,

significa que en la clase BroadcastReceiver puede verificar la difusión personalizada siguiendo

public class NotificationReceiver extends BroadcastReceiver { private static final String YES_ACTION = "com.example.packagename.YES"; @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String action = intent.getAction(); if(YES_ACTION.equals(action)) { Toast.makeText(context, "CALLED", Toast.LENGTH_SHORT).show(); } }

}

Nota: en lugar de SÍ en la cadena SÍ_ACCIÓN, también puede usar otras palabras.


en Mi caso, funcionó para mí después de agregar el filtro de intención

<receiver android:name=".AlarmReceiver"> <intent-filter> <action android:name="YES_ACTION"/> <action android:name="NO_ACTION"/> <action android:name="MAYBE_ACTION"/> </intent-filter> </receiver>


PASO A PASO

Paso 1

public void noto2() // paste in activity { Notification.Builder notif; NotificationManager nm; notif = new Notification.Builder(getApplicationContext()); notif.setSmallIcon(R.drawable.back_dialog); notif.setContentTitle(""); Uri path = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); notif.setSound(path); nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Intent yesReceive = new Intent(); yesReceive.setAction(AppConstant.YES_ACTION); PendingIntent pendingIntentYes = PendingIntent.getBroadcast(this, 12345, yesReceive, PendingIntent.FLAG_UPDATE_CURRENT); notif.addAction(R.drawable.back_dialog, "Yes", pendingIntentYes); Intent yesReceive2 = new Intent(); yesReceive2.setAction(AppConstant.STOP_ACTION); PendingIntent pendingIntentYes2 = PendingIntent.getBroadcast(this, 12345, yesReceive2, PendingIntent.FLAG_UPDATE_CURRENT); notif.addAction(R.drawable.back_dialog, "No", pendingIntentYes2); nm.notify(10, notif.getNotification()); }

Paso 1.5

Creé un AppConstant de clase global

public class AppConstant { public static final String YES_ACTION = "YES_ACTION"; public static final String STOP_ACTION = "STOP_ACTION"; }

Paso 2:

public class NotificationReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String action = intent.getAction(); if (AppConstant.YES_ACTION.equals(action)) { Toast.makeText(context, "YES CALLED", Toast.LENGTH_SHORT).show(); } else if (AppConstant.STOP_ACTION.equals(action)) { Toast.makeText(context, "STOP CALLED", Toast.LENGTH_SHORT).show(); } }

}

Paso 3

<receiver android:name=".NotificationReceiver"> <intent-filter> <action android:name="YES_ACTION"/> <action android:name="STOP_ACTION"/> </intent-filter> </receiver>