web-dev-qa-db-fra.com

Android ne peut pas transmettre les extras d'intention via AlarmManager

J'essaie de mettre un message supplémentaire dans mon intention de passer à AlarmManager pour qu'il se déclenche ultérieurement. Mon onReceive se déclenche correctement mais extras.getString () renvoie null

Installer:

public PendingIntent getPendingIntent(int uniqueRequestCode, String extra) {
    Intent intent = new Intent(this, ActionReceiver.class);
    intent.putExtra("EXTRA", extra);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode,
            intent, 0);
    return pendingIntent;
}

public void setSilentLater(TimeRule timeRule) {
    boolean[] weekdays = timeRule.getReoccurringWeekdays();
    int dayOfWeek = 0;

    for (boolean day : weekdays) {
        dayOfWeek++;
        if (day == true) {
            Calendar cal = Calendar.getInstance();

            AlarmManager alarmManager = (AlarmManager) this
                    .getSystemService(Context.ALARM_SERVICE);

            cal.set(Calendar.DAY_OF_WEEK, dayOfWeek);
            cal.set(Calendar.HOUR_OF_DAY,
                    timeRule.getStartTime().get(Calendar.HOUR_OF_DAY));
            cal.set(Calendar.MINUTE,
                    timeRule.getStartTime().get(Calendar.MINUTE));
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.MILLISECOND, 0);

            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                    cal.getTimeInMillis(), 3600000 * 7, getPendingIntent(0, "RINGER_OFF"));
  }
 }
}

Lorsque cela se déclenche, le message est vide:

public class ActionReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
         Bundle extras = intent.getExtras();
         String message = extras.getString("EXTRA"); //empty        
         if(message == "RINGER_OFF")
         {
             AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
             am.setRingerMode(AudioManager.RINGER_MODE_SILENT);
         }
         else if(message == "RINGER_ON")
         {
             AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
             am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
         }
    }
}
44
that_guy

J'ai quelques précisions qui pourraient aider les autres, à être associées à la solution de Someone Somewhere. Si vous transmettez des objets parcellaires personnalisés en supplément, le système d'exploitation peut ne pas être en mesure de les traiter, une exception interne se produit et vos extras sont perdus.

Avec Android N, même avec PendingIntent.FLAG_UPDATE_CURRENT Je ne peux pas récupérer mes extras Pacelable personnalisés.

J'ai donc dû utiliser le système Parcelable connu (comme ParcelUuid) pour référencer certains objets dans une base de données personnalisée au lieu de fournir tout mon objet Parcelable.

Une autre solution consiste à convertir Parcelable en un tableau d'octets correctement reconnu par le système: Comment marshaller et démasquer un Parcelable en un tableau d'octets à l'aide de Parcel?

35
Vincent Hiribarren

MISE À JOUR: Veuillez voir la solution de Vincent Hiribarren


Ancienne réponse ... Le code de Haresh n'est pas la réponse complète ... J'ai utilisé un Bundle et j'ai essayé sans Bundle mais j'ai obtenu null de toute façon quand j'ai essayer d'obtenir les chaînes des extra !!

Le problème exact, dans votre code, est avec le PendingIntent!

C'est faux si vous essayez de passer des extras:

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, 0);

Parce que le 0 car les drapeaux sont ce qui vous causera des maux de tête

C'est la bonne façon de le faire - spécifiez un indicateur!

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, uniqueRequestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);

C'est probablement un problème si populaire parce que exemple de code de Google négligé d'inclure les Extra dans une alarme.

76
Someone Somewhere