webentwicklung-frage-antwort-db.com.de

Bestimmen Sie AddAction. Klicken Sie für Android Benachrichtigungen

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 - notification

60
Tofira

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");
    }
}           
113
Andy McSherry

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>
15
amanpreet singh

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>
10
touchchandra

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.

2
Chankya Hirapra