2025-07-14 23:59:50 高清世界杯直播

概述

在 Android 开发中,有多种方法可以退出应用程序

但是,Android 的设计理念不鼓励开发者主动退出应用,而是让系统管理应用生命周期,强制退出可能导致不良用户体验

一、使用 finish 方法

1、基本介绍

在 Activity 中调用 finish 方法,关闭当前 Activity

2、演示

Button btnExit = findViewById(R.id.btn_exit);

btnExit.setOnClickListener(view -> {

finish();

});

二、使用 System.exit 方法

1、基本介绍

调用 System.exit 方法,强制终止当前进程

2、演示

Button btnExit = findViewById(R.id.btn_exit);

btnExit.setOnClickListener(view -> {

System.exit(0);

});

三、使用 Process.killProcess 方法

1、基本介绍

调用 Process.killProcess 方法,强制终止当前进程

2、演示

Button btnExit = findViewById(R.id.btn_exit);

btnExit.setOnClickListener(view -> {

Process.killProcess(Process.myPid());

});

四、关闭所有 Activity 并退出应用

1、基本介绍

在其他地方保存所有 Activity 引用,退出应用时统一关闭

2、演示

(1)Util

ActivityCollector.java

package com.my.system.util;

import android.app.Activity;

import java.util.ArrayList;

import java.util.List;

public class ActivityCollector {

public static List activities = new ArrayList<>();

// 在每个 Activity 的 onCreate 中注册

public static void addActivity(Activity activity) {

activities.add(activity);

}

// 在 Activity 的 onDestroy 中注销

public static void removeActivity(Activity activity) {

activities.remove(activity);

}

// 退出应用时调用

public static void finishAll() {

for (Activity activity : activities) {

if (!activity.isFinishing()) {

activity.finish();

}

}

activities.clear();

}

}

(2)Activity Layout

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/main"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".AppExitTestStep1Activity">

android:id="@+id/btn_go_step2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="go step2" />

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/main"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".AppExitTestStep2Activity">

android:id="@+id/btn_exit"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="exit" />

(3)Activity Code

package com.my.system;

import android.content.Intent;

import android.os.Bundle;

import android.widget.Button;

import androidx.activity.EdgeToEdge;

import androidx.appcompat.app.AppCompatActivity;

import androidx.core.graphics.Insets;

import androidx.core.view.ViewCompat;

import androidx.core.view.WindowInsetsCompat;

import com.my.system.util.ActivityCollector;

public class AppExitTestStep1Activity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

EdgeToEdge.enable(this);

setContentView(R.layout.activity_app_exit_test_step1);

ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {

Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());

v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);

return insets;

});

ActivityCollector.addActivity(this);

Button btnGoStep2 = findViewById(R.id.btn_go_step2);

btnGoStep2.setOnClickListener(view -> {

Intent intent = new Intent(this, AppExitTestStep2Activity.class);

startActivity(intent);

});

}

@Override

protected void onDestroy() {

super.onDestroy();

ActivityCollector.removeActivity(this);

}

}

package com.my.system;

import android.os.Bundle;

import android.widget.Button;

import androidx.activity.EdgeToEdge;

import androidx.appcompat.app.AppCompatActivity;

import androidx.core.graphics.Insets;

import androidx.core.view.ViewCompat;

import androidx.core.view.WindowInsetsCompat;

import com.my.system.util.ActivityCollector;

public class AppExitTestStep2Activity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

EdgeToEdge.enable(this);

setContentView(R.layout.activity_app_exit_test_step2);

ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {

Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());

v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);

return insets;

});

ActivityCollector.addActivity(this);

Button btnExit = findViewById(R.id.btn_exit);

btnExit.setOnClickListener(view -> {

ActivityCollector.finishAll();

});

}

@Override

protected void onDestroy() {

super.onDestroy();

ActivityCollector.removeActivity(this);

}

}

五、使用 finishAffinity 方法

1、基本介绍

finishAffinity 方法是 Activity 类提供的一个方法,用于关闭当前应用的所有关联 Activity,并退出当前任务栈

finishAffinity 方法是一种优雅退出应用的方式,适用于需要关闭所有 Activity 但不强制杀进程的场景

2、演示

Button btnExit = findViewById(R.id.btn_exit);

btnExit.setOnClickListener(view -> {

finishAffinity();

});

六、使用 Intent.FLAG_ACTIVITY_CLEAR_TOP

1、基本介绍

Intent.FLAG_ACTIVITY_CLEAR_TOP 的作用:当启动目标 Activity 时,该 Flag 会清除当前任务栈中位于目标 Activity 之上 的所有 Activity,简单来说就是,如果目标 Activity 已在栈中存在,则会将其带到栈顶,并销毁它之上的所有 Activity

同时,在当启动目标 Activity 时,传递一个额外的标志(EXIT),指示目标 Activity 应该退出应用程序

2、演示

Button btnExit = findViewById(R.id.btn_exit);

btnExit.setOnClickListener(view -> {

Intent intent = new Intent(this, AppExitTestActivity.class);

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

intent.putExtra("EXIT", true);

startActivity(intent);

});

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

if (getIntent().getBooleanExtra("EXIT", false)) {

finish();

}

}