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>