android - अधिसूचना से इरादे में अतिरिक्त नहीं है
android-intent android-notifications (4)
यदि आवश्यक नहीं है तो एक ही कार्य के रूप में अपनी गतिविधि को मैनिफेस्ट में सेट करने से बचें । इस लाइन को छोड़ दें या इसे सिंगलटॉप में बदलें यदि आप कर सकते हैं:
android:launchMode="singleTask”
यदि आपके पास एक ही कार्य होना चाहिए तो लंबित इरादे सेट झंडे में: इरादा। FLAG_ACTIVITY_NEW_TASK | आशय। FLAG_ACTIVITY_CLEAR_TASK और लंबित इन्टेंट। FLAG_CANCEL_CURRENT ।
resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TASK); pIntent = PendingIntent.getActivity(context, 0, resultIntent, PendingIntent.FLAG_CANCEL_CURRENT );
यदि आपके पास एक ही कार्य है - सेटइन्टेंट (इरादा) द्वारा अपनी गतिविधि में अपने अतिरिक्त में न्यूइन्टेंट () के अंदर अपने एक्स्ट्रा को रीसेट करें ;
protected void onNewIntent(Intent intent) { setIntent(intent); ... }
यह एक आम समस्या प्रतीत होता है और मैं उन सभी संबंधित प्रश्नों से गुजरता हूं जो मुझे पहले से मिल सकता है: गतिविधि नए इरादे को नहीं उठा रही है , एंड्रॉइड अधिसूचना के इरादे में अतिरिक्त डेटा (पूर्णांक) क्यों नहीं भेजा जाता है? , अधिसूचना पुराने इरादे अतिरिक्त पास करती है , अधिसूचना में किसी इरादे के लिए अतिरिक्त नहीं रख सकती है , एंड्रॉइड लंबित मंशा अधिसूचना समस्या ; लेकिन अभी भी इसे समझ नहीं सकते हैं।
समस्या वही है। मैंने लंबित इंंटेंट के साथ कुछ अतिरिक्त जानकारी लेकर एक अधिसूचना सेट की है और मुझे दूसरी तरफ नहीं मिल रहा है।
अधिसूचना उत्पन्न करने के लिए कोड यहां दिया गया है:
Notification notification = new Notification(R.drawable.icon, getResources().getString(R.string.notification_ticker), System.currentTimeMillis());
notification.flags = Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONLY_ALERT_ONCE;
Intent start_test = new Intent(this, MyActivity.class);
start_test.putExtra("start_test", true);
start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pi = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), start_test, PendingIntent.FLAG_CANCEL_CURRENT);
notification.setLatestEventInfo(this, getResources().getString(R.string.notification_title), getResources().getString(R.string.notification_content, expired), pi);
nm.notify(NOTIFICATION_ID, notification);
और दूसरी तरफ:
boolean start_test=getIntent().getBooleanExtra("start_test", false);
बंडल वास्तव में वहां नहीं है (getExtras () शून्य वापस देता है)।
मैंने PendingIntent.getActivity
( FLAG_UPDATE_CURRENT
, FLAG_CANCEL_CURRENT
, FLAG_ONE_SHOT
) के लिए अलग-अलग झंडे की कोशिश की, उनमें से कोई भी मदद नहीं की।
जैसा कि कोड में दिखाया गया है, मैं यह सुनिश्चित करने के लिए getCurrentMillis का उपयोग करता हूं कि requestID बदलता है ....
यह भी पाया गया कि माईएक्टिविटी में, onNewIntent
और onNewIntent
को बुलाया नहीं जा रहा है। केवल onResume
है। भले ही FLAG_ACTIVITY_NEW_TASK
सेट है ...?
क्या मुझे कुछ बहुत याद आ रहा है?
अधिसूचना के लिए FLAG_ACTIVITY_NEW_TASK
सेट करना निम्नलिखित का कारण बन जाएगा:
यदि गतिविधि पहले से ही किसी कार्य में नहीं चल रही है, तो एक नया कार्य शुरू किया जाएगा और इरादे को गतिविधि
onCreate()
गतिविधि में वितरित किया जाएगाहालांकि, यदि गतिविधि पहले से ही किसी कार्य में चल रही है, तो वह कार्य अग्रभूमि में लाया जाएगा। बस इतना ही। इरादा नहीं दिया जाएगा और
onNewIntent()
पर नहीं कहा जाएगा।
यदि आप वास्तव में वितरित करने का इरादा चाहते हैं तो आपको यह निर्दिष्ट करने की आवश्यकता है:
start_test.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_SINGLE_TOP);
यह कोई फर्क नहीं पड़ता कि गतिविधि का singleTop
या नहीं, आपको अभी भी इरादे में Intent.FLAG_ACTIVITY_SINGLE_TOP
निर्दिष्ट करना होगा।
नोट: यदि गतिविधि पहले से ही किसी कार्य में चल रही है और गतिविधि उस कार्य में गतिविधि के ढेर के शीर्ष पर नहीं है , तो कार्य को अग्रभूमि में लाया जाएगा। बस इतना ही। इरादा नहीं दिया जाएगा। ऐसा करने का एकमात्र तरीका अन्य 2 झंडे में Intent.FLAG_ACTIVITY_CLEAR_TOP
जोड़ना होगा, लेकिन ऐसा नहीं हो सकता है कि आप क्या करना चाहते हैं (आपके विशिष्ट परिदृश्य पर निर्भर करता है)।
http://code.google.com/p/android/issues/detail?id=17137 पर Google कोड पर मेरा (अभी भी) खुला मुद्दा देखें
मैंने अभी लंबित इरादों को जोड़ा है। PendingIntent.FLAG_UPDATE_CURRENT
ध्वज मेरे लंबित इरादे में, और यह मेरे लिए काम करना शुरू कर दिया (इरादे के लिए सभी झंडे छोड़ दिया)।
उदाहरण कोड:
PendingIntent pendIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
मैंने इस तरह कुछ इस्तेमाल किया है
Intent myIntent = new Intent(context, DoSomething.class);
PendingIntent pendingIntent = PendingIntent.getActivity(
context,
0,
myIntent,
Intent.FLAG_ACTIVITY_NEW_TASK);
here पूरा उदाहरण देखें