จะออกจากแอพพลิเคชั่นและแสดงหน้าจอหลักได้อย่างไร


196

ฉันมีแอปพลิเคชั่นอยู่ที่หน้าแรกฉันมีปุ่มสำหรับการนำทางผ่านแอปพลิเคชัน

ในหน้านั้นฉันมีปุ่ม "ออก" ซึ่งเมื่อคลิกควรนำผู้ใช้ไปที่หน้าจอหลักบนโทรศัพท์ที่มีไอคอนแอปพลิเคชันอยู่

ฉันจะทำสิ่งนั้นได้อย่างไร

คำตอบ:


327

การออกแบบของ Android ไม่สนับสนุนการออกจากแอปพลิเคชันโดยทางเลือก แต่เป็นการจัดการโดยระบบปฏิบัติการ คุณสามารถเรียกใช้แอปพลิเคชันหน้าแรกได้ตามความต้องการ

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

25
คุณสามารถใช้ .. "moveTaskToBack (true);"
hemanth kumar

17
มันจะจัดการทรัพยากรทั้งหมดหรือไม่ เพราะเมื่อฉันออกจากแอพด้วยวิธีนี้และหลังจากนั้นฉันก็คลิกที่ไอคอนแอพอีกครั้ง มันเริ่มจากที่ฉันทิ้งไว้ นั่นหมายความว่าแอปยังคงทำงานในพื้นหลัง
Adil Malik

12
Activity.finish ();
hB0

11
สิ่งนี้ทำให้แอปของคุณอยู่ในพื้นหลังดังนั้นจึงไม่ออกจากแอปพลิเคชัน
Herman Schoenfeld

3
คำตอบนี้จะทำให้หน้าจอหลักปรากฏขึ้นและจะไม่ออก / ปิดแอปพลิเคชันโดยสมบูรณ์ตามที่ OP ต้องการ
Basher51

74

อาจจะลองแบบนี้ก็ได้

สมมติว่าในใบสมัครของเราเรามีหลายกิจกรรม (พูดสิบ) และเราจำเป็นต้องออกจากกิจกรรมนี้โดยตรง สิ่งที่เราสามารถทำได้คือสร้างเจตนาและไปที่กิจกรรมรูทและตั้งค่าสถานะในเจตนาเป็น

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

เพิ่มบูลีนพิเศษบางอย่างลงในเจตนาเช่นเดียวกัน

intent.putExtra("EXIT", true);

จากนั้นในกิจกรรมรูทให้ตรวจสอบค่าของbooleanและตามการเสร็จสิ้นการโทรนั้น () ในonCreate()กิจกรรมรูท

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

1
เพียงแค่ไม่ทำอะไรเลยใน onCreate เพื่อเรียกใช้เสร็จสิ้น
imcaptor

2
ในกรณีของฉันฉันต้องแทนที่onNewIntentด้วย เนื่องจาก intnet.getExtras () ยังคงเป็นโมฆะ
zznq

และวิธีนี้จะรีสตาร์ทของคุณRootActivityแทนที่จะกลับมาทำงานต่อจากสแต็ค ตรวจสอบที่นี่เพื่อเอาชนะstackoverflow.com/a/26258455/609782
Darpan

29
System.exit(0);

อาจเป็นสิ่งที่คุณกำลังมองหา มันจะปิดแอปพลิเคชันทั้งหมดและนำคุณไปที่หน้าจอหลัก


1
ควรเป็นทางออกตัวพิมพ์เล็กหรือไม่
Carol

1
ควรเป็น System.exit (0) แต่มันก็ไม่มีประโยชน์อะไรเลย
superarts.org

7
ไม่ควรใช้ System.exit (0) ตามที่ทีม Android หลักแนะนำ
Dinesh Venkata

2
ฉันคิดว่านี่เป็นวิธีที่ดีที่สุดสำหรับสถานการณ์พิเศษ พูดถึงแอพที่ต้องการอินเทอร์เน็ตและการเชื่อมต่อแบ่งกิจกรรมบางอย่างเข้าในแอพ กล่องโต้ตอบการแจ้งเตือนสามารถแสดง (ไม่มีปุ่ม) ปุ่มย้อนกลับจำเป็นต้องออกจากแอพทั้งหมดเนื่องจากต้องใช้การเข้าสู่ระบบ / การเริ่มต้นใหม่อีกครั้ง System.exit เป็นสิ่งเดียวที่ทำงานได้อย่างสมเหตุสมผลที่ฉันพบ ไม่แน่ใจเกี่ยวกับความคิดเห็น @ user1699548
Herman Schoenfeld

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
    }

สิ่งนี้ไม่ได้ผลสำหรับฉัน มันทำให้แอปของฉันไม่ปรากฏให้เห็น แต่ยังคงใช้งานได้บ้าง ฉันสามารถดูเธรดที่แขวนอยู่รอบ ๆ และรอในดีบักเกอร์ที่จะไม่ทำอะไรเลย
Stephen M -on strike-

23

เสร็จสิ้นการสมัครของคุณโดยใช้วิธีการ finish();

จากนั้นเพิ่มบรรทัดด้านล่างใน onDestroy สำหรับการลบกำลังปิด

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

3
อย่าใช้สิ่งนี้เพราะจะไม่มีโอกาสได้รับทรัพยากรฟรี
Jacky

1
-1 เนื่องจาก onDestroy ถูกดำเนินการทุกครั้งที่คุณออกจากกิจกรรมไม่เพียง แต่เมื่อกดปุ่มย้อนกลับ
Hamzeh Soboh

5
@ แจ็คกี้: และวิธีการฆ่ากระบวนการไม่ฟรีทรัพยากรระบบใด ๆ
Herman Schoenfeld

1
ทำไมต้องเป็นsuper.onDestroy()หลังจากที่killProcess()? บรรทัดนี้จะถึงหรือไม่
shoosh

ไม่เช่นนั้นจะฆ่าบริการทั้งหมดของคุณด้วยหรือไม่
Irshu

20

finish()หากคุณต้องการที่จะจบกิจกรรมที่คุณก็สามารถโทร อย่างไรก็ตามเป็นวิธีที่ไม่ดีที่จะมีปุ่มออกบนหน้าจอ


2
ฉันใช้มันสำหรับ "คุณต้องอัปเดตแอปนี้เป็นเวอร์ชันล่าสุด" และฉันไม่ต้องการให้พวกเขาใช้มันต่อไป ยังคงปฏิบัติไม่ดี ...
beetree

@beetree ใช่ เช่นเดียวกับการปฏิบัติที่ไม่ดีมีหลายกรณีที่มันเป็นตัวเลือกเดียวของคุณและคุณใช้มันเพราะการพยายามทำอย่างอื่นจะไร้สาระ ประเด็นก็คือการปฏิบัติที่ไม่ดีซึ่งตรงข้ามกับไวยากรณ์ที่ผิดกฎหมายก็คือมันสามารถใช้ได้สำหรับบางกรณีเหล่านั้น แต่คุณควรลอง darndest ของคุณเพื่อหาวิธีที่ดีกว่าที่จะทำมัน ในกรณีของคุณไม่มี
คดีฟ้องร้องกองทุนโมนิก้า

17

บางกิจกรรมคุณไม่ต้องการเปิดอีกครั้งเมื่อกดปุ่มย้อนกลับเช่นกิจกรรมหน้าจอ Splash, กิจกรรมหน้าจอต้อนรับ, Windows ยืนยัน จริงๆแล้วคุณไม่ต้องการสิ่งนี้ในกิจกรรมสแต็ก คุณสามารถทำได้โดยใช้ => เปิดไฟล์ manifest.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: การกดปุ่มโฮมไม่เคยออกจากแอปพลิเคชัน Android แต่มันกลับไปเป็นแบ็คกราวน์ ...
Jayesh

5

(ฉันลองคำตอบก่อนหน้านี้ แต่พวกเขาขาดในบางจุดตัวอย่างเช่นถ้าคุณไม่ทำreturn;กิจกรรมหลังจากเสร็จสิ้นรหัสกิจกรรมที่เหลือยังทำงานอยู่คุณต้องแก้ไข onCreate ด้วยผลตอบแทนถ้าคุณไม่เรียกใช้ super.onCreate () คุณจะได้รับข้อผิดพลาด runtime)

สมมติว่าคุณมีและMainActivityChildActivity

Inside 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's onCreate เพิ่มสิ่งนี้:

@Override
public void onCreate(Bundle savedInstanceState) {

    mContext = getApplicationContext();

    super.onCreate(savedInstanceState);

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


3

เมื่อคุณโทรเสร็จสิ้น onDestroy () ของกิจกรรมนั้นจะถูกเรียกและมันจะกลับไปที่กิจกรรมก่อนหน้าในกิจกรรมสแต็ก ... ดังนั้น .. สำหรับทางออกอย่าโทรเสร็จสิ้น ();


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);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.