2012-12-20 8 views
5

यह जांचने का बेहतर तरीका क्या है कि गतिविधि अभी भी कॉल करने के लिए स्टैक में है या नहीं? ActivityManager एपीआईकैसे जांचें कि गतिविधि अभी भी ढेर में है या नहीं?

पर

Intent i = new Intent(getApplicationContext(),MyClass.class); 
startActivity(i); 
+2

क्यों देखभाल? यह एंड्रॉइड पर निर्भर है। – m0skit0

+0

इस पोस्ट को देखें http://stackoverflow.com/questions/5975811/how-to-check-if-an-activity-is-the-last-one-in-the-activity-stack-for-an-applica/ 6242122 # 6242122 –

+0

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

उत्तर

-1

झलक पाने के लिए ActivityManager का एक उदाहरण के लिए इस कोड का उपयोग करें:

ActivityManager mngr = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
+8

यह देखने के लिए बहुत अच्छा होगा कि गतिविधि को स्टैक पर जांचने के लिए गतिविधि प्रबंधक को वास्तव में कैसे उपयोग करना चाहिए। सिर्फ "इस वर्ग के दस्तावेज़ीकरण को पढ़ना" पर्याप्त आईएमओ नहीं है। – Tapemaster

+0

वह ActivityManager.getRunningTasks का जिक्र कर रहा था, लेकिन इसे लॉलीपॉप में बहिष्कृत कर दिया गया है। नेविगेशन उपयोग मामले का उल्लेख करने के लिए – grebulon

1

मुझे आश्चर्य है कि कैसे अलोकप्रिय इस (एक तरह से) प्रश्न (रों) है हूँ। ,
ActivityManager.getRunningTasks के बाद से एपीआई 21 के बाद से हटा दिया गया है
हम एक और तरीका क्या गतिविधियों backstack में हैं पाने के लिए खोजने के लिए:

मुझे पहले समाधान से शुरू करते हैं। और मुझे एहसास हुआ कि हम वास्तव में अपने "ढेर" को लागू कर सकते हैं!

मैं MyOwnApplication में एक ArrayList की घोषणा की:

private ArrayList<Class> runningActivities = new ArrayList<>(); 

और इस सूची तक पहुँच और संशोधित करने के लिए सार्वजनिक तरीकों कहा:

public void addThisActivityToRunningActivityies (Class cls) { 
    if (!runningActivities.contains(cls)) runningActivities.add(cls); 
} 

public void removeThisActivityFromRunningActivities (Class cls) { 
    if (runningActivities.contains(cls)) runningActivities.remove(cls); 
} 

public boolean isActivityInBackStack (Class cls) { 
    return runningActivities.contains(cls); 
} 

में एक BaseActivity जहां सभी गतिविधियों यह विस्तार:

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ((MyOwnApplication)getApplication()).addThisActivityToRunningActivityies(this.getClass()); 
    } 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    ((MyOwnApplication)getApplication()).removeThisActivityFromRunningActivities(this.getClass()); 
} 

और फिर आप आसानी से जांचने के लिए isActivityInBackStack का उपयोग कर सकते हैं।

यह आवश्यक क्यों है?

हां, ज़ाहिर है, अधिकांश मामलों को इरादा ध्वज और उचित नेविगेशन का उपयोग करके किया जा सकता है।
लेकिन ऐसे उपयोग मामले हैं, जो मुझे लगता है कि आम होना चाहिए, कि मुझे इरादा झंडे का उपयोग करके समाधान नहीं मिला है।

मान लीजिए मेरे पास एक ऐसा एप्लिकेशन है जिसमें लगभग हर गतिविधि में नेविगेशन ड्रॉवर है।
मैं MainActivity से ActivityA पर नेविगेट करता हूं, और फिर ActivityA से ChildActivityB बनाया गया। कृपया ध्यान दें कि ActivityAChildActivityB के माता-पिता नहीं हैं क्योंकि ChildActivityB अधिसूचना जैसी अन्य गतिविधियों से खोला जा सकता है।

ध्यान दें कि, ChildActivityB में एक दराज भी है। मैं ऊपर या पीछे बटन दबाए जाने के बजाय दराज के माध्यम से ActivityA पर नेविगेट कर सकता हूं। अब, कल्पना करें कि आप इस प्रक्रिया के माध्यम से लूप करते हैं: गतिविधि ए -> चाइल्डएक्टिविटी बी -> दराज -> गतिविधि ए -> चाइल्डएक्टिविटीबी -> दराज -> गतिविधि ए ..... बैकस्टैक में अनंत गतिविधियां बनाई जाएंगी।
इस तरह के व्यवहार को ठीक करने के लिए, हम आशय झंडे उपयोग करने की आवश्यकता:

(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP); 

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

अब, अगर मैं पता लगाने के लिए कि क्या ActivityA backstack में है या नहीं कर रहा हूँ, व्यवहार सही नहीं होंगे:

private void navigateToDrawerItems(Class cls) { 
    drawerLayout.closeDrawer(GravityCompat.END); 
    Intent intent = new Intent(this, cls); 
    if (((MyOwnApplication)getApplication()).isActivityInBackStack(cls)) { 
     intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(intent); 
    } else { 
     startActivity(intent); 
     overridePendingTransition(R.anim.slide_right_in, R.anim.slide_left_out); 
    } 
} 
+0

+1। मैं जोड़ूंगा कि यह नेविगेशन ड्रॉवर के लिए एक वैध उपयोग केस है, यह टैब बार नेविगेशन (उर्फ BottomNavigationView) के लिए और भी महत्वपूर्ण है। एंड्रॉइड में खंड बैकस्टैक के लिए कोई FLAG_ACTIVITY_REORDER_TO_FRONT नहीं है। तो यदि आप टैब के बीच स्विच करते समय आसानी से स्थिति रखना चाहते हैं और स्मृति से बाहर नहीं निकलते हैं, तो खंड टैब के बजाए गतिविधि टैब का उपयोग करना एकमात्र तरीका है। – flopshot

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