मैं जानना चाहता हूं कि क्या उपयोगकर्ता होम स्क्रीन पर वापस आएगा यदि वह वर्तमान गतिविधि से बाहर निकलता है।
मैं जानना चाहता हूं कि क्या उपयोगकर्ता होम स्क्रीन पर वापस आएगा यदि वह वर्तमान गतिविधि से बाहर निकलता है।
जवाबों:
अद्यतन (जुलाई 2015):
चूंकि getRunningTasks () अपग्रेड हो जाता है, API 21 से यह raukodraug उत्तर या एड बर्नेट एक का पालन करना बेहतर होता है (मैं दूसरा एक पसंद करूंगा)।
एक्टिविटी
मैनजर का उपयोग करके वर्तमान कार्यों और उनके स्टैक की जांच करने की संभावना है ।
इसलिए, यह निर्धारित करने के लिए कि क्या कोई गतिविधि अंतिम है:
निम्नलिखित कोड का उपयोग करें:
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");
}
कृपया ध्यान दें, कि उपरोक्त कोड तभी मान्य होगा जब आपके पास एक ही कार्य होगा। यदि इस बात की संभावना है कि आपके आवेदन के लिए कार्यों की संख्या मौजूद होगी - तो आपको अन्य कार्यसूची तत्वों की जाँच करनी होगी । कार्यों टास्क और बैक स्टैक के बारे में अधिक पढ़ें
isTaskRoot()
विधि का उपयोग करके इसे सही तरीके से करना चाहिए ।
मैं @ H9kDroid की टिप्पणी को उन लोगों के लिए सबसे अच्छे उत्तर के रूप में पोस्ट करने जा रहा हूं जिनके पास एक समान प्रश्न है।
क्या गतिविधि एक कार्य की जड़ है, यह जानने के लिए आप taskRoot () का उपयोग कर सकते हैं ।
आशा है कि ये आपकी मदद करेगा
if (isTaskRoot()) { // do something }
आशा है कि इससे नए शुरुआती लोगों को मदद मिलेगी, ऊपर दिए गए जवाब जो मेरे लिए ठीक काम करते हैं, मैं कोड स्निपेट भी साझा कर रहा हूं ताकि इसे लागू करना आसान हो जाए।
समाधान: मैंने उपयोग किया 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();
}
}
इसका एक आसान उपाय है, आप अपनी गतिविधि में isTaskRoot () का उपयोग कर सकते हैं
हालांकि इसे प्राप्त करने का एक तरीका हो सकता है (अन्य उत्तर देखें) मैं आपको सुझाव दूंगा कि आपको ऐसा नहीं करना चाहिए। सामान्य Android अनुप्रयोगों को यह जानने की आवश्यकता नहीं होनी चाहिए कि होम स्क्रीन प्रदर्शित करने वाली है या नहीं।
यदि आप डेटा को बचाने का प्रयास कर रहे हैं, तो डेटा बचत कोड को अपने ऑनपॉज़ () विधि में डालें। यदि आप उपयोगकर्ता को मौजूदा एप्लिकेशन के बारे में अपने मन को बदलने का एक तरीका देने की कोशिश कर रहे हैं, तो आप बैक की और ऑनबैकबैक () विधि के लिए कुंजी अप / डाउन को इंटरसेप्ट कर सकते हैं और उन्हें "क्या आप सुनिश्चित हैं?" प्रेरित करना।
इस पर नज़र रखने का एक तरीका यह है कि जब आप एक नई गतिविधि शुरू करें और मार्कर मौजूद हो तो जाँच लें।
जब भी आप एक नई गतिविधि शुरू करते हैं, तो मार्कर डालें:
newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);
और फिर आप इसे इस तरह से देख सकते हैं:
boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
सैंडरस्टार के समाधान के साथ समस्या यह ActivityManager
है: आपको इस तरह से कार्यों को प्राप्त करने के लिए एक अनुमति की आवश्यकता है। मुझे एक बेहतर तरीका मिला:
getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
Activity
ढेर तल पर allways डिफ़ॉल्ट रूप से इस श्रेणी मिलता है जबकि अन्य क्रियाएँ यह नहीं मिलना चाहिए चाहिए।
लेकिन यहां तक कि अगर यह कुछ उपकरणों पर विफल रहता है तो आप इसे शुरू करते समय सेट कर सकते हैं Activity
:
Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);
मैंने अपनी सभी गतिविधियों के लिए एक आधार वर्ग बनाया है, जो 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 संभवतः इस्तेमाल किया जा सकता है।
एंड्रॉइड एक गतिविधि स्टैक को लागू करता है, मेरा सुझाव है कि आप इसके बारे में यहां पढ़ें । ऐसा लगता है कि आप कॉलिंग गतिविधि को पुनर्प्राप्त करना चाहते हैं getCallingActivity()
। यदि वर्तमान गतिविधि आपके आवेदन में पहली गतिविधि है और एप्लिकेशन को होम स्क्रीन से लॉन्च किया गया था, तो मुझे यह (मुझे मान लेना) चाहिए null
।
यहां जो एक चीज़ छूट गई, वह है "होम की" क्लिक, सक्रिय होने पर, आप अपनी गतिविधि से इसका पता नहीं लगा सकते हैं, इसलिए "बैक की" प्रेस को संभालने और आवश्यक गतिविधि पर जाने के साथ प्रोग्राम स्टैक को सक्रिय रूप से नियंत्रित करना बेहतर होगा। बस आवश्यक कदम उठा रहे हैं।
इसके अलावा, आप सुनिश्चित नहीं हो सकते हैं, कि "हाल की गतिविधि" सूची से अपनी गतिविधि शुरू करने से गतिविधि शुरू करने के इरादे से कुछ अतिरिक्त डेटा निर्धारित करने के साथ पता लगाया जा सकता है, क्योंकि यह उस मामले में पुन: उपयोग किया जा रहा है।