2010-01-13 13 views
13

का उपयोग कर अपने Android एप्लिकेशन में Android एप्लिकेशन राज्य बनाए रखना, मैं एक मुख्य गतिविधि है कि मेरे आवेदन है, जो इस तरह मेरे मैनिफ़ेस्ट फ़ाइल में कॉन्फ़िगर किया गया है करने के लिए एक प्रवेश बिंदु के रूप में कार्य करता है है एक विशेष उपयोग केस, मान लें कि उपयोगकर्ता एप्लिकेशन लॉन्चर के अंदर आइकन पर क्लिक करके ऐप को होम स्क्रीन से शुरू करता है। ऐप शुरू करने के बाद, उपयोगकर्ता मुख्य गतिविधि से गतिविधि ए तक और फिर अंततः गतिविधि बी पर जाता है। इस बिंदु पर, उपयोगकर्ता अपने फेसबुक की जांच करने का निर्णय लेता है, इसलिए वे मेरे ऐप को पृष्ठभूमि में रखने के लिए होम बटन पर क्लिक करते हैं, और लॉन्च करते हैं फेसबुक ऐपalwaysRetainTaskState और lauchMode

अपने फेसबुक की जांच करने के बाद, उपयोगकर्ता मेरे ऐप पर वापस जाना चाहता है, इसलिए वे होम कुंजी दबाते हैं, और एप्लिकेशन लॉन्चर से एप्लिकेशन लॉन्च करते हैं (जैसा कि उन्होंने पहली बार लॉन्च किया था)।

जब कोई उपयोगकर्ता मेरे ऐप पर वापस आ जाता है, तो मैं चाहता हूं कि ऐप पृष्ठभूमि में डाले जाने पर पिछली गतिविधि पर वापस आ जाए, जो इस मामले में गतिविधि बी है। मैनिफेस्ट फ़ाइल में, मेरे पास है सुनिश्चित करें कि ओएस मेरे ऐप की गतिविधियों को मार नहीं देता है, हमेशा यह सुनिश्चित करने के लिए RetainTaskState = true सेट करें।

अब मेरे प्रश्न पर: मैं ऊपर वर्णित व्यवहार कैसे प्राप्त करूं? जब भी मैं अपने ऐप के आइकन पर क्लिक करता हूं, यह हमेशा मुख्य गतिविधि से शुरू होता है, इससे कोई फर्क नहीं पड़ता। मुझे लगता है कि यह श्रेणी के कारण है। लांचर विशेषता। मैंने एंड्रॉइड की कोशिश की है: launchMode = एकल टास्क, लेकिन इससे कोई फर्क नहीं पड़ता है; यह हमेशा मुख्य पर शुरू होता है।

अगर कोई इरादा फ़िल्टर, मोड लॉन्च और कार्यों को स्पष्ट कर सकता है, तो यह बहुत अच्छा होगा!

+0

सत्यापित मुझे लगता है कि इस सवाल का बहुत पुराना है, और http://developer.android.com को accrding अद्यतन किया जाना चाहिए /guide/components/tasks-and-back-stack.html –

उत्तर

3

मैंने स्क्रीनलेस DispatcherActivity जोड़कर इसे डिफ़ॉल्ट बना दिया (उसी इरादे फ़िल्टर का उपयोग करके)। onCreate विधि में आप कुछ उचित डिफ़ॉल्ट (उदाहरण के लिए आपकी मुख्य गतिविधि) के आधार पर इरादा बनाते हैं और कॉल करते हैं या कुछ सहेजे गए टोकन के आधार पर यह पहचानते हैं कि कौन सी गतिविधि शुरू की जानी चाहिए। उस टोकन को onStop में किसी भी गतिविधि की विधि को पुन: प्रारंभ करने के लिए कॉल/रीफ्रेश किया गया है जिसे आप पुनरारंभ करना चाहते हैं। आप इस टोकन को प्राथमिकता में सहेज सकते हैं।

तर्कसंगत यह है कि पिछली गतिविधि जो दृश्यमान थी, बाधित होने पर रोक विधि पर निष्पादित होगी।

यहां सावधानी के शब्द: मैंने इस पैटर्न को लागू किया और यह काफी अच्छी तरह से काम किया। हालांकि ऐसा लगता है कि इतिहास के साथ बहुत अच्छा नहीं खेलता है और आखिरकार मैंने इस कोड को छोड़ दिया और यंक किया। अब तक किसी ने शिकायत नहीं की है।

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

आप कैसे लॉन्च कर रहे हैं गतिविधि बी:

+0

यह एक सहज समाधान है। यदि आप मेरे उदाहरण पर वापस जाते हैं, अगर मैंने गतिविधि बी के ऑनटॉप में टोकन संग्रहीत किया है, और डिस्पैचर एक्टिविटी में इस टोकन के लिए चेक किया है और टोकन सेट होने पर गतिविधि बी शुरू किया है, तो यह आपको अंतिम गतिविधि पर वापस ले जाएगा, लेकिन नहीं आपको बी से पहले उपयोगकर्ता द्वारा देखी जाने वाली गतिविधियों के लिए टोकन स्टोर करना होगा (मेरे उदाहरण में गतिविधि ए)? – jlim

+0

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

+0

पर क्लिक करते हैं तो डिस्पैचर को फिर से कॉल नहीं किया जाएगा, मुझे लगता है कि ऐसा करने का एक बेहतर तरीका है। एप्लिकेशन स्विचर मेनू (लंबी प्रेस होम कुंजी) इसे ठीक से संभालता है .. मुझे नहीं लगता कि हम एप्लिकेशन ट्रे में उस व्यवहार को डुप्लिकेट क्यों नहीं कर सकते .. – jlim

8

FYI करें singleTask आप क्या चाहते हैं के बाद से यह एक नया कार्य शुरू होता है नहीं है,? कोई गैर-मानक लॉन्च मोड या इरादा झंडे?

+0

सफल होते हैं तो कृपया अपने निष्कर्ष साझा करें, मेरे पास बी के लिए कोई इरादा फ़िल्टर सेट नहीं है, और मैं बस प्रारंभ गतिविधि (नया इरादा (यह, बीक्लास)) कर रहा हूं; – jlim

+2

हाँ मुझे नहीं पता कि इस तरह के प्रश्नों के बहुत सारे उत्तर क्यों दिए गए हैं (ऐप फिर से शुरू करने आदि) सिंगल टास्क का उपयोग करने का सुझाव देते हैं - यह आमतौर पर आप जो चाहते हैं वह नहीं है ... –

+0

आप बिल्कुल सही हैं! मेरे मामले में, सिंगलटास्क इस समस्या का कारण था। – Apfelsaft

7

इसी तरह की समस्याओं के साथ यहां आने वाले किसी के लिए, मुझे कुछ अजीब लगता है जो आप देख रहे हो ... शायद।

कहें कि मेरे पास गतिविधियां ए -> बी -> सी आदि के साथ एक ऐप है। मुझे ऐप सूची उर्फ ​​लॉन्चर से लॉन्च होने पर ए को हमेशा "फिर से शुरू करने" के साथ समस्याएं थीं। "Resents" स्क्रीन (लंबे घर प्रेस) से फिर से शुरू करना सही फिर से शुरू करने का व्यवहार प्रदर्शित करेगा हालांकि (बी या सी अपेक्षित के रूप में फिर से शुरू करें)। मेरा मैनिफेस्ट कुछ खास नहीं था, मेरे पास हमेशा रूट की टास्कस्टेट = "सत्य" मेरी रूट गतिविधि में सेट है, और लॉन्च मोड डिफ़ॉल्ट (मानक) है।

मैं एक वेबसाइट के माध्यम से अपने फोन पर एपीके लोड कर रहा था। डाउनलोड करने और इंस्टॉल करने के बाद, मैं ऐप लॉन्च करने के लिए तुरंत "खोलें" दबा दूंगा। किसी कारण से (ऐप को अनइंस्टॉल करने के बाद) मैं फिर से डाउनलोड कर रहा हूं, इंस्टॉल कर रहा हूं, लेकिन फिर मैं ने के बजाय "पूर्ण" बटन दबाया। फिर लॉन्चर/"सभी ऐप्स" सूची से ऐप लॉन्च करना वही फिर से शुरू होता है जैसा कि रिकेंट से फिर से शुरू होता है - दूसरे शब्दों में, "संपन्न" के बजाय "ओपन" पर क्लिक करते समय इंस्टॉलेशन प्रक्रिया की वजह से मेरी समस्याएं किसी भी तरह से होती हैं।

मैं API10 पर इस "समाधान" (2.3.5) और API15 (4.0.4)

+0

क्या आपको कभी इस के लिए समाधान मिल गया ????? –

+4

नहीं। यहां इसके बारे में एक बग है (किसी और द्वारा बनाई गई): https://code.google.com/p/android/issues/detail?id=38194&q=app+resume+open+done&colspec=ID+ टाइप + स्थिति + मालिक + सारांश + सितारे मुझे यह समझना मुश्किल लगता है कि इस व्यवहार से अधिक लोग नाराज क्यों नहीं हैं: / –