2016-02-19 6 views
12

एक Android app-कैसे एक गतिविधि में साथ टुकड़ा वापस ढेर बहाल करने के लिए (अनुप्रयोग पृष्ठभूमि में मार दिया जाता है के बाद)

कहो में एक activiy- MyActivity जो एक समय में एक टुकड़ा धारण में हूँ।

सबसे पहले मैं यह करने के लिए टुकड़ा एक भरी हुई कुछ बिंदु मैं टुकड़ा बी लोड पर फिर

(कोई टैग के साथ मैं टुकड़ा प्रबंधक के ढेर वापस करने के लिए यह जोड़ा) (कोई टैग के साथ मैं टुकड़ा प्रबंधक के ढेर वापस करने के लिए यह जोड़ा)

तो कुछ बिंदु पर मैं टुकड़ा सी भरी हुई (कोई टैग के साथ मैं टुकड़ा प्रबंधक के ढेर वापस करने के लिए)

popbackstack उपयोग कर रहा हूँ सक्षम करने के लिए वापस बटन व्यवहार तो जब कभी मैं टुकड़ा से वापस प्रेस यह जोड़ा सी प्रवाहकी तरह है

टुकड़ा सी> टुकड़ा बी> टुकड़ा एक -> बंद MyActivity ..

हर बात सही :-)

लेकिन पृष्ठभूमि में मारे यदि टुकड़ा सी में हूँ और एप्लिकेशन हो जाता है

और ऑनलाइन वापस आने टुकड़ा सी MyActivity में भरी हुई है (मैं सेटिंग्स से गतिविधि झंडा नहीं रखते थे)

+०१२३४१४६२०९ > बंद करें MyActivity ..

क्यों यह इतना है -लेकिन टुकड़ा प्रबंधकों .. वापस ढेर केवल टुकड़ा सी होता है

वापस बटन यह

टुकड़ा सी खिलवाड़ ऊपर है?

एक गतिविधि में टुकड़े प्रबंधकों को वापस ढेर कैसे व्यवस्थित करें?

+0

जो हो सकता है क्योंकि आपकी गतिविधि मारे जा रही है और यदि आप चाहते हैं कि आप अपना खुद का बैक स्टैक बना सकें और वरीयताओं में कुछ स्टोर कर सकें और हर बार जांच करें कि क्या हां में गतिविधि में कोई चीज है तो हाँ हटाएं (और अपने बैक स्टैक से भी हटाएं) यदि आपकी गतिविधि बैक स्टैक सामग्री नहीं है तो इनपुट के लिए –

+0

@VishalMokal धन्यवाद के अनुसार जाएं। एक गतिविधि का बैक स्टैक खंड प्रबंधक द्वारा प्रबंधित किया जाता है। जिसका मतलब है कि बैक स्टैक में टुकड़े जोड़ने या निकालने के एक से अधिक तरीके हैं। इसके अलावा एक समाधान एक बड़े आवेदन के लिए स्केल नहीं करेगा। जैसा कि नेविगेशन के लिए टुकड़ों के आधार पर भी है, एक और मौलिक समाधान को प्राथमिकता दी जाती है। –

+0

"बैक बटन व्यवहार को सक्षम करने के लिए मैं पॉपबैकस्टैक का उपयोग कर रहा हूं" के साथ आपका क्या मतलब है? यदि आप अपने टुकड़े टुकड़े के साथ जोड़ते हैं तो एंड्रॉइड सिस्टम स्वचालित रूप से बैक बटन व्यवहार का प्रबंधन नहीं करता है।) (खंड) जोड़ें .addToBackStack()। प्रतिबद्ध()? – personne3000

उत्तर

9

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

<activity android:alwaysRetainTaskState="true"/> 

यह सेटिंग उस व्यवहार को रोक देगी और यह अनुसरण कर सकती है कि व्यवहार को फ्रैगमेंट मैनेजर द्वारा विरासत में मिला है।

+0

यह ध्वज गतिविधि स्तर पर केवल –

4

अपने अनुप्रयोग डेवलप करते समय, मैं सुझाव है कि आप गतिविधियों के बहाल/बचाया राज्यों परीक्षण करने के लिए, एशियाई विकास बैंक के साथ टुकड़े:

  1. एप्लिकेशन खोलें
  2. नेविगेट
  3. प्रेस घर
  4. एडीबी गतिविधियों के बीच - > मारें (रोकें) ऐप
  5. एप्लिकेशन स्टैक (डिवाइस से मेनू बटन) दबाएं और एप्लिकेशन को फिर से शुरू करें

इस तरह आप सहेजे गए/पुनर्स्थापित राज्यों को डीबग कर सकते हैं।

आप एक जटिल आवेदन की जरूरत नहीं है, मेरा सुझाव है आप को संभाल बचाया/गतिविधि में राज्य को बहाल करने की:

private Fragment1 mFragment; 

@Override 
protected void onCreate(Bundle savedState) { 
    super.onCreate(savedState); 
    // ... 

    if (savedState == null) { 
     mFragment = new Fragment1(); 

     getFragmentManger().beginTransacation().add(mFragment, TAG).addToBackStack(TAG).commit(); 
    } 
    else { 
     mFragment = getFragmentMananager().findFragmentByTag(TAG); 
    } 
} 

आप कई Fragments या एक ViewPager या नेस्टेड टुकड़े है, तो बातें कर सकते हैं वास्तव में जटिल हो जाओ। मेरा सुझाव है कि आप पूरे अनुप्रयोग फिर से आरंभ करने के लिए: http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html

+0

पर लागू होता है, मैं सहमत हूं कि दूसरा समाधान (पुनरारंभ गतिविधि) एक त्वरित वार्कराउंड है यदि आपकी मूल गतिविधि वह है जो टुकड़े की मेजबानी कर रही है, धन्यवाद –

1

इस विधि

public void setRetainInstance (boolean retain) 

नियंत्रित करें कि एक का प्रयास करें: आप प्रत्येक बचाया/राज्य बहाल, कृपया इसे पढ़ें इस पोस्ट को संभालने के लिए चाहते हैं

@Override 
protected void onCreate(Bundle savedState) { 
    super.onCreate(savedState); 

    if (savedState != null) { 
     Intent intent = new Intent(ActivityMain.this, ActivityMain.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     startActivity(intent); 

     return; 
    } 
} 

खंड पुन: निर्माण (जैसे कॉन्फ़िगरेशन परिवर्तन से) में खंड का उदाहरण बरकरार रखा जाता है। इसका उपयोग केवल टुकड़ों के साथ किया जा सकता है जो पीछे की ढेर में नहीं हैं। यदि इसे सेट टुकड़ा जीवन चक्र थोड़ा अलग है जब एक गतिविधि से निर्मित किया गया है हो जाएगा:

डेवलपर वेबसाइट आपके आवेदन की मौत के बाद http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance%28boolean%29

0

टुकड़ा सी लोड किया जा कभी नहीं करना चाहिए से। क्या आपके आवेदन में एक इनिट फ्रैगमेंट है? आदर्श रूप से जब आप टुकड़ों के एक पॉप को लागू कर रहे हैं तो एक इनिट स्क्रीन होनी चाहिए। यदि आवेदन स्मृति कारणों से मर जाता है या मारे जाते हैं तो आपको आवेदन फ्रैगमेंट ए (इनिट फ्रैगमेंट) से शुरू होना चाहिए। फ्रैगमेंट सी से नहीं

यदि आपकी समस्या इस समाधान की मांग करती है, तो आपको एक नया टुकड़ा शीर्ष पर आने पर लगातार प्रत्येक टुकड़े को सहेजना होगा। आदर्श रूप से इसका मतलब है कि आप इसे प्राप्त करने के लिए प्राथमिकता या डेटाबेस में अपना बैकस्टैक बना रहे हैं।

+0

Super.onCreate जब गतिविधि को फिर से बनाया जाता है तो आखिरी टुकड़ा लोड हो जाएगा .. डेटा हानि भी प्रबंधित की जाती है .. चिंताओं को ध्यान में रखते हुए –

+0

क्या आप सहेजे गए इंस्टेंस की ऑब्जेक्ट को चालू करते हैं? – user1649464

+0

हाँ मैं उसी –

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