Frage

Ich habe eine kleine Anwendung, die auf Erinnerungen für zukünftige Veranstaltungen genutzt werden kann. Die App nutzt einen Alarmmanager die Zeit einzustellen, wenn der Benutzer daran erinnert werden soll. Wenn der Alarm losgeht, ein BroadcastReceiver dieser Register und wiederum startet einen Dienst den Benutzer über einen Toast und eine Benachrichtigung in der Statusleiste zu informieren.

Um die richtigen Informationen in der Benachrichtigung und Toast angezeigt, einige zusätzliche Informationen mit der Absicht, entlang geführt. Das erste Mal, wenn eine Erinnerung registriert ist, die Informationen von den BroadcastReceiver und an den Dienst empfangen wird, korrekt ist. Aber für jede folgende Erinnerung (das heißt jede neue Absicht erhalten durch die BroadcastReceiver) diese Informationen gleich bleibt, auch wenn die Informationen abgeschickt ist anders.

Als Beispiel, wenn die Zeichenfolge „foo“ als Extra gesetzt wird mit der ersten Absicht, „foo“ richtig durch die BroadcastReceiver extrahiert. Wenn „bar“ als Statist in der zweiten Absicht gelegt wird, „foo“ ist nach wie vor durch die BroadcastReceiver extrahiert.

Dies ist der Code, dass die Alarmregister und übergibt die Absicht (Haupt ui-Klasse):

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);

Die OnReceive () - Methode in der Klasse 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);
}

Die Intent-Filter im Manifest:

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

Ich habe nun schon seit einiger Zeit mit diesem fest gewesen, so ist Hilfe sehr geschätzt!

War es hilfreich?

Lösung

Versuchen Sie, FLAG_UPDATE_CURRENT zu Ihrem PendingIntent, wenn Sie es schaffen über getBroadcast().

Andere Tipps

Die oben genannten Antworten sind richtig, aber es fehlt ihnen eine Erklärung. Es ist erwähnenswert, diesen Teil des PendingIntent Dokumentation :

  

Ein PendingIntent selbst ist einfach eine Referenz auf ein Zeichen vom System verwaltet die Originaldaten zu beschreiben verwendet, um es abzurufen. ... Wenn die Erstellung Anwendung später wieder ruft die gleiche Art von PendingIntent (gleiche Operation, gleiche Intent Aktion, Daten, Kategorien und Komponenten, und gleicher Flags), wird es eine PendingIntent erhält die gleichen Token

darstellt

Beachten Sie, dass "extra" Daten sind speziell nicht , die in dem Konzept der PendingIntent-Identität!

Best Link Ich habe zu diesem Thema gefunden: http://alvinalexander.com/source-code/android/android-how-attach-extra-intent-pendingintent-notification-solution-example

Dies ist der Hinweis:

int uniqueInt = (int) (System.currentTimeMillis() & 0xfffffff);
PendingIntent.getService(context, uniqueInt, intent, 0)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top