概述
在 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
// 在每个 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">
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">
(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();
}
}