एक गतिविधि को अग्रभूमि (ढेर के ऊपर) कैसे लाया जाए?


91

एंड्रॉइड में, मैंने एक गतिविधि को परिभाषित किया उदाहरण ExampleActivity।

जब मेरा एप्लिकेशन लॉन्च किया गया था, तो इस ए-एक्टिविटी का एक उदाहरण बनाया गया था, कहते हैं A। जब उपयोगकर्ता ने एक बटन क्लिक किया A, तो B- गतिविधि का एक और उदाहरण, B बनाया गया था। अब टास्क स्टैक बीए है, जिसमें बी सबसे ऊपर है। फिर, उपयोगकर्ता ने B पर एक बटन क्लिक किया, C- गतिविधि का एक और उदाहरण, और C बनाया गया। अब टास्क स्टैक CBA है, जिसमें C सबसे ऊपर है।

अब, जब उपयोगकर्ता C पर एक बटन क्लिक करता है, तो मैं चाहता हूं कि एप्लिकेशन A को अग्रभूमि में लाए, यानी A को टास्क स्टैक, ACB के शीर्ष पर रखें।

मैं ऐसा करने के लिए कोड कैसे लिख सकता हूं?

जवाबों:


109

आप इसे आज़मा सकते हैं FLAG_ACTIVITY_REORDER_TO_FRONT(दस्तावेज़ ठीक वही बताता है जो आप चाहते हैं)


3
मुझे लगता है कि यह FLAG_ACTIVITY_SINGLE_TOP होना चाहिए ।

26
@ user942821 FLAG_ACTIVITY_SINGLE_TOPयहां मदद नहीं करेगा। जब एक्टीसी स्टैक के शीर्ष पर होता है और यह एक्टिवा startActivity()को लॉन्च करने के लिए कहता है, भले ही आप FLAG_ACTIVITY_SINGLE_TOPइसे सेट करें, फिर भी एक्टिवा का एक नया उदाहरण बन जाएगा। FLAG_ACTIVITY_SINGLE_TOPकेवल एक नए उदाहरण के निर्माण को रोकता है यदि आप एक गतिविधि शुरू करने की कोशिश कर रहे हैं जो पहले से ही स्टैक के शीर्ष पर है । इस मामले में, एक्टिवा स्टैक के शीर्ष पर नहीं है, इसलिए एंड्रॉइड एक नया उदाहरण बनाता है।
डेविड वासर

6
बहुत बढ़िया! (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)किसी दिए गए के बाद किसी भी इतिहास को साफ़ करने के लिए उपयोग किया जाता है Activity
श्क्नाइडर

10
यदि आप FLAG_ACTIVITY_CLEAR_TOP भी निर्दिष्ट करते हैं तो FLAG_ACTIVITY_REORDER_TO_FRONT को अनदेखा किया जाता है। प्रलेखन की जाँच करें।
क्रिश सुब्रमण्यन

3
आशय ।addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT - Intent.FLAG_ACTIVITY_SINGLE_TOP); यदि आप अपनी गतिविधि को उपयोगकर्ता सत्र के साथ सामने लाना चाहते हैं तो यह ठीक काम करेगा, यदि यह पहले से ही बैकस्ट के शीर्ष पर है, लेकिन सामने नहीं है।
हसन जमील

64

मुझे यह करने का सबसे अच्छा तरीका एंड्रॉइड होम स्क्रीन का उपयोग करने के लिए एक ही इरादे का उपयोग करना था - ऐप लॉन्चर।

उदाहरण के लिए:

Intent i = new Intent(this, MyMainActivity.class);
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);

इस तरह, मेरे पैकेज में जो भी गतिविधि सबसे हाल ही में उपयोगकर्ता द्वारा उपयोग की गई थी, उसे फिर से सामने लाया गया है। उपयोगकर्ता को मेरे ऐप पर वापस लाने के लिए मैंने अपनी सेवा के PendingIntent का उपयोग करने में इसे उपयोगी पाया।


2
कोड के उस टुकड़े के लिए बहुत बहुत धन्यवाद। मैंने उस काम को ठीक से करने के लिए घंटों बर्बाद किया।
पाकीटो वी

3
या बिना ComponentName और setComponent, लेकिन नए इरादे (यह, MyMainActivity.class) के साथ
Tima

3
अजीब है क्योंकि यह एकमात्र ऐसी चीज थी जो मेरे लिए काम करती थी; झंडे स्थापित करने से काम नहीं चला और हमेशा गतिविधि को फिर से बनाया गया।
स्टीवन हुआंग

5
जब मैंने इस जवाब और टिप्पणियों को पढ़ा, तो यह स्पष्ट है कि हमें गलतफहमी है। मूल सवाल यह Activityहै कि टास्क स्टैक के भीतर कैसे पुनर्व्यवस्थित किया जाए । ओपी स्पष्ट रूप से कहता है कि वह ActivityAस्टैक के नीचे से स्टैक के ऊपर की ओर बढ़ना चाहता है (यानी: वह स्टैक स्टैक के सामने की तरफ एक्टिवा को फिर से चालू करना चाहता है )। यह उत्तर ऐसा नहीं करेगा। यह उत्तर इस प्रश्न का उत्तर है "मैं अपने आवेदन (टास्क स्टैक) को पृष्ठभूमि से अग्रभूमि में कैसे ला सकता हूं?" यह ओपी के मूल प्रश्न से बिल्कुल अलग प्रश्न है।
डेविड वासेर

3
इसके अलावा upvote बटन कहता है "यह उत्तर सहायक है" नहीं "यह उत्तर ऑप के लिए सहायक है" - इस स्थिति के लिए उसके पास पहले से ही "स्वीकार चिह्न" है। स्पष्ट रूप से मुझे नहीं पता कि ऑप के लिए क्या मददगार है, और IMHO ने मेरे अनुमान के आधार पर उत्तर को गलत बताते हुए ऑप के लिए जो मददगार है वह गलत है।
बोरिस ट्रेखोव

28

यहाँ एक कोड-उदाहरण है कि आप इसे कैसे कर सकते हैं:

Intent intent = getIntent(getApplicationContext(), A.class)

यह सुनिश्चित करेगा कि आपके पास केवल स्टैक पर एक गतिविधि का एक उदाहरण है।

private static Intent getIntent(Context context, Class<?> cls) {
    Intent intent = new Intent(context, cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    return intent;
}

11

FLAG_ACTIVITY_REORDER_TO_FRONT : यदि Context.startActivity () को दिए गए इरादे में सेट किया गया है, तो यह ध्वज लॉन्च की गई गतिविधि को उसके कार्य के इतिहास स्टैक के सामने लाया जाएगा यदि यह पहले से ही चल रहा है।

Intent i = new Intent(context, AActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);

4

मुझे लगता है कि Intentझंडे का एक संयोजन चाल करना चाहिए। विशेष रूप से, Intent.FLAG_ACTIVITY_CLEAR_TOPऔर Intent.FLAG_ACTIVITY_NEW_TASK

कॉल करने से पहले अपने इरादे के लिए इन झंडों को जोड़ें startActvity


2

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

नोट आपका होमटक्टिविटी लॉन्चमोड सिंगल_टैस्क होना चाहिए


1

सामान्य तौर पर मुझे लगता है कि गतिविधि प्रबंधन की यह विधि अनुशंसित नहीं है। स्टैक में दो चरणों में एक गतिविधि को पुनः सक्रिय करने में समस्या यह है कि इस गतिविधि को मार दिया गया है। आपकी गतिविधियों की स्थिति को याद रखने और उन्हें लॉन्च करने की मेरी सलाहstartActivity ()

मुझे यकीन है कि आप इस पृष्ठ को देख चुके हैं, लेकिन आपकी सुविधा के लिए यह लिंक


0

यदि आप एक अधिसूचना पर क्लिक करते समय स्टैक के शीर्ष पर एक गतिविधि लाना चाहते हैं तो आपको FLAG_ACTIVITY_REORDER_TO_FRONT कार्य करने के लिए निम्न कार्य करने की आवश्यकता हो सकती है:

मेरे लिए इसका समाधान एक ब्रॉडकास्टर रिसीवर बनाना था जो सूचनाओं को प्रसारित करने वाले प्रसारण कार्यों को सुनता हो। तो मूल रूप से:

  1. अधिसूचना लॉन्च करने के लिए गतिविधि के अतिरिक्त नाम के साथ एक प्रसारण कार्रवाई को ट्रिगर करती है।

  2. प्रसारण रिसीवर इसे पकड़ता है जब अधिसूचना पर क्लिक किया जाता है, तो उस गतिविधि को FLAG_ACTIVITY_REORDER_TO_FRONT ध्वज का उपयोग करके लॉन्च करने का इरादा बनाता है

  3. गतिविधि को गतिविधि स्टैक के शीर्ष पर लाया जाता है, कोई डुप्लिकेट नहीं।


-2

यदि आप "PendingIntent" वर्ग के साथ पुश सूचनाएं प्राप्त करने के लिए "Google क्लाउड संदेश" का उपयोग कर रहे हैं, तो निम्न कोड केवल सूचना पट्टी में सूचना प्रदर्शित करता है।

अधिसूचना पर क्लिक करने से कोई गतिविधि नहीं बनेगी, अंतिम सक्रिय गतिविधि को बिना किसी समस्या के चालू स्थिति में बहाल किया जाता है।

Intent notificationIntent = new Intent(this, ActBase.class); **notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);** PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("Localtaxi") .setVibrate(vibrate) .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setAutoCancel(true) .setOnlyAlertOnce(true) .setContentText(msg);

mBuilder.setContentIntent(contentIntent);

NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

Ciao!

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