38 votes

getExtra from Intent lancé à partir d'un waitingIntent

Je suis en train de faire de certaines alarmes lorsque l'utilisateur sélectionne quelque chose avec un temps à partir d'une liste et de créer une notification pour elle à ce moment là. Mon problème est que le "showname" qu'un putExtra sur mon Intention ne peut pas être reçu au récepteur de radiodiffusion. Il est toujours la valeur null. C'est la façon dont je le fais pour la plupart de mes intentions mais je pense que cette fois peut-être à cause de la pendingIntent ou le broadcastReceiver quelque chose doit être fait differentelly. Merci

La fonction qui envoie l'Intention par le biais de l'attente de l'intention

public void setAlarm(String showname,String time) {

    String[] hourminute=time.split(":");
    String hour = hourminute[0];
    String minute = hourminute[1];
    Calendar rightNow = Calendar.getInstance();
    rightNow.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hour));
    rightNow.set(Calendar.MINUTE, Integer.parseInt(minute));
    rightNow.set(Calendar.SECOND, 0);
    long t=rightNow.getTimeInMillis();
    long t1=System.currentTimeMillis();

    try {   

    Intent intent = new Intent(this, alarmreceiver.class);  
    Bundle c = new Bundle();            
    c.putString("showname", showname);//This is the value I want to pass
    intent.putExtras(c);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 12345, intent, 0);

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, rightNow.getTimeInMillis(),pendingIntent);
    //Log.e("ALARM", "time of millis: "+System.currentTimeMillis());
    Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();

    } catch (Exception e) {
        Log.e("ALARM", "ERROR IN CODE:"+e.toString());
    }
}

Et c'est la fin de réception

public class alarmreceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    // Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show();      
    Bundle b = intent.getExtras();
    String showname=b.getString("showname");//This is where I suppose to receive it but its null
    NotificationManager manger = (NotificationManager) context
            .getSystemService(context.NOTIFICATION_SERVICE);

    Notification notification = new Notification(R.drawable.icon,
            "TVGuide Υπενθύμιση", System.currentTimeMillis());
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
            new Intent(context, tvguide.class), 0);

    notification.setLatestEventInfo(context, "Το Πρόγραμμα Ξεκίνησε",
            showname, contentIntent);

    notification.flags = Notification.FLAG_ONLY_ALERT_ONCE;

    notification.sound = Uri.parse("file:///sdcard/dominating.mp3");
    notification.vibrate = new long[]{100, 250, 100, 500};
    manger.notify(1, notification);
}           
}

52voto

Priyank Points 4753

Si vous modifiez la valeur de l'élément Extra dans l'intention, vous devez utiliser l'indicateur PendingIntent.FLAG_CANCEL_CURRENT lors de la création de l'intention en attente.

Un exemple simple serait

 PendingIntent pi = PendingIntent.getBroadcast(context, 0,intentWithNewExtras,PendingIntent.FLAG_CANCEL_CURRENT);
 

C’est la bonne façon de faire et vous assurera que vos nouvelles valeurs sont livrées.

J'espère que ça aide.

24voto

aioobe Points 158466

Les intentions sont réutilisés dans le système, sauf si elles diffèrent sur le contexte/l'action, je crois. La Documentation De Lien. C'est, si vous avez déjà construit une Intention, que l'intention peut être utilisé plus tard.

Comme un debug-test, vous pouvez essayer d'ajouter intent.setAction("" + Math.random()) - dessous intent.putExtras(c) et voir si vos extras sont reçus dans l'autre extrémité.

Documents Pertinents:

En raison de ce comportement, il est important de savoir quand deux Intentions sont les mêmes pour les fins de la récupération d'un PendingIntent. Une erreur commune que les gens font est de créer de multiples PendingIntent des objets avec des Intentions qui ne varient qu'en leur "extra" table des matières, l'espoir d'obtenir un autre PendingIntent à chaque fois. Cela n'arrive pas. Les parties de l'Intention, qui sont utilisés pour l'appariement sont les mêmes que ceux définis par l'Intention.filterEquals. Si vous utilisez deux l'Intention des objets qui sont les mêmes que par l'Intention.filterEquals, alors vous obtiendrez la même PendingIntent pour eux deux.

9voto

poovi.org Points 2131

utilisez un code de demande différent pour différentes notifications d'alarme afin d'éviter d'écraser la même heure d'alarme.

0voto

nurisezgin Points 560

Vous devriez utiliser la méthode intent.putExtra() . Ne pas définir le paquet sur le segment des extras. Si vous définissez une chaîne, vous voudriez que intent.putExtra(<key>, value); tente de résoudre le problème. Je l'ai utilisé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X