PendingIntent tidak mengirim ekstra Intent

127

Saya MainActicity mulai RefreshServicedengan Intentyang memiliki panggilan booleanekstra isNextWeek.

My RefreshServicemembuat Notificationyang memulai saya MainActivityketika 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, notificationIntentharus memiliki booleanekstra IS_NEXT_WEEKdengan nilai isNextWeekyang dimasukkan ke dalam PendingIntent.

Ketika saya klik sekarang ini Notificationsaya selalu mendapatkan falsenilaiisNextWeek

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 MainActivitydengan Intentdengan ì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 truesaat isNextWeekini true.

Apa yang salah karena selalu ada falsenilai?

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.

maysi
sumber
2
PendingIntent.FLAG_CANCEL_CURRENT bekerja untuk saya, terima kasih
Pelanes
1
menyelamatkan saya banyak jam kerja. jawaban yang benar!
TharakaNirmana
Anda punya pertanyaan dan solusinya: D hebat. Saya pikir Anda harus menambahkannya sebagai jawaban atas pertanyaan. + 10s lebih baik dari + 5s;)
Muhammed Refaat
Mengacu pada solusi ini: stackoverflow.com/questions/1198558/…
M.Noman
FLAG_UPDATE_CURRENT tidak cukup dalam kasus saya, karena PendingIntent yang sama digunakan kembali oleh widget saya. Saya akhirnya menggunakan FLAG_ONE_SHOT untuk tindakan yang jarang terjadi, dan membiarkan widget PendingIntent tetap utuh.
Eir

Jawaban:

30

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

Intent resultIntent = new Intent(this, FragmentPagerSupportActivity.class).
                    addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  
resultIntent.putExtra(FragmentPagerSupportActivity.PAGE_NUMBER_KEY, pageNumber);

PendingIntent resultPendingIntent =
                PendingIntent.getActivity(
                        this,
                        0,
                        resultIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT
                );

Kemudian:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);

            int startPageNumber;
            if ( savedInstanceState != null)
            {
                startPageNumber = savedInstanceState.getInt(PAGE_NUMBER_KEY);
//so on

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.

@Override
protected void onNewIntent(Intent intent) {
    int startPageNumber;

    if (intent != null) {
        startPageNumber = intent.getExtras().getInt(PAGE_NUMBER_KEY);
    } else {
        startPageNumber = 0;
    }
}
Yuliia Ashomok
sumber
21

Saya rasa Anda perlu memperbarui Intentsaat Anda menerima yang baru dengan menimpa onNewIntent(Intent)di Aktivitas Anda. Tambahkan berikut ini ke Aktivitas Anda:

@Override
public void onNewIntent(Intent newIntent) {
    this.setIntent(newIntent);

    // Now getIntent() returns the updated Intent
    isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);        
}

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.

Vikram
sumber
ini muncul juga jika aktivitas ditutup dan setelah itu dibuka dengan notifikasi.
maysi
3

Kode berikut seharusnya berfungsi: -

int icon = R.drawable.icon;
String message = "hello";
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(icon, message, when);

Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.putExtra("isNexWeek", true);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, title, message, pIntent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(0, notification);

Dalam MainActivity onCreate:

if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("isNextWeek")) {
        boolean isNextWeek = getIntent().getExtras().getBoolean("isNextWeek");
}
Haris ur Rehman
sumber
new Notification(icon, message, when);tidak digunakan lagi
maysi
Tetap melakukannya tanpa CLEAR_TOP?
Richard