56

J'essaie d'utiliser la nouvelle interface de notifications. J'ai ajouté 3 boutons aux notifications, et je veux enregistrer quelque chose dans ma base de données une fois que chacun d'eux est cliqué.Determine addAction click pour les notifications Android

La notification elle-même fonctionne bien et est affichée lors de l'appel, je ne sais tout simplement pas comment capturer chacun des trois clics différents.

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

C'est le code de AddAction (je l'ai exclu le reste de la notification, comme 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"); 
    } 

}   
} 

I J'ai enregistré le BroadcastReceiver dans le manifeste. En outre, je tiens à mentionner que le BroadcastReceiver est appelé lorsque je clique sur l'un des boutons de la notification, mais l'intention comprend toujours un supplément de '2'.

Ceci est la notifcation iteslf - notification

+0

qui est étrange. Je ne vois aucune erreur dans votre code. Si vous modifiez l'ordre de addAction() (et la création PendingIntent), obtenez-vous toujours '2'? – Quanturium

+0

Dans ce cas, il me donne juste le dernier addAction() que j'ai appelé – Tofira

+0

Je peux enregistrer trois BroadcastReceivers pour chacun des trois boutons, mais je veux vraiment éviter cela. – Tofira

Répondre

103

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

De la documentation:

si le existe PendingIntent décrit déjà , alors gardez-le mais remplacez ses données supplémentaires par ce qui est dans cette nouvelle intention.

Lorsque vous spécifiez pendingIntentMaybe et pendingIntentNo, le système utilise le PendingIntent créé pour pendingIntentYes, mais il écrase les extras. Ainsi, les trois variables se réfèrent au même objet, et les derniers extras spécifiés sont pour pendingIntentNo. Vous devez spécifier une action alternative pour chaque Intent. Vous pouvez toujours en avoir un BroadcastReceiver, et il suffit qu'il intercepte les trois actions.Ce serait moins déroutant sémantiquement aussi bien :)

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"); 
    } 
}   
+1

J'ai un doute que je dois effacer. J'utilise une classe de service simple pour démarrer, mettre en pause et arrêter le service. Il y a donc un bouton d'image qui va changer son image dessinable si je clique, c'est à dire jouer pour mettre en pause l'image ou le verset. Dans le code ci-dessus vous avez mentionné mBuilder.addAction qui contient un drawable. Je ne suis pas capable de comprendre où est l'identifiant de l'image ?? est-il possible d'avoir deux tirables mais seulement pour un bouton d'image. –

+2

Je reçois une erreur dans YES_ACTION.equals (action) pourquoi? comment résoudre ce problème. –

+0

où et comment vous définissez YES_ACTION, NO_ACTION ... etc ... Et à quoi ressemblera le fichier manifestiste – Cripto

10

dans mon cas, il a travaillé pour moi après avoir ajouté l'intention filtre

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

meilleure pratique (y) –

2

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

En BroadcastReceiver vous devez utiliser le même YES_ACTION tel que déclaré ci-dessus,

signifie en classe BroadcastReceiver vous pouvez vérifier sur mesure Diffusé par 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(); 
    } 
} 

}

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

8

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éé un AppConstant de classe mondiale

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 3

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

     </intent-filter> 
    </receiver> 
+0

cela fonctionne-t-il? Avez-vous testé cela? –

+0

Oui, ça marche plutôt bien, je l'ai testé tout à l'heure – ysfcyln

+0

Fonctionne bien, j'ai essayé, pas de problème ... – Venkat

Questions connexes