एप्लिकेशन से बाहर कैसे निकलें और होम स्क्रीन दिखाएं?


196

मेरे पास एक एप्लिकेशन है जहां होम पेज पर मेरे पास एप्लिकेशन के माध्यम से नेविगेशन के लिए बटन हैं।

उस पृष्ठ पर मेरे पास एक बटन "बाहर निकलें" है जिसे क्लिक करने पर उपयोगकर्ता को फोन स्क्रीन पर होम स्क्रीन पर ले जाना चाहिए जहां एप्लिकेशन आइकन है।

मैं उसे कैसे कर सकता हूँ?

जवाबों:


327

एंड्रॉइड का डिज़ाइन किसी एप्लिकेशन को पसंद से बाहर करने का पक्ष नहीं लेता है, बल्कि ओएस द्वारा इसका प्रबंधन करता है। आप इसके अनुरूप इरादे से गृह अनुप्रयोग ला सकते हैं:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

25
आप भी उपयोग कर सकते हैं .. "MoveTaskToBack (true);"
हेमंत कुमार

17
क्या यह सभी संसाधनों से निपटेगा? क्योंकि जब मैं इस तरह से ऐप से बाहर निकलता हूं और कुछ समय बाद मैं ऐप आइकन पर फिर से क्लिक करता हूं। यह वहीं से शुरू होता है जहां मैंने इसे छोड़ा था। इसका मतलब है कि ऐप अभी भी बैकग्राउंड में चल रहा था।
आदिल मलिक

12
Activity.finish ();
hB0

11
यह आपके ऐप को बैकग्राउंड में रखता है, इसलिए यह एप्लिकेशन से बाहर नहीं निकलता है।
हरमन स्कोनफेल्ड

3
यह उत्तर सिर्फ होम स्क्रीन को प्रदर्शित करेगा और ओपी के अनुसार आवेदन को पूरी तरह से बाहर / बंद नहीं करेगा।
बशर 51

74

हो सकता है आप कुछ इस तरह की कोशिश कर सकते हैं

मान लें कि हमारे आवेदन में, हमारे पास कई गतिविधियां हैं (दस कहते हैं) और हमें इस गतिविधि से सीधे बाहर निकलने की आवश्यकता है। हम क्या कर सकते हैं, एक इरादा बनाएं और मूल गतिविधि पर जाएं और इरादे के रूप में झंडा सेट करें

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

इसके अलावा, इरादे के लिए बूलियन की तरह कुछ अतिरिक्त जोड़ें

intent.putExtra("EXIT", true);

फिर जड़ गतिविधि में, का मान की जाँच booleanऔर कहा कि कॉल खत्म (के अनुसार), में onCreate()जड़ गतिविधि के

if (getIntent().getBooleanExtra("EXIT", false)) {
 finish();
}

1
बस खत्म करने के लिए आह्वान में कुछ भी नहीं है।
imcaptor

2
मेरे मामले में मुझे भी ओवरराइड करना पड़ा onNewIntent। क्योंकि intnet.getExtras () शून्य रखा जा रहा है।
zznq

और यह विधि RootActivityइसे स्टैक से फिर से शुरू करने के बजाय आपके पुनरारंभ करेगी । यहाँ देखें इस पर काबू पाने के लिए stackoverflow.com/a/26258455/609782
दर्पण

29
System.exit(0);

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


1
कि एक लोअरकेस बाहर निकलना चाहिए?
कैरोल

1
System.exit (0) होना चाहिए। लेकिन यह वैसे भी बहुत उपयोगी नहीं है।
superarts.org

7
System.exit (0) कोर एंड्रॉइड टीम द्वारा सलाह के रूप में उपयोग नहीं किया जाना चाहिए।
दिनेश वेंकट

2
मुझे लगता है कि यह असाधारण परिस्थितियों के लिए सबसे अच्छा तरीका है। एक ऐसे ऐप के लिए कहें जिसे इंटरनेट की जरूरत है और कनेक्शन ऐप में कुछ गतिविधियों को तोड़ देता है। एक चेतावनी संवाद प्रदर्शित किया जा सकता है (बिना बटन के)। बैक बटन को संपूर्ण ऐप से बाहर निकलने की आवश्यकता है क्योंकि रीएंट्री के लिए फिर से लॉगिन / आरंभीकरण की आवश्यकता होती है। System.exit एक मात्र ऐसी चीज है जो यथोचित रूप से काम करती है। हालांकि @ user1699548 टिप्पणी के बारे में निश्चित नहीं है।
हरमोन स्कोनफेल्ड

1
क्या यह उस ऐप से संबंधित सभी सेवाओं को भी मार देगा?
bsara

25

यह मेरे लिए अच्छा काम करता है।
पिछली सभी गतिविधियों को निम्नानुसार बंद करें:

    Intent intent = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("Exit me", true);
    startActivity(intent);
    finish();

फिर MainActivity onCreate () मेथड को MainActivity खत्म करने के लिए जोड़ते हैं

    setContentView(R.layout.main_layout);

    if( getIntent().getBooleanExtra("Exit me", false)){
        finish();
        return; // add this to prevent from doing unnecessary stuffs
    }

यह मेरे लिए काम नहीं करता है। यह मेरे ऐप को कुछ भी नहीं दिखाई देता है, लेकिन फिर भी कुछ कैसे चल रहा है। मैं धागे को चारों ओर लटका हुआ देख सकता हूं और डिबगर में प्रतीक्षा कर सकता हूं जो वास्तव में कभी भी कुछ नहीं करेगा।
स्टीफन एम-स्ट्राइक-

23

पहले विधि का उपयोग करके अपना आवेदन समाप्त करें finish();

और फिर फोर्स को हटाने के लिए onDestroy में नीचे की पंक्तियों को जोड़ें

android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();

3
इसका उपयोग कभी न करें, क्योंकि इससे संसाधनों को मुक्त करने का कोई मौका नहीं मिलता है
जैकी

1
-1 क्योंकि onDestroy को जब भी आप एक्टिविटी छोड़ते हैं, तब ही निष्पादित किया जाता है, न केवल जब बैक की को दबाया जाता है।
हम्जेह सोबह

5
@ जैकी: और कैसे इस प्रक्रिया को मारना किसी भी सिस्टम संसाधनों को मुक्त नहीं करता है?
हरमोन स्कोनफेल्ड

1
के super.onDestroy()बाद क्यों है killProcess()? क्या इस लाइन तक भी पहुंचा जा सकता है?
शौ जूल

क्या यह आपकी सभी सेवाओं को भी नहीं मारता है?
इरशू

20

यदि आप किसी गतिविधि को समाप्त करना चाहते हैं तो आप बस कॉल कर सकते हैं finish()। हालाँकि, स्क्रीन पर एक एक्जिट बटन होना बुरा है।


2
मैं इसे "आपको इस ऐप को नवीनतम संस्करण में अपडेट करने की आवश्यकता है" के लिए उपयोग कर रहा हूं, और मैं नहीं चाहता कि वे इसका उपयोग करना जारी रखें। अभी भी बुरा अभ्यास ...?
बीट्री

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

17

कुछ गतिविधियां वास्तव में आप फिर से खोलना नहीं चाहते हैं जब बैक बटन ने ऐसी स्प्लैश स्क्रीन गतिविधि, वेलकम स्क्रीन गतिविधि, पुष्टिकरण विंडोज को दबाया। वास्तव में आपको गतिविधि स्टैक में इसकी आवश्यकता नहीं है। आप इसका उपयोग कर सकते हैं => खुला मैनिफ़ेस्ट.xml फ़ाइल खोलें और एक विशेषता जोड़ें

एंड्रॉयड: noHistory = "true"

इन गतिविधियों के लिए।

<activity
    android:name="com.example.shoppingapp.AddNewItems"
    android:label="" 
    android:noHistory="true">
</activity>

या

कभी-कभी आप कुछ बैक बटन प्रेस में पूरे एप्लिकेशन को बंद करना चाहते हैं। यहां सबसे अच्छा अभ्यास आवेदन बाहर निकलने के बजाय घर की खिड़की को खोलना है। इसके लिए आपको onBackPressed () मेथड को ओवरराइड करना होगा। आमतौर पर यह विधि स्टैक में शीर्ष गतिविधि को खोलती है।

@Override
public void onBackPressed(){
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);

}

या

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

@Override
public void onBackPressed() {
  finish();
}

16

अपने Android एप्लिकेशन से बाहर निकलने की अनुशंसा नहीं की जाती है। अधिक विवरण के लिए यह प्रश्न देखें।

उपयोगकर्ता हमेशा होम बटन के माध्यम से या बैक बटन के माध्यम से पहली गतिविधि में अपना ऐप छोड़ सकता है।


3
@janusz: होम बटन को दबाने पर कभी भी एंड्रॉइड एप्लिकेशन नहीं छोड़ा जाता है, इसके बजाय यह पृष्ठभूमि में जाता है ...
Jayesh

5

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

आप कहते हैं MainActivityऔर ChildActivity

चाइल्डएक्टिविटी के अंदर इसे जोड़ें:

Intent intent = new Intent(ChildActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
return true;

MainActivity के ऑनक्रिएट के अंदर इसे जोड़ें:

@Override
public void onCreate(Bundle savedInstanceState) {

    mContext = getApplicationContext();

    super.onCreate(savedInstanceState);

    if (getIntent().getBooleanExtra("EXIT", false)) {
        finish();
        return;
    }
    // your current codes
    // your current codes
}

4

एक और विकल्प है, ऐप से संबंधित स्टैक में सभी कार्यों को बंद करने के लिए फिनिशएफ़िनिटी पद्धति का उपयोग करने के लिए।

देखें: https://stackoverflow.com/a/27765687/1984636


3

जब उस गतिविधि के यू कॉल फिनिश ऑनडेस्ट्रो () को कॉल किया जाएगा और यह गतिविधि स्टैक में पिछली गतिविधि पर वापस जाएगी ... तो .. बाहर निकलने के लिए कॉल फिनिश नहीं करें ();


3

यहाँ मैंने क्या किया है:

SomeActivity.java

 @Override
    public void onBackPressed() {
            Intent newIntent = new Intent(this,QuitAppActivity.class);
            newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(newIntent);
            finish();
    }

QuitAppActivity.java

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

मूल रूप से आपने जो कुछ भी किया वह स्टैक और लॉन्च से सभी गतिविधियों को मंजूरी दे दी है QuitAppActivity, जो कार्य को पूरा करेगा।


अच्छी एप्रोच। इंटेंट के माध्यम से मूल्यों को पारित करने की आवश्यकता नहीं है।
user3144836

0

के बाद लाइनों निम्नलिखित एड finish();में onDestroy():

android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();

0

मैंने निम्नलिखित कोड स्निपेट का उपयोग करके एप्लिकेशन से बाहर निकलने की कोशिश की, यह मेरे लिए काम करता है। आशा है कि यह आपकी मदद करता है। मैंने 2 गतिविधियों के साथ छोटा डेमो किया

पहली गतिविधि

public class MainActivity extends Activity implements OnClickListener{
    private Button secondActivityBtn;
    private SharedPreferences pref;
    private SharedPreferences.Editor editer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        secondActivityBtn=(Button) findViewById(R.id.SecondActivityBtn);
        secondActivityBtn.setOnClickListener(this);

        pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
        editer = pref.edit();

        if(pref.getInt("exitApp", 0) == 1){
            editer.putInt("exitApp", 0);
            editer.commit();
            finish();
        }
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.SecondActivityBtn:
            Intent intent= new Intent(MainActivity.this, YourAnyActivity.class);
            startActivity(intent);
            break;
        default:
            break;
        }
    }
}

आपकी कोई अन्य गतिविधि

public class YourAnyActivity extends Activity implements OnClickListener {
    private Button exitAppBtn;
    private SharedPreferences pref;
    private SharedPreferences.Editor editer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_any);

        exitAppBtn = (Button) findViewById(R.id.exitAppBtn);
        exitAppBtn.setOnClickListener(this);

        pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
        editer = pref.edit();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.exitAppBtn:
            Intent main_intent = new Intent(YourAnyActivity.this,
                    MainActivity.class);
            main_intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(main_intent);
            editer.putInt("exitApp",1);
            editer.commit();
            break;
        default:
            break;
        }
    }
}

0

मैंने इसे ऑब्जर्वर मोड के साथ किया।

प्रेक्षक का इंटरफ़ेस

public interface Observer {
public void update(Subject subject);
}

आधार विषय

public class Subject {
private List<Observer> observers = new ArrayList<Observer>();

public void attach(Observer observer){
    observers.add(observer);
}

public void detach(Observer observer){
    observers.remove(observer);
}

protected void notifyObservers(){
    for(Observer observer : observers){
        observer.update(this);
    }
}
}

चाइल्ड सब्जेक्ट एक्जिट मेथड को लागू करता है

public class ApplicationSubject extends Subject {
public void exit(){
    notifyObservers();
}
}

MyApplication जो आपके आवेदन को विस्तारित करना चाहिए

public class MyApplication extends Application {

private static ApplicationSubject applicationSubject;

public ApplicationSubject getApplicationSubject() {
            if(applicationSubject == null) applicationSubject = new ApplicationSubject();
    return applicationSubject;
}

}

आधार गतिविधि

public abstract class BaseActivity extends Activity implements Observer {

public MyApplication app;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    app = (MyApplication) this.getApplication();
    app.getApplicationSubject().attach(this);
}

@Override
public void finish() {
    // TODO Auto-generated method stub
            app.getApplicationSubject().detach(this);
    super.finish();
}

/**
 * exit the app
 */
public void close() {
    app.getApplicationSubject().exit();
};

@Override
public void update(Subject subject) {
    // TODO Auto-generated method stub
    this.finish();
}

}

आइए इसका परीक्षण करते हैं

public class ATestActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    close(); //invoke 'close'
}
}

0

यदि आप आवेदन से बाहर निकलना चाहते हैं तो इस कोड को अपने कार्य के अंतर्गत रखें

public void yourFunction()
{
finishAffinity();   
moveTaskToBack(true);

}



//For an instance, if you want to exit an application on double click of a 
//button,then the following code can be used.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 2) {
        // do something on back.
        From Android 16+ you can use the following:

        finishAffinity();
        moveTaskToBack(true);
    }

    return super.onKeyDown(keyCode, event);
}

0

100% ठीक काम करता है। यह आपके एप्लिकेशन से बाहर निकलने के लिए कोड हैक्लिक करें (विधि)

    Button exit = (Button)findViewById(R.id.exitbutton);

    exit.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View view) {

            finish();
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(1);
            Toast.makeText(getApplicationContext(), "Closed Completely and Safely", Toast.LENGTH_LONG).show();

        }
    });

0

आप आवेदन को कम से कम करने moveTaskToBack(true)के onClickedListenerलिए बस अपने निकास बटन में जोड़ सकते हैं ।

आशा करता हूँ की ये काम करेगा।


0

शायद मेरा कोड hepls कर सकता है (Main_Activity.java):

    @Override
    protected void onDestroy() {
        super.onDestroy();
        this.finish();
        exit(0);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        switch(keyCode)    {
            case KeyEvent.KEYCODE_BACK:
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("My application").setMessage("Keep playing?").setIcon(R.drawable.icon);
                // Go to backgroung
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { moveTaskToBack(true); }
                });
                // Exit from app calling protected void onDestroy()
                builder.setNegativeButton("CLOSE APPLICATION", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { onDestroy(); }
                });
                // Close this dialog
                builder.setNeutralButton("CANCEL", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { dialog.cancel(); }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
                return true;
        }
        return false;
    }

-2

यदि आप अपने आवेदन से बाहर निकलना चाहते हैं। फिर अपने बटन दबाए घटना के अंदर इस कोड का उपयोग करें। पसंद:

public void onBackPressed()
{
    moveTaskToBack(true);
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(1);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.