PendingIntent इंटेंट एक्स्ट्रा को नहीं भेजता है


127

मेरी MainActicity शुरुआत एक अतिरिक्त के RefreshServiceसाथ होती है ।IntentbooleanisNextWeek

मेरे RefreshServiceएक बनाता है Notificationजो मेरे लिए शुरू होता है MainActivityउस पर जब उपयोगकर्ता क्लिक करता है।

यह इस तरह दिखता है:

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

जैसा कि आप देख सकते हैं कि जिस मूल्य में डाल दिया गया है उसके साथ अतिरिक्त notificationIntentहोना चाहिए ।booleanIS_NEXT_WEEKisNextWeekPendingIntent

जब मैं अभी क्लिक करता हूं तो मुझे Notificationहमेशा इसका falseमूल्य मिलता हैisNextWeek

इस तरह से मुझे इसमें मूल्य मिलता है MainActivity:

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

लॉग इन करें:

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

जब मैं सीधे directlysNextValue` के MainActivityसाथ Intentइस तरह से शुरुआत करता हूं:

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

सब कुछ ठीक काम करता है और मुझे trueजब मिलता isNextWeekहै true

मैं क्या गलत करता हूं कि हमेशा एक falseमूल्य होता है?

अपडेट करें

इससे समस्या हल होती है: https://stackoverflow.com/a/18049676/2180161

उद्धरण:

मेरा संदेह यह है कि चूंकि इंटेंट में बदलती एकमात्र चीज एक्स्ट्रा है, इसलिए PendingIntent.getActivity(...)फैक्ट्री पद्धति पुराने इरादे को एक अनुकूलन के रूप में फिर से उपयोग कर रही है।

ताज़ा करें सेवा में, कोशिश करें:

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

देख:

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

अद्यतन २

देखें नीचे इस सवाल का जवाब क्यों यह उपयोग करने के लिए बेहतर है PendingIntent.FLAG_UPDATE_CURRENT


2
PendingIntent.FLAG_CANCEL_CURRENT ने मेरे लिए काम किया, धन्यवाद
पेलेन्स

1
मुझे कई घंटों के काम से बचाया। सही उत्तर!
थारकनिरामन

आपके पास सवाल और समाधान है: डी महान। मुझे लगता है कि आपको इसे क्वेस के जवाब के रूप में जोड़ना चाहिए। + 10s + 5s से बेहतर है;)
मुहम्मद रिफैट

इस समाधान का संदर्भ: stackoverflow.com/questions/1198558/…
एम। नोमान

FLAG_UPDATE_CURRENT मेरे मामले में पर्याप्त नहीं था, क्योंकि मेरे विजेट द्वारा उसी PendingIntent का पुन: उपयोग किया गया था। मैंने एक्शन के लिए FLAG_ONE_SHOT का उपयोग किया, जो शायद ही कभी होता है, और विजेट PendingIntent बरकरार छोड़ दिया।
ईयर

जवाबों:


29

PendingIntent.FLAG_CANCEL_CURRENT का उपयोग स्मृति के अक्षम उपयोग के कारण अच्छा समाधान नहीं है। इसके बजाय PendingIntent.FLAG_UPDATE_CURRENT का उपयोग करें

Intent.FLAG_ACTIVITY_SINGLE_TOP का भी उपयोग करें (यदि यह पहले से ही इतिहास स्टैक के शीर्ष पर चल रहा है, तो गतिविधि लॉन्च नहीं की जाएगी)।

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

फिर:

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

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

यह अब काम करना चाहिए।


यदि आपके पास अभी भी व्यवहार की उम्मीद नहीं है, तो void onNewIntent(Intent intent)इवेंट हैंडलर को लागू करने का प्रयास करें , इस तरह आप उस नए इरादे तक पहुंच सकते हैं जिसे गतिविधि के लिए बुलाया गया था (जो कि सिर्फ कॉलिंग गेटइंटेंट के समान नहीं है), यह हमेशा लॉन्च किए गए पहले इरादे को वापस करेगा। आपकी गतिविधि।

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

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

21

मुझे लगता है कि आपको अपनी गतिविधि में Intentओवरराइड करके नया प्राप्त करने की आवश्यकता है onNewIntent(Intent)। अपनी गतिविधि में निम्नलिखित जोड़ें:

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

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

संपादित करें:

यह केवल तभी आवश्यक है जब आपकी गतिविधि पहले से ही शुरू हो गई हो जब आशय प्राप्त हो। यदि आपकी गतिविधि को इरादे से शुरू किया गया है (और बस फिर से शुरू नहीं किया गया है), तो समस्या कहीं और है और मेरा सुझाव इसे ठीक नहीं कर सकता है।


यह तब भी दिखाई देता है जब गतिविधि बंद हो जाती है और उसके बाद अधिसूचना के साथ खोला जाता है।
maysi

3

निम्नलिखित कोड काम करना चाहिए: -

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 में:

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

new Notification(icon, message, when);पदावनत है
maysi

वैसे भी CLEAR_TOP के बिना इसे करने के लिए?
रिचर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.