Ich versuche, die neue Benachrichtigungsoberfläche zu verwenden. Ich habe 3 Schaltflächen zu den Benachrichtigungen hinzugefügt und möchte etwas in meiner Datenbank speichern, sobald auf eine davon geklickt wird.
Die Benachrichtigung selbst funktioniert gut und wird angezeigt, wenn sie aufgerufen wird. Ich weiß nur nicht, wie die drei verschiedenen Tastenklicks erfasst werden.
Ich verwende ein BroadcastReceiver
, um die Klicks zu erfassen, weiß aber nicht, wie ich feststellen kann, auf welche Schaltfläche geklickt wurde.
Dies ist der Code von AddAction
(Ich habe den Rest der Benachrichtigung ausgeschlossen, da es gut funktioniert) -
//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);
Dies ist der Code des 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");
}
}
}
Ich habe das BroadcastReceiver
im Manifest registriert. Außerdem möchte ich erwähnen, dass das BroadcastReceiver
aufgerufen wird, wenn ich auf eine der Schaltflächen in der Benachrichtigung klicke, aber die Absicht enthält immer ein Extra von '2'.
Dies ist die Benachrichtigung iteslf -
Dies liegt daran, dass Sie FLAG_UPDATE_CURRENT mit Absichten verwenden, die dieselbe Aktion ausführen
Aus den Dokumenten:
wenn das beschriebene PendingIntent bereits vorhanden ist, behalten Sie es bei, aber ersetzen Sie die zusätzlichen Daten durch die Daten in diesem neuen Intent.
Wenn Sie pendingIntentMaybe
und pendingIntentNo
angeben, verwendet das System das PendingIntent
, das für pendingIntentYes
erstellt wurde, überschreibt jedoch die Extras. Somit beziehen sich alle drei Variablen auf dasselbe Objekt, und die letzten angegebenen Extras betrafen pendingIntentNo
.
Sie sollten für jedes Intent
eine alternative Aktion angeben. Sie können immer noch eine BroadcastReceiver
haben und alle drei Aktionen abfangen lassen. Das wäre auch semantisch weniger verwirrend :)
Ihr Benachrichtigungsposter:
//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);
Ihr Empfänger:
@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");
}
}
STEP_BY_STEP
Schritt 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());
}
Schritt 1.5
Ich habe eine globale Klasse AppConstant erstellt
public class AppConstant
{
public static final String YES_ACTION = "YES_ACTION";
public static final String STOP_ACTION = "STOP_ACTION";
}
Schritt 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();
}
}
}
Schritt 3
<receiver Android:name=".NotificationReceiver">
<intent-filter>
<action Android:name="YES_ACTION"/>
<action Android:name="STOP_ACTION"/>
</intent-filter>
</receiver>
in meinem Fall hat es nach dem Hinzufügen des Intent-Filters geklappt
<receiver Android:name=".AlarmReceiver">
<intent-filter>
<action Android:name="YES_ACTION"/>
<action Android:name="NO_ACTION"/>
<action Android:name="MAYBE_ACTION"/>
</intent-filter>
</receiver>
hier YES_ACTION
muss sein yourfullpackagename.YES
mögen
private static final String YES_ACTION = "com.example.packagename.YES";
ebenso können Sie NO_ACTION
oder MAYBE_ACTION
In BroadcastReceiver müssen Sie das gleiche YES_ACTION
wie oben angegeben,
bedeutet, dass Sie in der BroadcastReceiver-Klasse nach benutzerdefinierten Broadcasts suchen können, indem Sie folgende Schritte ausführen
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();
}
}
}
hinweis: Anstelle von JA in der Zeichenfolge YES_ACTION können Sie auch ein anderes Wort verwenden.