आशय - यदि गतिविधि चल रही है, तो उसे सामने लाएं, अन्यथा एक नई शुरुआत करें (अधिसूचना से)


129

मेरे ऐप में नोटिफिकेशन हैं, जो स्पष्ट रूप से - बिना किसी झंडे के, हर बार एक नई गतिविधि शुरू करते हैं इसलिए मुझे एक-दूसरे के ऊपर चलने वाली कई समान गतिविधियाँ मिलती हैं, जो कि गलत है।

मैं यह करना चाहता हूं कि लंबित इरादों में निर्दिष्ट गतिविधि को सामने लाने के लिए, अगर यह पहले से चल रहा है, तो इसे शुरू करें।

अब तक, मेरे पास उस अधिसूचना के इरादे / लंबित इरादे हैं

private static PendingIntent prepareIntent(Context context) {
    Intent intent = new Intent(context, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

और अजीब तरह से, यह कभी-कभी काम करता है, कभी-कभी ऐसा नहीं होता है ... मुझे लगता है कि मैंने पहले से ही झंडे के हर एक संयोजन की कोशिश की है।

जवाबों:


131

आप इसका उपयोग कर सकते हैं:

<activity 
   android:name=".YourActivity"
   android:launchMode="singleTask"/>

जो समान काम करेगा, "singleInstance"लेकिन इसमें वह अजीब एनीमेशन नहीं होगा।


15
+1, आपको स्वीकृत उत्तर होना चाहिए। अंतर यहाँ हैं: developer.android.com/guide/topics/manifest/…
user1032613

1
स्पष्ट करने के लिए, सिंगलटैस्क का उपयोग करें यदि आपके पास ऐप में कई गतिविधियाँ हैं और यह अभिभावक है, तो सिंगलइनस्टांस यदि आपके पास केवल एक गतिविधि है।
ठंढा पड़ने वाला

4
यदि मेरे जैसे किसी ने इस साइट पर समाप्त होने से पहले समाधान के कई संयोजनों की कोशिश की है: तो सुनिश्चित करें कि आपके द्वारा किए गए अन्य परिवर्तनों से छुटकारा पाने के लिए और सुनिश्चित करें कि आप इस बदलाव को सही गतिविधि के लिए करते हैं। मुझे यह जानने के लिए बहुत समय लग गया कि इस समाधान ने काम किया होता अगर मैंने अन्य समाधानों की कोशिश नहीं की होती (जैसे onNewIntentझंडे को
उखाड़ना

मेरे पास मैसेंजर, एक्टिविटी जोड़ी का नक्शा है। अगर मुझे इससे कोई संदेश मिलता है तो मैं गतिविधि उदाहरण प्रदर्शित करना चाहता हूं। ऐसा करने का कोई रास्ता नहीं है। जैसे: HashMap.get (मैसेंजर) .bringActivityToFront (); मेरा मतलब है, गतिविधि अभी भी चल रही है। यदि मैं हाल ही में कार्य को खोलता हूं और इसे क्लिक करता हूं, तो यह चालू होगा (); खिचड़ी भाषा IResume () प्रोग्रामिक रूप से।

@JaveneCPPMcGowan जो एक अलग प्रश्न की तरह लगता है, मैं आपको सुझाव देता हूं कि जैसा कि यह स्वयं का प्रश्न है, मैं वास्तव में दुर्भाग्य से उत्तर नहीं जानता।
फ्रेंको

46

मुझे लगता है कि इसे करने का सबसे अच्छा तरीका और सरल तरीके से गतिविधि को सामान्य रूप से शुरू करना है, लेकिन singleInstanceसंपत्ति के साथ प्रकट में उस गतिविधि को निर्धारित करें । इसके साथ आप व्यावहारिक रूप से दोनों मुद्दों पर संपर्क कर रहे हैं जो आप अभी कर रहे हैं, हर समय गतिविधि को सामने लाकर, और ओएस को स्वचालित रूप से एक नया बनाने दें यदि कोई गतिविधि मौजूद नहीं है या वर्तमान में मौजूद गतिविधि को सामने लाएं (धन्यवाद singleInstanceसंपत्ति)।

यह एक गतिविधि को एक एकल उदाहरण के रूप में घोषित करने का तरीका है:

<activity 
   android:name=".YourActivity"
   android:launchMode="singleInstance"/>

सिंगलइनस्टांस के माध्यम से लॉन्च करते समय एक तड़का हुआ एनीमेशन से बचने के लिए, आप "सिंगलटैस्क" के बजाय उपयोग कर सकते हैं, दोनों बहुत समान हैं लेकिन अंतर Google के प्रलेखन के अनुसार यहां बताया गया है:

<activity 
   android:name=".YourActivity"
   android:launchMode="singleTask"/>

सिंगलइंस्टेंस "सिंगलटैस्क" के समान है, सिवाय इसके कि सिस्टम उदाहरण को पकड़े हुए कार्य में किसी अन्य गतिविधियों को लॉन्च नहीं करता है। गतिविधि हमेशा अपने कार्य का एकल और एकमात्र सदस्य होती है।

उम्मीद है की यह मदद करेगा।

सादर!


4
यह काम करने लगता है, लेकिन अब मैं हर एक नई गतिविधि, जिसे मैं सिंगल मेन्टक्टिविटी से लॉन्च करता हूं, नियमित फीका और पैमाने के बजाय इस अजीब arcing एनीमेशन खेलते हैं
ursus

किस बारे में मैंने हर बार एक नई गतिविधि शुरू की, लेकिन इसके अन्य सभी चल रहे उदाहरणों को स्पष्ट किया, क्या यह संभव होगा?
यूरसस

खैर, मुझे नहीं लगता कि जिस एनीमेशन का आप उल्लेख करते हैं, उसका "सिंगलइंस्टेंस" संपत्ति के साथ कुछ भी लेना-देना है, यह सब मौजूदा उदाहरण का पुन: उपयोग कर रहा है, हो सकता है कि जिस एनीमेशन के बारे में आप बात कर रहे हैं वह पूरी तरह से अलग मुद्दा हो ...
मार्टिन कैज़रेस

1
वैसे मैं अभी इसका परीक्षण कर रहा हूं और यह करता है। अगर मैं सभी इरादों के झंडे को हटा देता हूं और सिर्फ लॉन्च को सेट करता हूं। मेनिफेस्ट में "सिंगल इनस्टेंस" सेट करता हूं, तो अजीब एनीमेशन है, अगर मैं इसे हटाता हूं, तो इसकी पीठ सामान्य हो जाती है
urSus

हां, Android प्रलेखन के अनुसार, ऐसा लगता है कि "init" एनीमेशन अब हमेशा की तरह नहीं है क्योंकि गतिविधि को प्रारंभ नहीं किया जा रहा है, बस पुन: उपयोग किया जा रहा है ...
मार्टिन काज़रेस

26

मुझे लगता है कि आपको क्या चाहिए singleTop Activity, बजाय एक singleTaskया इसके singleInstance

<activity android:name=".MyActivity"
          android:launchMode="singleTop"
          ...the rest... >

क्या प्रलेखन का कहना है पूरी तरह से आपकी आवश्यकताओं के अनुरूप है:

[...] singleTopएक नए इरादे को संभालने के लिए " " गतिविधि का एक नया उदाहरण भी बनाया जा सकता है। हालांकि, यदि लक्ष्य कार्य में पहले से ही इसके स्टैक के शीर्ष पर गतिविधि का एक मौजूदा उदाहरण है, तो वह उदाहरण नए इरादे ( onNewIntent()कॉल में) प्राप्त करेगा ; एक नया उदाहरण नहीं बनाया गया है। अन्य परिस्थितियों में - उदाहरण के लिए, यदि " singleTop" गतिविधि का मौजूदा उदाहरण लक्ष्य कार्य में है, लेकिन स्टैक के शीर्ष पर नहीं है, या यदि यह स्टैक के शीर्ष पर है, लेकिन लक्ष्य कार्य में नहीं है - एक नया उदाहरण बनाया जाएगा और स्टैक पर धकेल दिया जाएगा।

उस के शीर्ष पर (कोई दंडित इरादा नहीं), मुझे आपकी जैसी ही आवश्यकता थी। मैंने launchModeयह पता लगाने के लिए सभी झंडों का परीक्षण किया कि वे वास्तव में व्यवहार में कैसे व्यवहार करते हैं और परिणामस्वरूप singleTopवास्तव में इसके लिए सबसे अच्छा है: कोई अजीब एनीमेशन नहीं, ऐप हाल ही की एप्लिकेशन सूची में एक बार प्रदर्शित हुआ (इसके विपरीत singleInstanceदो बार प्रदर्शित होने के कारण यह तथ्य नहीं है ' टी किसी भी अन्य Activityको अपने कार्य का हिस्सा होने की अनुमति देता है ), और उचित व्यवहार के बावजूद लक्ष्य Activityपहले से मौजूद है या नहीं।


2
शुक्रवार रात 10 बजे तक काम करें और यही वह है जो मैं चाहता हूं ... सैड डेवलपर जीवन।
felixwcf

मेरा बहुत समय बच गया! धन्यवाद!
हत्सगांधी

13

यह पुराना धागा है, लेकिन उन सभी के लिए जो अभी भी जवाब मांग रहे हैं, यहां मेरा समाधान है। यह पूरी तरह से कोड में है, बिना प्रकट सेटिंग्स के:

private static PendingIntent prepareIntent(Context context) {
  Intent intent = new Intent(context, MainActivity.class);
  intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);      
  return PendingIntent.getActivity(context, NON_ZERO_REQUEST_CODE, intent, 
    PendingIntent.FLAG_UPDATE_CURRENT);
}

यहां FLAG_ACTIVITY_SINGLE_TOP मौजूदा गतिविधि को खोलता है यदि यह कार्य स्टैक के शीर्ष पर है। यदि यह शीर्ष पर नहीं है, लेकिन स्टैक के अंदर, FLAG_ACTIVITY_CLEAR_TOP लक्ष्य गतिविधि के शीर्ष पर सभी गतिविधियों को हटा देगा और इसे दिखाएगा। यदि गतिविधि कार्य स्टैक में नहीं है, तो नया बनाया जाएगा। उल्लेख करने के लिए एक महत्वपूर्ण रूप से महत्वपूर्ण बिंदु - PendingIntent.getActivity () का दूसरा पैरामीटर, अर्थात requestCode का गैर-शून्य मान होना चाहिए (मैंने इसे अपने स्निपेट में NON_ZERO_REQUEST_CODE भी कहा है, अन्यथा उन इरादों के झंडे काम नहीं करेंगे। मुझे नहीं पता कि ऐसा क्यों है। फ्लैग FLAG_ACTIVITY_SINGLE_TOP एंड्रॉइड के साथ विनिमेय है: मेनिफ़ेस्ट में गतिविधि टैग में लॉन्चमोड = "सिंगलटॉप"।


इन झंडों के साथ घंटों से लड़ रहे थे और सोच रहे थे कि मेरे इरादे के झंडे को बदलने से कुछ भी क्यों नहीं बदला। गैर-शून्य अनुरोध कोड ... उल्लेख करने के लिए एक महत्वपूर्ण महत्वपूर्ण बिंदु !!! अब काम करता है! धन्यवाद!
मैक्स पावर

9

मुझे पता है कि यह पुराना है, लेकिन ऊपर से कुछ भी मेरे आवेदन के लिए उपयुक्त नहीं था।

मैनिफ़ेस्ट और अन्य कॉन्फ़िगरेशन बदलने के बिना, यहाँ आपके ऐप को वापस लाने के लिए कोड है - या बंद होने पर इसे खोलना

Intent notificationIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
notificationIntent.setPackage(null); // The golden row !!!
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

यह असली जवाब है!
अज़ीज़बेकियन

2
नहीं, यह काम नहीं कर रहा है - यह वर्तमान के शीर्ष पर एक नई गतिविधि जोड़ता है।
तोबलीग

3

मैंने यह कोशिश की, और यह तब भी काम किया जब आईडीई कोड के बारे में शिकायत कर रहा था

Intent notificationIntent = new Intent(THIS_CONTEXT, MainActivity.class);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    PendingIntent intent = PendingIntent.getActivity(THIS_CONTEXT, 0, notificationIntent, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(THIS_CONTEXT)
            .setSmallIcon(R.drawable.cast_ic_notification_0)
            .setContentTitle("Title")
            .setContentText("Content")
            .setContentIntent(intent)
            .setPriority(PRIORITY_HIGH) //private static final PRIORITY_HIGH = 5;
            .setAutoCancel(true)
            /*.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS)*/;
    NotificationManager mNotificationManager = (NotificationManager) THIS_CONTEXT.getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(0, mBuilder.build());

2
<गतिविधि Android: name = "। MainActivity" Android: launchMode = "singleTask">
नाडा

Intent.FLAG_ACTIVITY_REORDER_TO_FRONTके लिए एक वैध झंडा नहीं हैPendingINtent.getActivity
आरडीएस

@ क्या आप स्रोत को लिंक कर सकते हैं?
लुई सीएडी

@LouisCAD मुझे खेद है, मेरे पास अब स्रोत कोड तक पहुंच नहीं है
नाडा

@ मैं स्रोत कोड के लिए नहीं कह रहा हूं, लेकिन जहां आप पढ़ते हैं उसके लिंक के लिए Intent.FLAG_ACTIVITY_REORDER_TO_FRONTजब एक वैध ध्वज का उपयोग नहीं किया जाता है PendingIntent। या हो सकता है कि आपको इसका मतलब getActivityविधि में पारित करने के लिए मान्य नहीं है , लेकिन Intentफिर ध्वज के रूप में उपयोग करने के लिए वैध है जो तब एक के रूप में उपयोग किया जाता है PendingIntent?
लुई सीएडी

2

जब से आप कहते हैं कि आप अपनी गतिविधि शुरू करना चाहते हैं यदि यह पहले से ही शुरू नहीं हुई है, तो शायद आप इसे पुनः आरंभ करने का मन नहीं करेंगे। मैंने इरादे के लिए सुझावों और ध्वज संयोजनों की एक टन का परीक्षण किया, यह हमेशा आपके सामने आवश्यक गतिविधि लाएगा, हालांकि यह पहले से जुड़े किसी भी राज्य को नहीं रखेगा।

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);

API11 + ही।


0

एंड्रॉइड ट्रेनिंग साइट पर मिली सूचनाओं को जोड़ने के बाद मेरे पास एक समान मुद्दा था । यहां किसी भी अन्य उत्तर ने मेरे लिए काम नहीं किया, हालांकि इस उत्तर ने मेरे लिए काम किया। सारांश:

final Intent notificationIntent = new Intent(context, YourActivity.class);
notificationIntent.setAction(Intent.ACTION_MAIN);
notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.