web-dev-qa-db-fra.com

getExtra from Intent lancé depuis un attenteIntent

J'essaie de faire des alarmes après que l'utilisateur sélectionne quelque chose avec une heure dans une liste et crée une notification à ce moment-là. Mon problème est que le "nom" qui indique qu'un putExtra de mon intention ne peut pas être reçu par le récepteur de diffusion. La valeur est toujours nulle. C’est ce que je fais la plupart du temps, mais je pense que cette fois-ci, peut-être à cause de l’attente ou de l’émission broadcastReceiver, il faut faire quelque chose de différent. Merci 

La fonction qui envoie l'intention par l'intention en attente

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);
}           
}
37
spagi

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.

51
Priyank

Les intentions sont réutilisées dans le système, à moins qu'elles diffèrent par le contexte/l'action, je crois. Lien de documentation . Autrement dit, si vous avez déjà construit une intention, cette intention peut également être utilisée ultérieurement.

En tant que test de débogage, vous pouvez essayer d'ajouter intent.setAction("" + Math.random()) en dessous de intent.putExtras(c) et voir si vos extras sont reçus à l'autre bout.

Documentation pertinente :

En raison de ce comportement, il est important de savoir quand deux intentions sont considérées comme identiques aux fins de la récupération d'un PendingIntent. Les gens commettent souvent l’erreur de créer plusieurs objets PendingIntent avec des intentions qui ne varient que par leur contenu "extra", en espérant obtenir un objet PendingIntent différent à chaque fois. Cela n'arrive pas Les parties de l’intention utilisées pour l’appariement sont les mêmes que celles définies par Intent.filterEquals. Si vous utilisez deux objets d'intention équivalents selon Intent.filterEquals, vous obtiendrez le même objet PendingIntent pour les deux.

24
aioobe

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

9
Pattabi Raman

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 devriez intent.putExtra(<key>, value); Essayez ceci, cela sera fait. Je l'ai utilisé. 

0
nurisezgin

J'ai eu le même problème. Je l'ai résolu en définissant une action sur l'intention, comme suggéré par @aioobe, et cette intention fonctionne comme par magie.

Voici ce que j'ai fait

  ` intent.putExtra("Name", mName);
    intent.putExtra("dateTime", newdate);
    intent.setAction("" + Math.random());`

J'espère que ça va aider quelqu'un, codage heureux ..! :)

0
SK_Droid