किसी अनुप्रयोग के लिए गतिविधि स्टैक में पिछले एक गतिविधि की जाँच कैसे करें?


122

मैं जानना चाहता हूं कि क्या उपयोगकर्ता होम स्क्रीन पर वापस आएगा यदि वह वर्तमान गतिविधि से बाहर निकलता है।


1
यह मदद कर सकता है: stackoverflow.com/questions/2590581/activities-stack
12st11

43
अभी पता चला है कि IsTaskRoot नामक गतिविधि में एक फ़ंक्शन है जो मुझे लगता है कि आपकी मदद के लिए हो सकता है।
H9kDroid

जवाबों:


116

अद्यतन (जुलाई 2015):

चूंकि getRunningTasks () अपग्रेड हो जाता है, API 21 से यह raukodraug उत्तर या एड बर्नेट एक का पालन करना बेहतर होता है (मैं दूसरा एक पसंद करूंगा)।


एक्टिविटी मैनजर का उपयोग करके वर्तमान कार्यों और उनके स्टैक की जांच करने की संभावना है ।

इसलिए, यह निर्धारित करने के लिए कि क्या कोई गतिविधि अंतिम है:

  • अनुरोध में android.permission.GET_TASKS अनुमति का अनुरोध करें।
  • निम्नलिखित कोड का उपयोग करें:

    ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
    
    List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);
    
    if(taskList.get(0).numActivities == 1 &&
       taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) {
        Log.i(TAG, "This is last activity in the stack");
    }

कृपया ध्यान दें, कि उपरोक्त कोड तभी मान्य होगा जब आपके पास एक ही कार्य होगा। यदि इस बात की संभावना है कि आपके आवेदन के लिए कार्यों की संख्या मौजूद होगी - तो आपको अन्य कार्यसूची तत्वों की जाँच करनी होगी । कार्यों टास्क और बैक स्टैक के बारे में अधिक पढ़ें



25
H9kDroid ने एक सही सुझाव दिया है। चयनित उत्तर हैक है। isTaskRoot()विधि का उपयोग करके इसे सही तरीके से करना चाहिए ।
सूफियान

@ सूफिन यह विशेष रूप से हैक कहां है? कोड तार्किक है और खुले एंड्रॉइड एपीआई का उपयोग करने के तरीके से करता है (जैसे कि getRunningTasks का उपयोग रनिंग कार्यों को प्राप्त करने के लिए किया जाना चाहिए और कोई व्यक्ति केवल इन कार्यों का विश्लेषण करने के उद्देश्य से इसे कॉल करना चाह सकता है)। प्राप्त (0) का उपयोग अच्छी तरह से प्रलेखित और तार्किक है 'वर्तमान में चल रहे कार्यों की एक सूची लौटाएं, जिसमें सबसे हाल ही में पहले और पुराने क्रम में हैं'।
सैंड्रास्ट

2
getRunningTasks () एपीआई स्तर 21 में पदावनत किया गया है।
गिलक्रिस

क्या मैं टुकड़ों के लिए एक ही काम कर सकता हूं। यदि हाँ तो कैसे? कृपया मदद करें
सागर देवगंगा

1
@ Mr.Drew को @ raukodraug
David Wasser

167

मैं @ H9kDroid की टिप्पणी को उन लोगों के लिए सबसे अच्छे उत्तर के रूप में पोस्ट करने जा रहा हूं जिनके पास एक समान प्रश्न है।

क्या गतिविधि एक कार्य की जड़ है, यह जानने के लिए आप taskRoot () का उपयोग कर सकते हैं ।

आशा है कि ये आपकी मदद करेगा


1
क्या आप कृपया कोड की एकल पंक्ति प्रदान कर सकते हैं ताकि isTaskRoot का उपयोग करने के बारे में स्पष्ट हो। धन्यवाद।
केवेश कंवल

18
@ द हंटरif (isTaskRoot()) { // do something }
Howettl

3
एकमात्र समस्या यह है कि <= 4.4 पर मैं इसे> = 5.x की तुलना में अलग व्यवहार कर रहा हूं। लगता है हमेशा झूठे ही लौटते हैं।
चूबसॉन्डबस

मुझे लगता है कि आपको उत्तर में टिप्पणियों में दिए गए नमूना कोड को शामिल करने पर विचार करना चाहिए, ताकि भविष्य के पाठकों के लिए इसे आसान बनाया जा सके।
इसाक

शानदार जवाब। मेरे मामले में उपयोगकर्ता द्वारा किसी अधिसूचना पर क्लिक करने के बाद गतिविधि मूल हो सकती है यदि वे पहले आवेदन को बंद कर देते हैं
ओ ग्रेड

19

आशा है कि इससे नए शुरुआती लोगों को मदद मिलेगी, ऊपर दिए गए जवाब जो मेरे लिए ठीक काम करते हैं, मैं कोड स्निपेट भी साझा कर रहा हूं ताकि इसे लागू करना आसान हो जाए।

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

आपकी गतिविधि में

   @Override
    public void onBackPressed() {

        if(isTaskRoot()){
            startActivity(new Intent(currentActivityName.this,ActivityNameYouWantToOpen.class));
            // using finish() is optional, use it if you do not want to keep currentActivity in stack
            finish();
        }else{
            super.onBackPressed();
        }

    }


5

हालांकि इसे प्राप्त करने का एक तरीका हो सकता है (अन्य उत्तर देखें) मैं आपको सुझाव दूंगा कि आपको ऐसा नहीं करना चाहिए। सामान्य Android अनुप्रयोगों को यह जानने की आवश्यकता नहीं होनी चाहिए कि होम स्क्रीन प्रदर्शित करने वाली है या नहीं।

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


1
जब तक उपयोगकर्ता को गतिविधि नहीं छोड़ी जाती, तब तक मुझे किसी सेवा की आवश्यकता कैसे हो? मैं onStop जैसे फंक्शन्स में से किसी को भी फंसा नहीं सकता क्योंकि स्क्रीन बंद होने के बाद इन्हें कॉल किया जा सकता है।
माइकल

2
यदि कोई पृष्ठभूमि सेवा एक गतिविधि लॉन्च करती है, तो शायद आप जानना चाहेंगे कि स्टैक पर एकमात्र गतिविधि है या नहीं।
मैट डब्ल्यू

4

इस पर नज़र रखने का एक तरीका यह है कि जब आप एक नई गतिविधि शुरू करें और मार्कर मौजूद हो तो जाँच लें।

जब भी आप एक नई गतिविधि शुरू करते हैं, तो मार्कर डालें:

newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);

और फिर आप इसे इस तरह से देख सकते हैं:

boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")

1
काम नहीं करता है अगर गतिविधि को मार दिया जाता है और गतिविधि स्टैक को फिर से संगठित किया जाता है - प्रत्येक गतिविधि मांग द्वारा।
एलिकएल्ज़िन-किलाका

3

सैंडरस्टार के समाधान के साथ समस्या यह ActivityManagerहै: आपको इस तरह से कार्यों को प्राप्त करने के लिए एक अनुमति की आवश्यकता है। मुझे एक बेहतर तरीका मिला:

getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)

Activityढेर तल पर allways डिफ़ॉल्ट रूप से इस श्रेणी मिलता है जबकि अन्य क्रियाएँ यह नहीं मिलना चाहिए चाहिए।
लेकिन यहां तक ​​कि अगर यह कुछ उपकरणों पर विफल रहता है तो आप इसे शुरू करते समय सेट कर सकते हैं Activity:

Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);

यदि गतिविधि को धक्का अधिसूचना से खोला जाता है तो क्या होगा? उनके पास CATEGORY LAUNCHER
nbtk

मुझे पूरा यकीन है कि मेरे उत्तर का दूसरा भाग अभी भी लागू होता है। आप इरादे में संकेत के रूप में श्रेणी निर्धारित कर सकते हैं। इस मामले में शायद आपके अधिसूचना संदर्भ के इरादे में। इसके अलावा आप इसके लिए झंडे का इस्तेमाल भी कर सकते हैं। इरादे के साथ एक अधिसूचना निर्माण के लिए इस लिंक को देखें: stackoverflow.com/questions/13716723/…
A. Binzxxxxxx

फिर भी, यदि आपकी सबसे पुरानी गतिविधि MainActivity है और अब इसे फिर से शुरू किया गया है, और फिर आपको पुश सूचना मिलती है और आप CATEGORY_LAUNCHER के साथ खोलने के लिए लंबित सेट करते हैं, तो आपके पास इस श्रेणी के साथ 2 गतिविधियाँ होंगी। संभवतः अलग-अलग कार्यों पर हालांकि
nbtk

मुझे बिल्कुल यकीन नहीं है कि यह सूचनाओं के साथ कैसे काम करता है। मैंने कभी उनका उपयोग नहीं किया जैसे आप यहाँ करते हैं। मुझे पूरा यकीन है कि इस दृष्टिकोण के साथ ऐसा करने का एक आसान तरीका है लेकिन मैंने Q1 2014 के बाद से एंड्रॉइड कोड को नहीं छुआ। शायद आप इस मामले के लिए दूसरी श्रेणी का उपयोग करना चाहते हैं? या कुछ झंडा? लेकिन मैं इस तरह से काम करने के लिए अपने मेंटर का अनुमान लगाता हूं। मुख्य गतिविधि शुरू करने और सही गतिविधि को खोलने के लिए किसी प्रकार की मेटा जानकारी जोड़ने के बारे में कैसे?
ए। Binzxxxxxx

2

मैंने अपनी सभी गतिविधियों के लिए एक आधार वर्ग बनाया है, जो AppCompatActivity का विस्तार कर रहा है , और जिसमें एक स्थिर काउंटर है:

public abstract class BasicActivity extends AppCompatActivity {
    private static int activityCounter = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ++activityCounter;
        ...
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        --activityCounter;
        if(activityCounter==0) {
            // Last instance code...
        }
    }

    public boolean isLastInstance() { return (activityCounter==1); }
}

इसने अभी तक काफी अच्छा काम किया है; और एपीआई संस्करण की परवाह किए बिना। यह जरूर है कि सभी गतिविधियाँ इस आधार वर्ग का विस्तार करती हैं - जो वे करते हैं, मेरे मामले में।

संपादित करें: मैंने एक उदाहरण देखा है जब एप्लिकेशन पूरी तरह से बाहर निकलने से पहले काउंटर शून्य पर चला जाता है, जो तब होता है जब अभिविन्यास बदल जाता है और केवल एक गतिविधि खुली होती है। जब अभिविन्यास बदलता है, तो गतिविधि बंद हो जाती है और दूसरा बनाया जाता है, इसलिए onDestroyedउसे अंतिम गतिविधि के लिए बुलाया जाता है, और फिर onCreateउसी गतिविधि को परिवर्तित अभिविन्यास के साथ बनाया जाता है। इस व्यवहार के लिए जिम्मेदार होना चाहिए; OrientationEventListener संभवतः इस्तेमाल किया जा सकता है।


0

एंड्रॉइड एक गतिविधि स्टैक को लागू करता है, मेरा सुझाव है कि आप इसके बारे में यहां पढ़ें । ऐसा लगता है कि आप कॉलिंग गतिविधि को पुनर्प्राप्त करना चाहते हैं getCallingActivity()। यदि वर्तमान गतिविधि आपके आवेदन में पहली गतिविधि है और एप्लिकेशन को होम स्क्रीन से लॉन्च किया गया था, तो मुझे यह (मुझे मान लेना) चाहिए null


9
अगर getCallingActivity () के बाद से यह काम नहीं करेगा, यदि गतिविधि startActivityForResult () के माध्यम से शुरू नहीं हुई थी, तो यह शून्य हो जाएगी।
H9kDroid

0

यहां जो एक चीज़ छूट गई, वह है "होम की" क्लिक, सक्रिय होने पर, आप अपनी गतिविधि से इसका पता नहीं लगा सकते हैं, इसलिए "बैक की" प्रेस को संभालने और आवश्यक गतिविधि पर जाने के साथ प्रोग्राम स्टैक को सक्रिय रूप से नियंत्रित करना बेहतर होगा। बस आवश्यक कदम उठा रहे हैं।

इसके अलावा, आप सुनिश्चित नहीं हो सकते हैं, कि "हाल की गतिविधि" सूची से अपनी गतिविधि शुरू करने से गतिविधि शुरू करने के इरादे से कुछ अतिरिक्त डेटा निर्धारित करने के साथ पता लगाया जा सकता है, क्योंकि यह उस मामले में पुन: उपयोग किया जा रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.