2012-01-17 17 views
6

मुझे नहीं पता कि यह पता लगाना इतना मुश्किल क्यों है। मेरे पास मेरी मुख्य गतिविधि है कि, लॉन्च होने पर, यह जांचता है कि यह पहली बार खोला गया है या नहीं। यदि ऐसा है, तो यह मुख्य गतिविधि को बंद कर देता है और FLAG_ACTIVITY_NEW_TASK के साथ सेटअप/परिचय गतिविधि खोलता है। सेटअप प्रक्रिया में तीन गतिविधियां होती हैं (ए, बी, और सी)। गतिविधि सी के अंत में, मैं इसे साफ़ करने के लिए कैसे प्राप्त करूं और सेटअप कार्य जिसमें ए, बी, और सी शामिल है और फिर मुख्य गतिविधि शुरू करें। मैंने मुख्य गतिविधि Intent पर FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP जोड़ने का प्रयास किया है, लेकिन जब मैं वापस दबाता हूं, तो यह सेटअप प्रक्रिया की गतिविधि सी पर वापस आता है। जब सी खत्म हो जाती है और मुख्य शुरू होती है तो मैं गतिविधियों ए, बी, और सी के कार्य को साफ़ करने के लिए कैसे प्राप्त करूं? धन्यवाद!समाशोधन कार्य और एक नई गतिविधि शुरू करें

मैं एंड्रॉइड 1.6 (एपीआई 4) में निर्माण कर रहा हूं, इसलिए Activity झंडे में से कुछ सीमित हो सकते हैं।

+0

जब आप मुख्य गतिविधि पर आगे बढ़ रहे हैं तो गतिविधि सी समाप्त करें। – Mudassir

+0

ध्वज को साफ़ करने से केवल स्टैक से एक गतिविधि होती है, नहीं? – L7ColWinters

+0

@ मुदासिर अगर मैं अभी गतिविधि सी खत्म करता हूं, तो जब मैं मुख्य गतिविधि से वापस दबाता हूं, तो यह गतिविधि बी – Brian

उत्तर

0

मैं एक नया एक शुरू करने के बाद सिर्फ finish() अपनी गतिविधियों तुरंत अपनी टिप्पणियों में एक समान प्रश्न here

Mudassir के रूप में कहते हैं जवाब दे दिया।

+0

नहीं, मैं उपयोगकर्ता को सेटअप प्रक्रिया के दौरान आवश्यकता होने पर एक कदम वापस जाने में सक्षम होना चाहता हूं। आखिरी कदम पूरा होने पर मैं सेटअप गतिविधियों के ढेर को खत्म करना चाहता हूं। – Brian

2

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

+1

क्या यह एक ही समय में सभी तीन गतिविधियों को खत्म कर सकता है ..? – Mudassir

+0

यह एक बार नहीं है, देखें कि आपके पास गतिविधि ए, बी, सी है। इन सभी को एक बार में खत्म करने के लिए, आपको बस गतिविधि के नीचे कुछ ऐसा करने की आवश्यकता है ._instace.finish(); activityB_instace.finish(); activityC_instace.finish(); यह भी सुनिश्चित करें कि आपके उदाहरण उस गतिविधि से सार्वजनिक स्थिर हैं जहां आपने घोषित किया है। यदि ऐसा है, तो आप वास्तव में – amandroid

+0

से ऊपर दिखाए गए तरीके से कहीं भी अपना कार्य साफ़ कर सकते हैं उदाहरण के लिए आपका क्या मतलब है? क्या आप कृपया कुछ कोड का उपयोग करके समझा सकते हैं? – Mudassir

0
class A extends Activity { 
public static Activity instanceOfA = null; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    instanceOfA = this; 
} 
} 

class b extends Activity { 
public static Activity instanceOfB = null; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    instanceOfB = this; 
} 
} 


class c extends Activity { 
public static Activity instanceOfC = null; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    instanceOfC = this; 
} 
} 

अब आप अपने वर्तमान गतिविधि का सारा कार्य स्पष्ट करने के लिए, तो instanceOfA.finish (कॉल) चाहते हैं लगता है; instanceOfB.finish(); instanceOfC.finish();

+9

देखें यह अस्वीकार्य है। आप सभी गतिविधियों और सभी संसाधनों को लीक कर रहे हैं (उनके साथ जुड़े hiarerchies, * छवियों * देखें)। –

+0

इस [उत्तर] के समान कुछ (http://stackoverflow.com/a/3008684/269876) आपको बेहतर लगेगा। जैसा कि @ जोनास अलव्स बताते हैं, आप उन सभी गतिविधियों को statics का उपयोग करके लीक कर रहे हैं। इसके बजाए, एक संदेश के साथ आओ जिसे सेटअप पूरा होने पर प्रसारित किया जा सकता है, और प्रत्येक सेटअप गतिविधि प्रसारण के लिए सुन रही है। जब वे सेटअप पूर्ण अधिसूचना प्राप्त करते हैं, तो वे स्वयं को पूरा कर सकते हैं, और इसे प्राप्त करने के लिए कोई स्थैतिक आवश्यकता नहीं है। –

+2

गतिविधियों के लिए स्टेटिक संदर्भ का अर्थ है कि आपके विचार स्मृति में शेष हैं और पुनर्नवीनीकरण नहीं किए जाते हैं, जिसके परिणामस्वरूप स्मृति रिसाव होता है। – George

1

वास्तव में इस startActivityForResult

public class A extends Activity { 
    public onButtonClick() { 
     startActivityForResult(new Intent(this, B.class), 0); 
    } 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == RESULT_OK) { 
     finish(); 
     } 
    } 
} 

public class B extends Activity { 
    public onButtonClick() { 
     startActivityForResult(new Intent(this, C.class), 0); 
    } 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == RESULT_OK) { 
     setResult(RESULT_OK); 
     finish(); 
     } 
    } 
} 

public class C extends Activity { 
    public onButtonClick() { 
     setResult(RESULT_OK); 
     finish(); 
    } 
} 

साथ प्राप्त किया जा सकता मुझे लगता है कि यह सही तरीका नहीं है, तो आप इस तरह से कुछ भी रिसाव नहीं है।

पीएस: मुझे पता है कि यह पुरानी पोस्ट है, लेकिन शायद किसी को यह उपयोगी लगेगा।

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