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


321

ฉันพบรหัสบางอย่างสำหรับออกจากแอปพลิเคชัน Android โดยทางโปรแกรม การเรียกรหัสใดรหัสหนึ่งต่อไปนี้ใน onDestroy () จะเป็นการออกจากแอปพลิเคชันทั้งหมดหรือไม่

  1. System.runFinalizersOnExit(true)
    (หรือ)
  2. android.os.Process.killProcess(android.os.Process.myPid());

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


มีโพสต์มากมายแล้วที่นี่ stackoverflow.com/search?q=how+to+exit+an+android+app
Mudassir

2
ความเป็นไปได้ที่ซ้ำกันของการออกจากแอปพลิเคชัน
CommonsWare

ใช้ 'System.exit (0);' เมื่อคุณต้องการออกจากแอป ฉันได้ทำเช่นนั้นในข้อผิดพลาดที่ไม่สามารถกู้คืนได้หลังจากแสดงข้อความให้กับผู้ใช้ หากคุณต้องการคุณสามารถเปิดใช้งานแอพ AlarmManager ใหม่ได้โดยอัตโนมัติ ดู: blog.janjonas.net/2010-12-20/...
บางคน

คำตอบ:


397

ตั้งแต่ API 16 คุณสามารถใช้วิธี finishAffinity ซึ่งดูเหมือนว่าใกล้เคียงกับการปิดกิจกรรมที่เกี่ยวข้องทั้งหมดด้วยชื่อและคำอธิบาย Javadoc:

this.finishAffinity();

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

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


ตั้งแต่ API 21คุณสามารถใช้คำสั่งที่คล้ายกันมาก

finishAndRemoveTask();

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


28
แน่นอนนี่คือคำตอบที่ถูกต้อง! System.exit(0);มันไม่ได้เป็นทางออกที่ดีที่จะเสร็จสิ้นการใช้แอป ขอบคุณสำหรับคำตอบ! ในที่สุดฉันก็พบทางออกที่ดี
อันโตนิโอ

4
คุณรู้หรือไม่ว่ามีวิธีแก้ไขปัญหาอื่นใน API 14 ขอบคุณ
คิตตี้สคริปต์

2
คุณสามารถเสร็จสิ้น () แต่ละกิจกรรมเป็นรายบุคคลไม่ว่าคุณจะปิดแอพหรือภายในวงจรกิจกรรม
sivi

3
คำเตือน! this.finishAffinity () ปิดแอปที่นำแอปออกจากหน่วยความจำดังนั้นคุณจะไม่ได้รับข้อความพุช
Tincho825

7
วิธีนี้ใช้ได้ผล 99% ของกรณี อย่างไรก็ตามมันจะไม่ทำลายกระบวนการดังนั้นตัวอย่างเช่น Dagger จะไม่ถูกล้างออก ในกรณีที่หายากเหล่านั้นซึ่งจำเป็นต้องSystem.exit(0)มีการฆ่ากระบวนการนั้นเป็นทางออกเดียวที่เหมาะกับฉัน
สลาฟ

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

นี่เป็นวิธีที่ดีที่สุดในการออกจากแอพของคุณ !!!

ทางออกที่ดีที่สุดสำหรับฉัน


ใช่ใช้งานได้ดี! ต้องเรียกสิ่งนี้จาก MainActivity เพื่อให้มันใช้งานได้!
mz87

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

โซลูชั่นที่สมบูรณ์แบบจริงๆ แก้ไขปัญหามากมาย ขอบคุณ
superuserdo

26
ฉันไม่คิดว่านี่เป็นทางออกที่ดี คุณoughtn'tSystem.exit(0);จบโปรแกรมของคุณโดยใช้ ทางออกที่เหมาะสมถูกโพสต์โดย @sivi (คำตอบของเขาอยู่เหนือ)
อันโตนิโอ

13
นี่ไม่ใช่วิธีแก้ปัญหามันไม่ทำงานหากคุณมีกิจกรรมหลายอย่าง
user3290180

46

finishAffinity();

System.exit(0);

หากคุณจะใช้เฉพาะเมื่อfinishAffinity();ไม่มีSystem.exit(0);แอปพลิเคชันของคุณจะเลิก แต่หน่วยความจำที่จัดสรรไว้จะยังคงใช้งานอยู่ในโทรศัพท์ของคุณดังนั้น ... หากคุณต้องการแอปที่สะอาดและเลิกใช้งานจริงๆให้ใช้ทั้งสองอย่าง

นี่เป็นวิธีที่ง่ายที่สุดและทำงานได้ทุกที่ออกจากแอปจริงคุณสามารถมีกิจกรรมจำนวนมากที่เปิดอยู่จะยังคงเลิกทั้งหมดโดยไม่มีปัญหา

ตัวอย่างในการคลิกปุ่ม

public void exitAppCLICK (View view) {

    finishAffinity();
    System.exit(0);

}

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

// alertdialog for exit the app
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);

// set the title of the Alert Dialog
alertDialogBuilder.setTitle("your title");

// set dialog message
alertDialogBuilder
        .setMessage("your message")
        .setCancelable(false)
        .setPositiveButton("YES"),
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                                        int id) {
                        // what to do if YES is tapped
                        finishAffinity();
                        System.exit(0);
                    }
                })

        .setNeutralButton("CANCEL"),
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                                        int id) {
                        // code to do on CANCEL tapped
                        dialog.cancel();
                    }
                })

        .setNegativeButton("NO"),
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                                        int id) {
                        // code to do on NO tapped
                        dialog.cancel();
                    }
                });

AlertDialog alertDialog = alertDialogBuilder.create();

alertDialog.show();

3
นี่คือคำตอบที่ถูกต้องฉันกำลังมองหา ขอบคุณ
driftwood

ถ้าฉันใช้งาน FCM หรืองานพื้นหลังในแอพของฉันฉันจะไม่มีปัญหา
roghayeh hosseini

นี่คือสิ่งที่ฉันต้องการเพื่อล้างแอปพลิเคชันจากหน่วยความจำ
A1m

โปรดอย่าใช้System.exit(0);คุณไม่ควรปล่อยให้หน่วยความจำว่างระบบจะจัดการให้คุณถ้าจำเป็น นี่คือพฤติกรรมที่ตั้งใจไว้
crgarridos

30

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

มิฉะนั้นถ้าคุณแน่ใจจริงๆใช้

finish();

เป็นปฏิกิริยาต่อความคิดเห็นของ @dave appleton: สิ่งแรกที่อ่านคำถาม / คำตอบใหญ่ ๆ @gabriel ที่โพสต์: การเลิกสมัครแอปพลิเคชันที่ขมวดคิ้วอยู่หรือไม่?

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

  1. คุณต้องการให้ผู้ใช้ออกจากทุกสิ่งเนื่องจากการใช้หน่วยความจำและ "ไม่ทำงานในพื้นหลังหรือไม่ Doubtfull ให้ผู้ใช้หยุดกิจกรรมบางอย่างในพื้นหลัง แต่ปล่อยให้ระบบปฏิบัติการฆ่าสิ่งที่ไม่จำเป็น
  2. คุณต้องการให้ผู้ใช้ไม่ไปที่กิจกรรมก่อนหน้าของแอพของคุณหรือไม่ ทั้งกำหนดค่ามันจึงไม่หรือคุณต้องการตัวเลือกพิเศษ หากส่วนใหญ่กิจกรรม back = ก่อนหน้านี้ใช้งานได้ผู้ใช้จะไม่กดกลับบ้านหากเขา / เธอต้องการทำอย่างอื่นหรือไม่?
  3. หากคุณต้องการการตั้งค่าใหม่คุณสามารถค้นหาว่าแอปพลิเคชันของคุณถูกเลิกหรือไม่และหากกิจกรรมของคุณได้รับการโฟกัสอีกครั้งคุณสามารถดำเนินการกับสิ่งนั้นโดยแสดงหน้าจอใหม่แทนการรีสตาร์ทตำแหน่งของคุณ

ดังนั้นในตอนท้ายของหลักสูตรfinish()ไม่ได้ฆ่าทุกอย่าง แต่มันก็เป็นเครื่องมือที่คุณต้องการ หากมี usecase สำหรับ "kill all activities" ฉันยังไม่พบ


30
การโทรfinish()จะไม่ฆ่าแอปพลิเคชัน finish()มีการใช้งานตลอดเวลา: Call this when your activity is done and should be closed.มีผลเหมือนกับการกดปุ่ม "ย้อนกลับ"
แทนเนอร์ Perrien

เสร็จสิ้นจะฆ่ากิจกรรม สิ่งนี้แตกต่างจากการฆ่าแอปพลิเคชันอย่างไร
Nanne

ไม่มีอะไรผิดปกติกับ "การตกแต่ง" หรือ "การฆ่า" Activity(ไม่ใช่Application) ตัวอย่างเช่นคุณอาจเริ่มกิจกรรมใหม่เพื่อแสดงข้อมูลบางอย่างให้ผู้ใช้ หลังจากหมดเวลาหรือกด 'ตกลง' คุณอาจโทรfinish()เพื่อกลับไปที่กิจกรรมการโทร
แทนเนอร์ Perrien

42
แอปพลิเคชัน Android ส่วนใหญ่มีกิจกรรมมากกว่าหนึ่งกิจกรรม
CommonsWare

4
@Nanne - หน้าจอล็อคเป็นตัวอย่างเมื่อคุณต้องการหยุดกิจกรรมทั้งหมด สมมติว่าคุณเข้าสู่แอพธนาคาร หลังจากระยะเวลาหนึ่งโดยไม่มีการโต้ตอบจากผู้ใช้หน้าจอล็อคจะเปิดขึ้น คุณจะต้องหยุดกิจกรรมทั้งหมดถ้ามีคนกดปุ่มย้อนกลับจากหน้าจอล็อค!
Jabari

19

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


2
ฉันเห็นด้วยกับกรณีการใช้งานนี้ทั้งหมด พิจารณาแอปที่ปลอดภัยของฉันที่จะต้องมีในบางตำแหน่งและควรปิดหากผู้ใช้ไม่อยู่ในตำแหน่งนั้น ฉันจะทำอย่างไร
Sydwell

18

สร้างExitActivityและประกาศในรายการ และโทรExitActivity.exit(context)ออกจากแอป

public class ExitActivity extends AppCompatActivity {

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

    public static void exit(Context context) {
        Intent intent = new Intent(context, ExitActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        context.startActivity(intent);
    }

}

นี่คือคำตอบที่ได้รับการโหวตมากที่สุดอย่างไรก็ตามเป็นแฮ็ค การโทรจนจบใน onCreate จะดูมีปัญหามากที่สุดหากไม่ใช่อุปกรณ์ทั้งหมด
DoruChidean

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

1
อย่าลืมประกาศคลาสนี้ในไฟล์ Manifest ของคุณ +1 สำหรับแฮ็คที่ฉลาด
Taslim Oseni

สิ่งนี้ได้ผล! โหวตแล้ว
TuanDPH

17

ไม่มีแอปพลิเคชั่นหยุดทำงานใน Android , SampleActivity.this.finish (); จะเสร็จสิ้นกิจกรรมปัจจุบัน

เมื่อคุณสลับจากกิจกรรมหนึ่งไปอีกกิจกรรมหนึ่งให้ทำกิจกรรมก่อนหน้าให้เสร็จ

Intent homeintent = new Intent(SampleActivity.this,SecondActivity.class);
startActivity(homeintent);
SampleActivity.this.finish();

13

ก่อนอื่นวิธีนี้ต้องใช้ขั้นต่ำ Api 16

ฉันจะแบ่งการแก้ปัญหานี้เป็น 3 ส่วนเพื่อแก้ปัญหานี้อย่างกว้างขวางยิ่งขึ้น

1.หากคุณต้องการออกจากแอปพลิเคชันในกิจกรรมให้ใช้ข้อมูลโค้ดนี้:

if(Build.VERSION.SDK_INT>=16 && Build.VERSION.SDK_INT<21){
    finishAffinity();
} else if(Build.VERSION.SDK_INT>=21){
    finishAndRemoveTask();
}

2.หากคุณต้องการออกจากแอปพลิเคชันในคลาสที่ไม่ใช่กิจกรรมซึ่งมีการเข้าถึงกิจกรรมให้ใช้ข้อมูลโค้ดนี้:

if(Build.VERSION.SDK_INT>=16 && Build.VERSION.SDK_INT<21){
    getActivity().finishAffinity();
} else if(Build.VERSION.SDK_INT>=21){
    getActivity().finishAndRemoveTask();
}

3.หากคุณต้องการออกจากแอปพลิเคชั่นในคลาสที่ไม่ใช่กิจกรรมและไม่สามารถเข้าถึงกิจกรรมเช่นบริการฉันแนะนำให้คุณใช้ BroadcastReceiver คุณสามารถเพิ่มวิธีนี้ให้กับกิจกรรมทั้งหมดของคุณในโครงการของคุณ

สร้างตัวแปรอินสแตนซ์ LocalBroadcastManager และ BroadcastReceiver คุณสามารถแทนที่ getPackageName () + ". closeapp" ได้ถ้าต้องการ

LocalBroadcastManager mLocalBroadcastManager;
BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(intent.getAction().equals(getPackageName()+".closeapp")){
            if(Build.VERSION.SDK_INT>=16 && Build.VERSION.SDK_INT<21){
                finishAffinity();
            } else if(Build.VERSION.SDK_INT>=21){
                finishAndRemoveTask();
            }
        }
    }
};

เพิ่มไปยังวิธี onCreate () ของกิจกรรม

mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
IntentFilter mIntentFilter = new IntentFilter();
mIntentFilter.addAction(getPackageName()+".closeapp");
mLocalBroadcastManager.registerReceiver(mBroadcastReceiver, mIntentFilter);

นอกจากนี้อย่าลืมเรียกผู้รับยกเลิกการลงทะเบียนที่วิธี onDestroy () ของกิจกรรม

mLocalBroadcastManager.unregisterReceiver(mBroadcastReceiver);

สำหรับแอปพลิเคชันออกคุณต้องส่งการออกอากาศโดยใช้ LocalBroadcastManager ซึ่งฉันใช้ในคลาส PlayService ซึ่งขยายบริการ

LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(PlayService.this);
localBroadcastManager.sendBroadcast(new Intent(getPackageName() + ".closeapp"));

10

คุณสามารถใช้finishAndRemoveTask ()จาก API 21

โมฆะสาธารณะ finishAndRemoveTask ()

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


8

ขึ้นอยู่กับว่าคุณต้องการปิดแอปเร็วแค่ไหน

วิธีที่ปลอดภัยในการปิดแอปของคุณคือfinishAffinity ();

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

หากคุณต้องการแน่ใจว่าแอปของคุณถูกปิดใช้งานอย่างสมบูรณ์ System.exit (0) อย่างสมบูรณ์;

นี่จะปิดแอปของคุณทันที แต่เป็นไปได้ว่าคุณสร้างความเสียหายไฟล์ที่แอปของคุณเปิดอยู่หรือการแก้ไขการตั้งค่าที่แชร์ไม่เสร็จสิ้น ดังนั้นใช้อย่างระมัดระวัง

หากคุณใช้ watchdog ร่วมกับงานที่ต้องใช้เวลานานคุณจะเห็นอิทธิพลของวิธีการต่าง ๆ

new ANRWatchDog(2000).setANRListener(new ANRWatchDog.ANRListener() {
    public void onAppNotResponding(ANRError error) {
        MainActivity.this.finishAffinity();
        System.exit(0);
    }
}).start();
for(int i = 0; i < 10; ++i){
    --i;
}

วิธีนี้จะฆ่าแอปของคุณหลังจาก 2 วินาทีโดยไม่แสดงกล่องโต้ตอบ ANR หรืออะไรทำนองนั้น หากคุณลบSystem.exit (0)ให้เรียกใช้รหัสนี้และเริ่มต้นแอปใหม่หลังจากปิดแล้วคุณจะพบกับพฤติกรรมแปลก ๆ เนื่องจากการวนซ้ำไม่รู้จบยังคงทำงานอยู่


8

คุณมีใช้ดีกว่าfinish()ถ้าคุณอยู่ในActivityหรือถ้าคุณอยู่ใน getActivity().finish()Fragment

หากคุณต้องการออกจากแอปโดยสมบูรณ์ให้ใช้:

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

6

วิธีที่ง่ายและสะดวกในการออกจากแอปพลิเคชัน

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

นี่เพิ่งนำหน้าจอหลักหรือฆ่าแอปจริงๆหรือ
rpattabi

6

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

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        getActivity().finishAffinity();
    } else{
        getActivity().finish();
        System.exit( 0 );
    }

5

ฉันคิดว่าสิ่งที่คุณกำลังมองหาคือสิ่งนี้

activity.moveTaskToBack(Boolean nonRoot);



4

ฉันไม่แน่ใจว่าสิ่งนี้ขมวดคิ้วหรือไม่ แต่นี่เป็นวิธีที่ฉันทำ ...

ขั้นตอนที่ 1 -ฉันมักจะมีชั้นเรียนที่มีวิธีการและตัวแปรที่ฉันต้องการเข้าถึงทั่วโลก ในตัวอย่างนี้ฉันจะเรียกมันว่าคลาส "แอพ" สร้างตัวแปรกิจกรรมแบบคงที่ภายในคลาสสำหรับแต่ละกิจกรรมที่แอปของคุณมี แล้วสร้างวิธีคงเรียกว่า "ปิด" ที่จะเรียกใช้finish()วิธีการในแต่ละตัวแปรกิจกรรมเหล่านั้นถ้าพวกเขาจะไม่เป็นโมฆะ หากคุณมีกิจกรรมหลัก / กิจกรรมหลักให้ปิดกิจกรรมล่าสุด:

public class App
{
    ////////////////////////////////////////////////////////////////
    // INSTANTIATED ACTIVITY VARIABLES
    ////////////////////////////////////////////////////////////////

        public static Activity activity1;
        public static Activity activity2;
        public static Activity activity3;

    ////////////////////////////////////////////////////////////////
    // CLOSE APP METHOD
    ////////////////////////////////////////////////////////////////

        public static void close()
        {
            if (App.activity3 != null) {App.activity3.finish();}
            if (App.activity2 != null) {App.activity2.finish();}
            if (App.activity1 != null) {App.activity1.finish();}
        }
}

ขั้นตอนที่ 2 -ในแต่ละกิจกรรมของคุณแทนที่onStart()และonDestroy()วิธีการ ในonStart()ตั้งค่าตัวแปรสแตติกในคลาสแอพของคุณเท่ากับ " this" ในตั้งเท่ากับonDestroy() nullตัวอย่างเช่นในคลาส "Activity1":

@Override
public void onStart()
{
    // RUN SUPER | REGISTER ACTIVITY AS INSTANTIATED IN APP CLASS

        super.onStart();
        App.activity1 = this;
}

@Override
public void onDestroy()
{
    // RUN SUPER | REGISTER ACTIVITY AS NULL IN APP CLASS

        super.onDestroy();
        App.activity1 = null;
}

ขั้นตอนที่ 3 -เมื่อคุณต้องการปิดแอพเพียงโทรApp.close()จากที่ใดก็ได้ กิจกรรมอินสแตนซ์ทั้งหมดจะปิดลง! เนื่องจากคุณเป็นเพียงการปิดกิจกรรมและไม่ฆ่าแอป (เช่นในตัวอย่างของคุณ) Android มีอิสระที่จะเข้ามาแทนที่และทำการล้างข้อมูลที่จำเป็น

อีกครั้งฉันไม่ทราบว่าสิ่งนี้จะขมวดคิ้วด้วยเหตุผลใดก็ตาม ถ้าเป็นเช่นนั้นฉันชอบที่จะอ่านความคิดเห็นเกี่ยวกับสาเหตุและวิธีการปรับปรุง!


น่าสนใจฉันก็จะสนใจสิ่งที่นักพัฒนา Android คนอื่น ๆ คิดด้วย
ฤดี Kershaw

4
โดยการอ้างอิงถึงกิจกรรมของคุณคุณกำลังรั่วหน่วยความจำจริง ๆ ! ดูสิ่งนี้สำหรับการสนทนาในเชิงลึก
Managarm

@Managarm หลักฐานเบื้องหลังการโพสต์นั้นคือตัวแปรแบบคงที่จะยังคงอยู่แม้หลังจากกระบวนการ (ในกรณีนี้กิจกรรม) ถูกทำลาย ถ้าการทำความสะอาดบ้านที่เหมาะสมทำได้แม้ว่าจะไม่ใช่ปัญหา ... ดังนั้นเหตุผลที่ฉันลบล้างการอ้างอิงในวิธีการ onDestroy () ของกิจกรรม
Jabari

@ Jabari อ่าฉันพลาดส่วนที่ทำลาย ในกรณีนี้ไม่ควรมีปัญหาแม้ว่าจะไม่ใช่วิธีปฏิบัติที่ดีที่สุด
Managarm

1
ทำงานได้โดยไม่มีปัญหาใด ๆ สำหรับการapi>=16ใช้งานfinishAffinity()อื่นใช้วิธีนี้
Mr. Nobody

4

เลิกใช้แอปพลิเคชันที่ขมวดคิ้วอยู่หรือไม่ . ผ่านลิงค์นี้ มันตอบคำถามของคุณ ระบบทำการฆ่าแอปพลิเคชัน

สมมติว่าคุณมีสองกิจกรรม A และ B. คุณนำทางจาก A ถึง B เมื่อคุณคลิกปุ่มย้อนกลับกิจกรรมของคุณ B จะเกิดขึ้นที่แบ็คสแต็คและทำลาย กิจกรรมก่อนหน้านี้ในกิจกรรมสแต็กหลัง A โฟกัส

คุณควรปล่อยให้ระบบตัดสินใจเมื่อจะฆ่าแอปพลิเคชัน

โมฆะสาธารณะ finish()

เรียกสิ่งนี้เมื่อกิจกรรมของคุณเสร็จสิ้นและควรจะปิด

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


3

ในการออกจากแอปพลิเคชันคุณสามารถใช้สิ่งต่อไปนี้:

getActivity().finish();
Process.killProcess(Process.myPid());
System.exit(1);

นอกจากนี้เมื่อต้องการหยุดบริการเรียกวิธีต่อไปนี้ด้วย:

private void stopServices() {        
    final ActivityManager activityManager = SystemServices.getActivityManager(context);
    final List<ActivityManager.RunningServiceInfo> runningServices = activityManager.getRunningServices(Integer.MAX_VALUE);
    final int pid = Process.myPid();
    for (ActivityManager.RunningServiceInfo serviceInfo : runningServices) {
        if (serviceInfo.pid == pid && !SenderService.class.getName().equals(serviceInfo.service.getClassName())) {
            try {
                final Intent intent = new Intent();
                intent.setComponent(serviceInfo.service);
                context.stopService(intent);
            } catch (SecurityException e) { 
                 // handle exception
            }
        }
    }
}

2

อาจจะช้าและเป็นไปตามแนวทางที่คุณไม่ควรจัดการกับกระบวนการวงจรชีวิตด้วยตัวเอง (เช่นเดียวกับระบบปฏิบัติการที่ทำเพื่อคุณ) ข้อเสนอแนะคือให้คุณลงทะเบียนเครื่องรับสัญญาณออกอากาศในกิจกรรมทั้งหมดของคุณด้วย " finish()" ในรายการonReceive() & เมื่อใดก็ตามที่คุณต้องการออกคุณสามารถผ่านเจตนาง่าย ๆ ที่ระบุว่ากิจกรรมทั้งหมดจะต้องปิดตัวลง ..... แม้ว่าจะแน่ใจว่าคุณทำ " ยกเลิกการลงทะเบียน "ผู้รับในonDestroy()วิธีการของคุณ


1

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


4
ออกจากระบบของแอปพลิเคชันจะต้องฆ่าแอป ดังนั้นควรมีวิธีที่จะทำให้แอปถูกฆ่าหลังจากออกจากระบบ
anonim

1

ทางออกที่ถูกต้องและแน่นอนในการออกจากแอพเมื่อคลิกปุ่มใช้รหัสด้านล่าง:

// เมื่อกดปุ่มย้อนกลับเหตุการณ์

public void onBackPressed()
{ 
   moveTaskToBack(true);
   finish();
}

นี้ค่อนข้างองค์ประกอบ Android ปัจจุบัน (เช่นกิจกรรม) ไม่ใช่ทั้งแอป
Laogeodritt

สิ่งนี้จะส่งแอปในพื้นหลังเท่านั้น
Kumar Gaurav

1

หากคุณใช้ Kotlin วิธีที่เหมาะสมในการออกจากแอพและทางเลือกอื่นSystem.exit()เป็นวิธีการในตัว

exitProcess(0)

ดูเอกสาร

หมายเลข0เป็นพารามิเตอร์หมายถึงการออกมีไว้และไม่มีข้อผิดพลาดเกิดขึ้น




0

วิธีที่ง่ายที่สุดที่ฉันพบว่าออกจากแอปพลิเคชันจากกิจกรรมโดยไม่ทำให้ตรรกะของ Android ผิดปกติและไม่ต้องเพิ่มโค้ดเพิ่มเติมในกิจกรรมที่มีอยู่และการส่งผ่านสิ่งพิเศษคือ:

public static void quitApplication (Activity currentActivity) {
    Intent intent = new Intent (currentActivity, QuitApplicationActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

    currentActivity.startActivity (intent);
    currentActivity.finish ();
}

สิ่งQuitApplicationActivityมีชีวิต:

public class QuitApplicationActivity extends AppCompatActivity {

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

        finish ();
    }
}

0

คำตอบของ @Sivi ปิดแอป แต่เมื่อกลับมาถ้าคุณมีกิจกรรมเด็กกิจกรรมอื่นที่ยังไม่เสร็จอาจเปิดได้ ฉันเพิ่มnoHistory:trueในกิจกรรมของฉันเพื่อให้แอปเริ่มกลับมาจาก MainActivity

<activity 
      android:name=".MainActivity"
      android:noHistory="true">
</activity>

0

เพียงเพิ่มวิธีหนึ่งในรายการวิธีการที่โหดร้ายในการยกเลิกแอป:

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


Process.killProcess(Process.myPid())ทำเช่นเดียวกัน แต่สั้นกว่า
ivan8m8

-1

คุณสามารถออกจากแอปแบบเต็ม ดังนั้น

Intent intent = getBaseContext().getPackageManager()
             .getLaunchIntentForPackage(getBaseContext().getPackageName());
intent .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

มันจะทำงานได้ 100% ขอให้โชคดี!


1
ดูเหมือนจะไม่ได้คำตอบสำหรับคำถามนี้!
Al-Mothafar

-4

เพียงใช้เสร็จสิ้น () ที่ปุ่มย้อนกลับกดปุ่มกด ()


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