यह जांचने का बेहतर तरीका क्या है कि गतिविधि अभी भी कॉल करने के लिए स्टैक में है या नहीं? ActivityManager एपीआईकैसे जांचें कि गतिविधि अभी भी ढेर में है या नहीं?
पर
Intent i = new Intent(getApplicationContext(),MyClass.class);
startActivity(i);
यह जांचने का बेहतर तरीका क्या है कि गतिविधि अभी भी कॉल करने के लिए स्टैक में है या नहीं? ActivityManager एपीआईकैसे जांचें कि गतिविधि अभी भी ढेर में है या नहीं?
पर
Intent i = new Intent(getApplicationContext(),MyClass.class);
startActivity(i);
झलक पाने के लिए ActivityManager का एक उदाहरण के लिए इस कोड का उपयोग करें:
ActivityManager mngr = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
यह देखने के लिए बहुत अच्छा होगा कि गतिविधि को स्टैक पर जांचने के लिए गतिविधि प्रबंधक को वास्तव में कैसे उपयोग करना चाहिए। सिर्फ "इस वर्ग के दस्तावेज़ीकरण को पढ़ना" पर्याप्त आईएमओ नहीं है। – Tapemaster
वह ActivityManager.getRunningTasks का जिक्र कर रहा था, लेकिन इसे लॉलीपॉप में बहिष्कृत कर दिया गया है। नेविगेशन उपयोग मामले का उल्लेख करने के लिए – grebulon
मुझे आश्चर्य है कि कैसे अलोकप्रिय इस (एक तरह से) प्रश्न (रों) है हूँ। ,
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
बनाया गया। कृपया ध्यान दें कि ActivityA
ChildActivityB
के माता-पिता नहीं हैं क्योंकि 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);
}
}
+1। मैं जोड़ूंगा कि यह नेविगेशन ड्रॉवर के लिए एक वैध उपयोग केस है, यह टैब बार नेविगेशन (उर्फ BottomNavigationView) के लिए और भी महत्वपूर्ण है। एंड्रॉइड में खंड बैकस्टैक के लिए कोई FLAG_ACTIVITY_REORDER_TO_FRONT नहीं है। तो यदि आप टैब के बीच स्विच करते समय आसानी से स्थिति रखना चाहते हैं और स्मृति से बाहर नहीं निकलते हैं, तो खंड टैब के बजाए गतिविधि टैब का उपयोग करना एकमात्र तरीका है। – flopshot
क्यों देखभाल? यह एंड्रॉइड पर निर्भर है। – m0skit0
इस पोस्ट को देखें http://stackoverflow.com/questions/5975811/how-to-check-if-an-activity-is-the-last-one-in-the-activity-stack-for-an-applica/ 6242122 # 6242122 –
क्योंकि मेरे पास एक ऐसी गतिविधि है जिसे डेटा और एक्सएमएल फ़ाइल से डेटा पुनर्प्राप्त करने के लिए पैरा की आवश्यकता होती है, इसलिए मैं इसे पैरा से गुजरने और फ़ाइल से डेटा प्राप्त करने से बचने के लिए इसे स्टैक से वापस कॉल करना चाहता हूं क्योंकि यह उपयोगकर्ता के लिए दर्दनाक होगा प्रोग्रेसडिअलॉग हर बार देखें। – leonidas79