Saya MainActicity
mulai RefreshService
dengan Intent
yang memiliki panggilan boolean
ekstra isNextWeek
.
My RefreshService
membuat Notification
yang memulai saya MainActivity
ketika pengguna mengkliknya.
ini terlihat seperti ini:
Log.d("Refresh", "RefreshService got: isNextWeek: " + String.valueOf(isNextWeek));
Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.putExtra(MainActivity.IS_NEXT_WEEK, isNextWeek);
Log.d("Refresh", "RefreshService put in Intent: isNextWeek: " + String.valueOf(notificationIntent.getBooleanExtra(MainActivity.IS_NEXT_WEEK,false)));
pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
builder = new NotificationCompat.Builder(this).setContentTitle("Title").setContentText("ContentText").setSmallIcon(R.drawable.ic_notification).setContentIntent(pendingIntent);
notification = builder.build();
// Hide the notification after its selected
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(NOTIFICATION_REFRESH, notification);
Seperti yang Anda lihat, notificationIntent
harus memiliki boolean
ekstra IS_NEXT_WEEK
dengan nilai isNextWeek
yang dimasukkan ke dalam PendingIntent
.
Ketika saya klik sekarang ini Notification
saya selalu mendapatkan false
nilaiisNextWeek
Ini adalah cara saya mendapatkan nilai di MainActivity
:
isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);
Catatan:
08-04 00:19:32.500 13367-13367/de.MayerhoferSimon.Vertretungsplan D/Refresh: MainActivity sent: isNextWeek: true
08-04 00:19:32.510 13367-13573/de.MayerhoferSimon.Vertretungsplan D/Refresh: RefreshService got: isNextWeek: true
08-04 00:19:32.510 13367-13573/de.MayerhoferSimon.Vertretungsplan D/Refresh: RefreshService put in Intent: isNextWeek: true
08-04 00:19:41.990 13367-13367/de.MayerhoferSimon.Vertretungsplan D/Refresh: MainActivity.onCreate got: isNextWeek: false
Ketika saya langsung memulai MainActivity
dengan Intent
dengan ìsNextValue` seperti ini:
Intent i = new Intent(this, MainActivity.class);
i.putExtra(IS_NEXT_WEEK, isNextWeek);
finish();
startActivity(i);
semuanya bekerja dengan baik dan saya mendapatkan true
saat isNextWeek
ini true
.
Apa yang salah karena selalu ada false
nilai?
MEMPERBARUI
ini memecahkan masalah: https://stackoverflow.com/a/18049676/2180161
Mengutip:
Kecurigaan saya adalah, karena satu-satunya hal yang berubah dalam Intent adalah ekstra,
PendingIntent.getActivity(...)
metode pabrik hanya menggunakan kembali maksud lama sebagai pengoptimalan.Di RefreshService, coba:
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
Lihat:
http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_CANCEL_CURRENT
UPDATE 2
Lihat jawaban di bawah mengapa lebih baik digunakan PendingIntent.FLAG_UPDATE_CURRENT
.
Jawaban:
Menggunakan PendingIntent.FLAG_CANCEL_CURRENT bukan solusi yang baik karena penggunaan memori yang tidak efisien. Sebagai gantinya gunakan PendingIntent.FLAG_UPDATE_CURRENT .
Gunakan juga Intent.FLAG_ACTIVITY_SINGLE_TOP (aktivitas tidak akan diluncurkan jika sudah berjalan di bagian atas tumpukan riwayat).
Kemudian:
Ini harus bekerja sekarang.
Jika Anda masih tidak memiliki perilaku yang diharapkan, coba terapkan
void onNewIntent(Intent intent)
penangan kejadian, dengan cara itu Anda bisa mengakses maksud baru yang dipanggil untuk aktivitas (yang tidak sama dengan hanya memanggil getIntent (), ini akan selalu mengembalikan Intent pertama yang diluncurkan aktivitas Anda.sumber
Saya rasa Anda perlu memperbarui
Intent
saat Anda menerima yang baru dengan menimpaonNewIntent(Intent)
di Aktivitas Anda. Tambahkan berikut ini ke Aktivitas Anda:Edit:
Ini diperlukan hanya jika Aktivitas Anda sudah dimulai saat maksud diterima. Jika aktivitas Anda dimulai (dan tidak hanya dilanjutkan) dengan maksud, maka masalahnya ada di tempat lain dan saran saya mungkin tidak memperbaikinya.
sumber
Kode berikut seharusnya berfungsi: -
Dalam MainActivity onCreate:
sumber
new Notification(icon, message, when);
tidak digunakan lagi