จะออกจากแอพ Android โดยใช้โปรแกรมได้อย่างไร?


93

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

ฉันยังต้องรู้ว่าActivity.moveTaskToBack(true)คุณสามารถเข้าสู่หน้าจอหลักได้ ตกลงนี่ไม่ใช่การปิด แต่เป็นเบื้องหลังกระบวนการ มันมีประสิทธิภาพหรือไม่?

ฉันควรใช้วิธีใดในการปิดแอปให้สมบูรณ์ มีคำอธิบายข้างต้นหรือวิธีการอื่นใด / การใช้วิธีการอื่น ๆ ข้างต้นหรือไม่?


ทำไมไม่ใช้แถบการทำงาน คลิกที่ไอคอนแอพไปที่หน้าจอหลัก คลิกปุ่มย้อนกลับเพื่อออก
Raghunandan

@Raghunandan: ดังที่ได้กล่าวไปแล้วความต้องการของลูกค้า :(
น้ำมะนาว

ตรวจสอบว่าสิ่งนี้ช่วย android.os.Process.killProcess (android.os.Process.myPid ()) หรือไม่
SANorton Stanley


คำตอบ:


71

จริงๆแล้วทุกคนกำลังมองหาการปิดแอปพลิเคชันในกิจกรรม onclick ไม่ว่าจะเป็นกิจกรรมใดก็ตาม ....

เพื่อน ๆ ลองใช้รหัสนี้ ใส่รหัสนี้ในเหตุการณ์ onclick

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
    homeIntent.addCategory( Intent.CATEGORY_HOME );
    homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
    startActivity(homeIntent); 

8
สิ่งนี้ไม่ได้ "ปิดแอปอย่างสมบูรณ์" อย่างที่ PeakGen ถามเนื่องจากแอปยังทำงานอยู่ แต่เป็นทางเลือกที่ดี
La masse

2
ฉันไม่คิดอย่างนั้น, ถ้ากิจกรรมที่เริ่มต้นด้วย FLAG ACTIVITY NEW TASK, วิธีนี้ไม่สามารถออกจากมันได้
fozua

51

คุณสามารถเรียก System.exit (); เพื่อออกจากความสามารถทั้งหมด

    submit=(Button)findViewById(R.id.submit);

            submit.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
android.os.Process.killProcess(android.os.Process.myPid());
                    System.exit(1);

                }
            });

5
เป็นเพียงการพาฉันไปที่กิจกรรมแรก
น้ำมะนาว

8
@AnchitMittal System.exit (1) จะไม่รับประกันการรีเซ็ตสแต็กกิจกรรมหรืองาน (ดูที่developer.android.com/guide/components/… ) ดังนั้นแนวทางนี้จึงไม่รับประกันการปิดแอปอย่างเหมาะสม (ทำลายกิจกรรมทั้งหมด) ในเวลาที่กำหนด
IgorGanapolsky

ไม่ใช่ทุกกิจกรรมที่จะออก
Jitendra

49

เมธอด finishAffinity เผยแพร่ใน API 16 ปิดกิจกรรมต่อเนื่องทั้งหมดและปิดแอป:

this.finishAffinity();

จบกิจกรรมนี้และกิจกรรมทั้งหมดที่อยู่ด้านล่างทันทีในงานปัจจุบันที่มีความสัมพันธ์เดียวกัน โดยทั่วไปจะใช้เมื่อแอปพลิเคชันสามารถเปิดใช้งานไปยังงานอื่นได้ (เช่นจาก ACTION_VIEW ของประเภทเนื้อหาที่เข้าใจ) และผู้ใช้ใช้การนำทางขึ้นเพื่อสลับออกจากงานปัจจุบันและเข้าสู่งานของตนเอง ในกรณีนี้หากผู้ใช้ไปยังกิจกรรมอื่น ๆ ของแอปพลิเคชันที่สองสิ่งเหล่านี้ควรถูกลบออกจากงานดั้งเดิมโดยเป็นส่วนหนึ่งของสวิตช์งาน

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


ตั้งแต่ API 21 คุณสามารถใช้:

finishAndRemoveTask();

เสร็จสิ้นกิจกรรมทั้งหมดในงานนี้และลบออกจากรายการงานล่าสุด

ทางเลือก:

getActivity().finish();
System.exit(0);


int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);


Process.sendSignal(Process.myPid(), Process.SIGNAL_KILL);


Intent i = new Intent(context, LoginActivity.class);
i.putExtra(EXTRA_EXIT, true);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(i);

ที่มา: วิธีออกจากแอปพลิเคชัน Android โดยทางโปรแกรม


หวังว่าจะช่วยได้! โชคดี!


2
อย่าใช้ System.exit () Android จะพยายามรีสตาร์ทแอปหลังจากออก คุณสามารถจบลงด้วยการวนซ้ำ
AndroidDev

42

หากคุณต้องการออกจากแอปพลิเคชันของคุณให้ใช้รหัสนี้ภายในเหตุการณ์ที่กดปุ่มของคุณ:

public void onBackPressed() {
  moveTaskToBack(true);
  android.os.Process.killProcess(android.os.Process.myPid());
  System.exit(1);
}

24
 @Override
    public void onBackPressed() {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setTitle("Exit Application?");
        alertDialogBuilder
                .setMessage("Click yes to exit!")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                moveTaskToBack(true);
                                android.os.Process.killProcess(android.os.Process.myPid());
                                System.exit(1);
                            }
                        })

                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        dialog.cancel();
                    }
                });

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }

4
อะไรคือความแตกต่างระหว่าง System.exit (1); และ System.exit (0);
Pyae Phyo

System.exit (1) หมายความว่าแอปเสร็จสิ้นโดยมีข้อผิดพลาดบางอย่างในขณะที่ System.exit (0) หมายความว่าแอปเสร็จสิ้นโดยไม่มีข้อผิดพลาดใด ๆ นี่คือวิธีที่คำสั่ง linux / unix ต่างๆส่งคืนเงื่อนไข (ข้อผิดพลาด) เมื่อออก
iOS-Coder


13

มีสองสถานการณ์ที่เป็นไปได้:

  1. คุณอาจต้องการออกจากกิจกรรม
  2. หรือคุณต้องการออกจากแอปพลิเคชัน

คุณสามารถออกจากกิจกรรมโดยใช้รหัสต่อไปนี้:

var intent = new Intent(Intent.ActionMain);
intent.AddCategory(Intent.CategoryHome);
intent.SetFlags(ActivityFlags.NewTask);
startActivity(intent);
finish();

แต่จะไม่ฆ่ากิจกรรมพื้นฐานในแอปพลิเคชันเดียวกัน นี่จะเป็นการย่อขนาดแอปพลิเคชัน

หากคุณต้องการออกจากแอปพลิเคชันให้ใช้รหัสต่อไปนี้เพื่อสิ้นสุดกระบวนการ:

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

สำหรับการพัฒนาแบบโมโนเพียงแค่ใช้

process.KillProcess(Process.MyPid());

Mypid () เป็นวิธีการของคุณหรืออะไร ...... ดังนั้นคุณจะเขียน Mypid ได้อย่างไร ... คุณต้องเขียนด้วยวิธีการ .....
Amitsharma

@amitsharma MyPid () เป็นวิธีการจากคลาส Process ซึ่งส่งคืนตัวระบุของกระบวนการนี้ซึ่งสามารถใช้ได้กับ killProcess (int) และ sendSignal (int, int)
Kasun

มันจะหยุดบริการพื้นหลังและเครื่องรับออกอากาศด้วยหรือจะปิดแอปอย่างปลอดภัย?
Usman Rana

แล้วอะไรคือความแตกต่างระหว่างandroid.os.Process.killProcess(android.os.Process.myPid()); และprocess.KillProcess(Process.MyPid());?
DysaniazzZ

7

เกี่ยวกับ this.finishAffinity()

จากเอกสาร

จบกิจกรรมนี้และกิจกรรมทั้งหมดที่อยู่ด้านล่างทันทีในงานปัจจุบันที่มีความสัมพันธ์เดียวกัน โดยทั่วไปจะใช้เมื่อแอปพลิเคชันสามารถเปิดใช้งานไปยังงานอื่นได้ (เช่นจาก ACTION_VIEW ของประเภทเนื้อหาที่เข้าใจ) และผู้ใช้ใช้การนำทางขึ้นเพื่อสลับออกจากงานปัจจุบันและเข้าสู่งานของตนเอง ในกรณีนี้หากผู้ใช้ไปยังกิจกรรมอื่น ๆ ของแอปพลิเคชันที่สองสิ่งเหล่านี้ควรถูกลบออกจากงานดั้งเดิมโดยเป็นส่วนหนึ่งของสวิตช์งาน โปรดทราบว่าการเสร็จสิ้นนี้ไม่อนุญาตให้คุณส่งผลลัพธ์ไปยังกิจกรรมก่อนหน้านี้และจะมีข้อยกเว้นเกิดขึ้นหากคุณพยายามทำเช่นนั้น



4

การดำเนินการนี้จะล้างงาน (กองกิจกรรม) และเริ่มงานใหม่

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
System.exit(1);

อธิบายว่าเหตุใดคุณจึงโพสต์รหัสนี้เพื่อเป็นคำตอบและทำอะไรด้วย
M. Adeel Khalid

1
ยินดีต้อนรับสู่ Stack Overflow! แม้ว่าคุณจะแก้ปัญหาของผู้ใช้รายนี้แล้ว แต่คำตอบแบบใช้รหัสเท่านั้นก็ไม่เป็นประโยชน์กับผู้ใช้ที่พบคำถามนี้ในอนาคต โปรดแก้ไขคำตอบของคุณเพื่ออธิบายว่าเหตุใดรหัสของคุณจึงแก้ปัญหาเดิมได้
Joe C

3
 @Override
    public void onBackPressed() {
        Intent homeIntent = new Intent(Intent.ACTION_MAIN);
        homeIntent.addCategory( Intent.CATEGORY_HOME );
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(homeIntent);
    }

2

ใส่อันนี้ลงใน onClic ของคุณ:

moveTaskToBack(true);
    finish()

มีอะไรผิดปกติกับการโหวตลดลง นี่คือคำตอบ ฉันได้รับ 2 กิจกรรมอย่างแรกคือการเข้าสู่ระบบและกิจกรรมที่ 2 คือการใช้งานหลัก .... ฉันต้องการออกจากแอปภายในการใช้งานหลักและไม่ต้องการกลับไปที่การเข้าสู่ระบบกิจกรรม ... ฉันใส่คำตอบนี้และตอนนี้ฉันสามารถปิดแอปได้ภายในการใช้งานหลัก
Azizi Musa

หากคุณทำเช่นนี้แอปพลิเคชันจะยังคงทำงานอยู่เบื้องหลัง
Mohanad Haddadin

ทำงานได้ดี กรณีของฉันคือ: splashActivity เรียกใช้ MainActivity เมื่อผู้ใช้กดกลับบนแอปพลิเคชัน MainActivity จะออกตามที่คาดไว้ กรณีอื่น ๆ ทั้งหมดให้ฉันกลับไปที่กิจกรรมสาด!
Jviaches

ทางที่ดีคุณควรจะได้ดำเนินการเสร็จสิ้นกิจกรรมการเข้าสู่ระบบโดยเร็วที่สุดเท่าเข้าสู่ระบบของสำเร็จรูป :) และคำตอบคือแน่นอนไม่ถูกต้องสมบูรณ์ , movewTaskToBackเสร็จสิ้นไม่มีอะไรก็แค่ซ่อน app และเป็นที่กล่าวถึงโดยคนอื่นเสร็จสิ้นเท่านั้นในปัจจุบันfinish activityดังนั้นมันจึงออกจากกิจกรรมปัจจุบันและซ่อนส่วนที่เหลือหากมีของขวัญ อย่างไรก็ตามมันไม่ควรได้รับการโหวตลงสำหรับสิ่งนี้ ...
แมวเหมียว 2012

2

ลองโทร. บางครั้งฉันใช้มันในการคลิกปุ่ม

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

แทนที่จะปิดแอปของคุณให้เปิดแดชบอร์ดเพื่อให้ดูเหมือนว่าแอปของคุณปิดอยู่

อ่านคำถามนี้เพื่อความชัดเจนยิ่งขึ้นสำหรับ Android - ออกจากรหัสแอปพลิเคชัน


2

ใช้ this.finishAffinity (); บนปุ่มนั้นแทนการเสร็จสิ้น (); หากไม่ได้ผลคุณสามารถลองโดยเพิ่ม android: noHistory = "true" ในไฟล์ Manifest ของคุณจากนั้นทำกิจกรรมของคุณให้เสร็จโดย uisng เสร็จสิ้น (); หรือ FinishAffinity ();

หวังว่าจะช่วย .... :)


2

บรรลุใน Xamarin Android:

    public override void OnBackPressed()
    {
        MoveTaskToBack(true);
        Process.KillProcess(Process.MyPid());
        Environment.Exit(1);
    }

นี่เป็นการอ้างอิงถึง System.Environment.Exit หรือ Android.OS.Environment.Exit?
Moffen

2

เพียงเรียกสองฟังก์ชันนี้

 finish();
 moveTaskToBack(true);

คำตอบของคุณมาจากโพสต์คุณภาพต่ำ โปรดให้คำอธิบายแม้ว่ารหัสของคุณจะอธิบายได้เองก็ตาม
Harsha Biyani

2
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
System.exit(1);

ใช้รหัสนี้ซึ่งมีประโยชน์มากและคุณสามารถออกจากกิจกรรมทั้งหมดได้


ฉันทำสิ่งนี้แล้วโยนโทรศัพท์จากชั้น 5 กิจกรรมทั้งหมดปิดขอบคุณ
Paschalis




1

หากยังมีคนสงสัยสำหรับXamarin Android (ในกรณีของฉันยังใช้ Monogame ด้วย) คำสั่งFinishAndRemoveTask()on Activityทำงานได้ดีมาก!



0

เพียงใช้รหัสใน backpress ของคุณ

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

0

หากคุณใช้EventBus (หรือผับ / ไลบรารีย่อยอื่น ๆ จริงๆ) ในแอปพลิเคชันของคุณเพื่อสื่อสารระหว่างกิจกรรมต่างๆคุณสามารถส่งเหตุการณ์ที่ชัดเจนได้:

final public class KillItWithFireEvent
{
    public KillItWithFireEvent() {}

    public static void send()
    {
        EventBus.getDefault().post(new KillItWithFireEvent());
    }
}

finish()ข้อเสียเดียวของที่นี่คือที่คุณต้องการกิจกรรมทั้งหมดที่จะรับฟังเหตุการณ์นี้จะเรียกพวกเขาเอง สำหรับสิ่งนี้คุณสามารถสร้างคลาสกิจกรรมชิมได้อย่างง่ายดายผ่านการสืบทอดซึ่งเพียงแค่ฟังเหตุการณ์นี้และปล่อยให้คลาสย่อยนำไปใช้อย่างอื่นจากนั้นตรวจสอบให้แน่ใจว่ากิจกรรมทั้งหมดของคุณสืบทอดมาจากเลเยอร์พิเศษนี้ ผู้ฟังที่ถูกฆ่าสามารถเพิ่มฟังก์ชันพิเศษบางอย่างผ่านการลบล้างเช่นหลีกเลี่ยงการตายในบางสถานการณ์


0

เพียงแค่เรียกใช้สองบรรทัดด้านล่างเมื่อคุณต้องการออกจากแอปพลิเคชัน

android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);

0
finish();
 finishAffinity();
 System.exit(0);

ทำงานให้ฉัน


1
โปรดเพิ่มคำอธิบายลงในโค้ดของคุณ นอกจากนี้ดูเหมือนว่าคำตอบอื่น ๆ จะครอบคลุมไปแล้วดังนั้นคุณควรอธิบายด้วยว่าอะไรทำให้โซลูชันของคุณดีกว่าคำตอบอื่น ๆ
Nico Haase

0

เพียงโทรสิ่งนี้:

finishAffinity();

แม้ว่ารหัสนี้อาจตอบคำถาม แต่การให้บริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีที่รหัสนี้ตอบคำถามช่วยเพิ่มมูลค่าในระยะยาว
Igor F.

0

เชื่อมโยงวิธีนี้กับปุ่มเลิก / ออกของคุณ

public void quitGame(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            finishAndRemoveTask();
        } else {
            finish();
        }
    }

-1

หากคุณใช้ทั้งเสร็จสิ้นและออกจากแอปของคุณจะปิดทันที

เสร็จสิ้น();

System.exit (0);

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