PendingIntent, Intent ekstralarını göndermiyor


127

Benim MainActicity başlar RefreshServicebir ile Intentbir sahiptir booleandenilen ekstra isNextWeek.

My , kullanıcı tıkladığında başlatan RefreshServicebir yapar .NotificationMainActivity

bu şuna benzer:

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

Gördüğünüz gibi notificationIntentolmalıdır booleanekstra IS_NEXT_WEEKdeğeriyle isNextWeekkonur hangi PendingIntent.

Şimdi tıkladığımda Notificationbunu her zaman falsedeğerini alıyorumisNextWeek

Bu, aşağıdaki şekilde değeri almamın yoludur MainActivity:

    isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);

Log:

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

Ben doğrudan başlattığınızda MainActivitybir ile Intentböyle ìsNextValue` ile:

    Intent i = new Intent(this, MainActivity.class);
    i.putExtra(IS_NEXT_WEEK, isNextWeek);
    finish();
    startActivity(i);

her şey yolunda ve truene zaman isNextWeekolduğunu anlıyorum true.

Her zaman bir falsedeğer olduğu konusunda neyi yanlış yaparım ?

GÜNCELLEME

bu sorunu çözer: https://stackoverflow.com/a/18049676/2180161

Alıntı:

Şüphem şu ki, Niyette değişen tek şey ekstralar olduğundan, PendingIntent.getActivity(...)fabrika yöntemi basitçe eski amacı bir optimizasyon olarak yeniden kullanmaktır.

RefreshService'te şunu deneyin:

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

Görmek:

http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_CANCEL_CURRENT

GÜNCELLEME 2

Bkz aşağıda cevabını o kullanımına neden daha iyi olduğunu PendingIntent.FLAG_UPDATE_CURRENT.


2
PendingIntent.FLAG_CANCEL_CURRENT benim için çalıştı, teşekkürler
Pelanes

1
beni saatlerce çalışmadan kurtardı. doğru cevap!
TharakaNirmana

Sorunuz ve çözümünüz var: Harika. Bence bunu sorulara cevap olarak eklemelisin. + 10 saniye + 5 saniyeden daha iyidir;)
Muhammed Refaat


FLAG_UPDATE_CURRENT benim durumumda yeterli olmadı, çünkü aynı PendingIntent widget'ım tarafından yeniden kullanıldı. Nadiren gerçekleşen eylem için FLAG_ONE_SHOT kullanmayı bıraktım ve PendingIntent widget'ını olduğu gibi bıraktım.
Eir

Yanıtlar:


30

Hafızanın verimsiz kullanımı nedeniyle PendingIntent.FLAG_CANCEL_CURRENT kullanmak iyi bir çözüm değildir. Bunun yerine PendingIntent.FLAG_UPDATE_CURRENT kullanın .

Ayrıca Intent.FLAG_ACTIVITY_SINGLE_TOP kullanın (etkinlik, geçmiş yığınının en üstünde zaten çalışıyorsa başlatılmayacaktır).

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

Sonra:

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

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

Şimdi çalışmalı.


Hâlâ beklenen davranışınız yoksa, void onNewIntent(Intent intent)olay işleyicisini uygulamaya çalışın , bu şekilde etkinlik için çağrılan yeni amaca erişebilirsiniz (ki bu sadece getIntent () 'i çağırmakla aynı değildir, bu her zaman başlatılan ilk Niyeti döndürür faaliyetiniz.

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

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

21

Aktivitenizi Intentgeçersiz kılarak yenisini aldığınızda güncellemeniz gerektiğini düşünüyorum onNewIntent(Intent). Aşağıdakileri Faaliyetinize ekleyin:

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

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

Düzenle:

Bu, yalnızca niyet alındığında Faaliyetiniz zaten başlatılmışsa gereklidir. Aktiviteniz niyetle başlatıldıysa (ve sadece devam ettirilmediyse), sorun başka bir yerdedir ve önerim onu ​​çözmeyebilir.


bu ayrıca etkinlik kapatılırsa ve bundan sonra bildirimle açılırsa da görünür.
maysi

3

Aşağıdaki kod çalışmalıdır: -

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

MainActivity onCreate'te:

if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("isNextWeek")) {
        boolean isNextWeek = getIntent().getExtras().getBoolean("isNextWeek");
}

new Notification(icon, message, when);kullanımdan kaldırıldı
maysi

Neyse, CLEAR_TOP olmadan yapmak için?
Richard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.