Question

J'ai une petite application qui peut être utilisé pour définir des rappels pour des événements futurs. L'application utilise un AlarmManager pour régler l'heure quand doit être rappelé à l'utilisateur. Lorsque l'alarme se déclenche, un BroadcastReceiver enregistre cela et à son tour, commence un service pour avertir l'utilisateur via un toast et une notification dans la barre d'état.

Pour afficher les informations correctes dans la notification et du pain grillé, des informations supplémentaires sont transmis en même temps l'intention. La première fois qu'un rappel est enregistré, les informations reçues par le BroadcastReceiver et transmis au service est correct. Mais pour chaque rappel ci-dessous (à savoir chaque nouvelle intention reçue par le BroadcastReceiver) ces informations reste la même, même lorsque les informations envoyées est différent.

À titre d'exemple, si la chaîne « foo » est mis comme un supplément à la première intention, « foo » est extrait correctement par le BroadcastReceiver. Si « bar » est mis en supplément dans la deuxième intention, « foo » est encore extraite par le BroadcastReceiver.

Ceci est le code qui enregistre l'alarme et transmet l'intention (principale classe ui):

Intent intent = new Intent(ACTION_SET_ALARM);
intent.putExtra("desc", desc);
intent.putExtra("time", time);
intent.putExtra("dbId", dbId);
intent.putExtra("millis", millis);
PendingIntent pIntent = PendingIntent.getBroadcast(quickAlert.this, 0, intent, 0);

// Schedule the alarm!
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, millis, pIntent);

Le OnReceive () - méthode dans la classe BroadcastReceiver:

@Override
public void onReceive(Context context, Intent intent) {

    Intent i = new Intent(context, AlertService.class);

    String desc = intent.getStringExtra("desc").equals("") ? "": ": " + intent.getStringExtra("desc");
    String time = intent.getStringExtra("time");
    long dbId = intent.getLongExtra("dbId", -1);
    long millis = intent.getLongExtra("millis", -1);

    i.putExtra("desc", desc);
    i.putExtra("time", time);
    i.putExtra("dbId", dbId);
    i.putExtra("millis", millis);
    Log.d(TAG, "AlertReceiver: " + desc + ", " + time + ", " + dbId + ", " + millis);

    Toast.makeText(context, "Reminder: " + desc, Toast.LENGTH_LONG).show();
    context.startService(i);
}

Le but du filtre dans le manifeste:

<receiver android:name=".AlertReceiver">
        <intent-filter>
            <action android:name="com.aspartame.quickAlert.ACTION_SET_ALARM" />
        </intent-filter>
    </receiver>

Je suis coincé avec ce depuis un certain temps, donc l'aide est très apprécié!

Était-ce utile?

La solution

Essayez d'ajouter FLAG_UPDATE_CURRENT à votre PendingIntent lors de sa création via getBroadcast().

Autres conseils

Les réponses ci-dessus sont corrects, mais ils ne disposent pas d'une explication. Il est intéressant de noter cette partie du PendingIntent documentation :

  

A PendingIntent lui-même est tout simplement une référence à un jeton maintenu par le système décrivant les données originales utilisées pour le récupérer. ... Si la demande de création réenregistré ultérieurement récupère le même genre de PendingIntent (même opération, même action intention, les données, les catégories et les composants, et les mêmes drapeaux), il recevra un PendingIntent représentant le même ordre d'idées

Notez que les données "extra" est spécifiquement pas inclus dans le concept de PendingIntent identité!

meilleur lien que j'ai trouvé sur ce sujet: http://alvinalexander.com/source-code/android/android-how-attach-extra-intent-pendingintent-notification-solution-example

est l'indice:

int uniqueInt = (int) (System.currentTimeMillis() & 0xfffffff);
PendingIntent.getService(context, uniqueInt, intent, 0)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top