2010-02-09 12 views
63

एंड्रॉइड में, मैंने एक गतिविधि उदाहरण एक्टिविटी परिभाषित की है।अग्रभूमि (ढेर के शीर्ष) में गतिविधि कैसे लाएं?

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

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

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

उत्तर

80

आप इस FLAG_ACTIVITY_REORDER_TO_FRONT (दस्तावेज़ वर्णन करता है आप के लिए वास्तव में क्या चाहते हैं) की कोशिश कर सकते हैं

+3

मुझे लगता है कि यह होना चाहिए [FLAG_ACTIVITY_SINGLE_TOP] (http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_SINGLE_TOP)। –

+19

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

+4

बहुत बढ़िया! दिए गए 'गतिविधि' के बाद किसी भी इतिहास को साफ़ करने के लिए '(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)' का उपयोग किया गया। – shkschneider

4

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

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

1

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

साथ लांच मुझे यकीन है कि आप इस पेज को देखा है लेकिन के लिए your convenience this link

48

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

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

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

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

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

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

+0

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

+2

या घटक नाम और सेटकंपोनेंट के बिना, लेकिन नए इरादे (यह, MyMainActivity.class) – Tima

+0

के साथ मैं अनुमान लगा रहा हूं कि 2010 में दस्तावेज़ीकरण और मानकों को पीछे छोड़ दिया गया था, यह सही जवाब नहीं है। – ashishduh

17

यहाँ कैसे आप यह कर सकते का एक कोड-उदाहरण है।

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

FLAG_ACTIVITY_REORDER_TO_FRONT: तो एक आशय Context.startActivity() के लिए पारित में सेट, इस ध्वज यदि वह पहले से चल रहा है शुरू की गतिविधि अपने कार्य के इतिहास ढेर के सामने करने के लिए लाया जा करने के लिए कारण होगा।

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

यदि आप "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!

1

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

नोट आपका homeactivity launchmode

0

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

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

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

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

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

संबंधित मुद्दे