web-dev-qa-db-fra.com

Déterminez addAction cliquez pour Android notifications

J'essaie d'utiliser la nouvelle interface de notifications. J'ai ajouté 3 boutons aux notifications et je souhaite enregistrer quelque chose dans ma base de données une fois que chacun d'entre eux est cliqué.

La notification elle-même fonctionne bien et s'affiche lorsque vous l'appelez. Je ne sais pas comment capturer chacun des trois clics de bouton différents.

J'utilise un BroadcastReceiver pour capturer les clics, mais je ne sais pas comment dire quel bouton a été cliqué.

Ceci est le code de AddAction (j'ai exclu le reste de la notification car il fonctionne 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);

C'est le code du 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");
    }

}           
}

J'ai enregistré le BroadcastReceiver dans le manifeste. De plus, je tiens à mentionner que le BroadcastReceiver est appelé lorsque je clique sur l'un des boutons de la notification, mais l'intention inclut toujours un extra de '2'.

C'est la notifcation iteslf - notification

60
Tofira

C'est parce que vous utilisez FLAG_UPDATE_CURRENT avec des intentions qui ont la même action

De la docs:

si le PendingIntent décrit existe déjà, conservez-le, mais remplacez-le par ses données supplémentaires par le contenu de ce nouvel Intent.

Lorsque vous spécifiez pendingIntentMaybe et pendingIntentNo, le système utilise le PendingIntent créé pour pendingIntentYes, mais il remplace les extras. Ainsi, les trois variables font référence au même objet et les derniers extras spécifiés concernent pendingIntentNo.

Vous devez spécifier une action alternative pour chaque Intent. Vous pouvez toujours avoir un BroadcastReceiver et le faire intercepter les trois actions. Ce serait moins déroutant sémantiquement aussi :)

Votre affiche de notification:

//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);

Votre récepteur:

@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

étape 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());
}

étape 1.5

J'ai créé une classe globale AppConstant

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

étape 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();
    }
}

}

étape

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

        </intent-filter>
    </receiver>
15
amanpreet singh

dans mon cas, cela a fonctionné pour moi après l'ajout du filtre d'intention

 <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

ici YES_ACTION doit être yourfullpackagename.YES

comme

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

de même, vous pouvez utiliser NO_ACTION ou MAYBE_ACTION

Dans BroadcastReceiver, vous devez utiliser les mêmes YES_ACTION comme déclaré ci-dessus,

signifie dans la classe BroadcastReceiver que vous pouvez vérifier la diffusion personnalisée en suivant

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();
    }
}

}

remarque: au lieu de YES dans la chaîne YES_ACTION, vous pouvez également utiliser un autre mot.

2
Chankya Hirapra