如何在 Android 中清除返回栈?
简介
在 Android 应用中,我们经常会显示许多不同类型的 Activity。这些 Activity 用于执行不同的任务。当我们从一个 Activity 导航到另一个 Activity 时,导航到的上一个 Activity 会保留在返回栈中,这会占用系统内存并可能降低应用的性能。为了防止这种情况发生,我们必须清除 Android 应用的 Activity 历史栈。在本文中,我们将了解如何在 Android 中清除返回栈。
实现
我们将创建一个简单的应用,其中将创建两个 Activity。当用户从一个 Activity 导航到另一个 Activity 时,我们将清除 Activity 的返回栈,这样当用户从第二个 Activity 按下"返回"按钮时,他将退出应用,而不是返回到上一个 Activity。
步骤 1:在 Android Studio 中创建新项目
如下图所示,导航到 Android Studio。在下方屏幕中,点击"新建项目"以创建一个新的 Android Studio 项目。
点击"新建项目"后,您将看到以下屏幕。
在此屏幕中,我们只需选择"空 Activity",然后点击"下一步"。点击"下一步"后,您将看到以下屏幕。
在此屏幕中,我们只需指定项目名称。然后包名称将自动生成。
注意 - 确保选择 Java 作为语言。
指定所有详细信息后,点击"完成"以创建一个新的 Android Studio 项目。
项目创建完成后,我们将看到两个打开的文件,即 activity_main.xml 和 MainActivity.java 文件。
步骤 3:使用 activity_main.xml
导航到 activity_main.xml。如果此文件不可见,请打开此文件。在左侧窗格中,导航至 app>res>layout>activity_main.xml 并打开此文件。打开此文件后,添加以下代码。代码中添加了注释,以便您详细了解。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/idRLLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<!-- text view for displaying heading of the application -->
<TextView
android:id="@+id/idTVHeading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/idBtnOpen"
android:layout_marginStart="10dp"
android:layout_marginTop="100dp"
android:layout_marginEnd="10dp"
android:padding="5dp"
android:text="How to Clear Back Stack in Android"
android:textAlignment="center"
android:textAllCaps="false"
android:textColor="@color/black"
android:textSize="18sp"
android:textStyle="bold" />
<!-- on below line we are creating a button to post the data -->
<Button
android:id="@+id/idBtnOpen"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_margin="20dp"
android:text="Open new activity"
android:textAllCaps="false" />
</RelativeLayout>
说明 - 在上面的代码中,我们创建了一个相对布局作为根布局,并在其中创建了一个简单的文本视图,用于显示应用程序的标题。在此文本视图之后,我们创建了一个简单的按钮。点击此按钮后,我们将打开第二个活动。
步骤 4:创建新活动
为了显示第二个活动,我们将创建一个新活动。要创建新活动,我们必须导航至"应用程序">右键单击它>新建>活动>空活动,然后将活动名称指定为 SecondActivity,并点击"完成"以创建新活动。现在,您的活动就创建完成了。
步骤 5:使用 MainActivity.java 文件
导航至 MainActivity.java。如果此文件不可见,请打开此文件。在左侧窗格中,导航至 app>res>layout>MainActivity.java 并打开此文件。打开此文件后,添加以下代码。代码中添加了注释,以便您详细了解。
package com.example.androidjavaapp;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.android.volley.toolbox.HttpClientStack;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
// 在下面一行创建一个用于按钮和编辑文本的变量。
private Button openActivityBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 下面一行我们正在初始化变量。
openActivityBtn = findViewById(R.id.idBtnOpen);
openActivityBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 下面一行我们创建了一个新的 Intent。
Intent i = new Intent(MainActivity.this, SecondActivity.class);
// 下面一行为我们的 Activity 添加一个标志,用于清除历史记录堆栈。
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
// 下面一行调用一个方法来启动 Activity
startActivity(i);
// 下面一行调用 finish 方法来关闭当前 Activity。
finish();
}
});
}
}
说明 - 在上面的代码中,我们为按钮创建了变量。之后,我们可以看到 onCreate 方法。这是 MainActivity.java 文件中的默认方法,用于加载应用程序的 activity_main.xml 文件。在这个 onCreate 方法中,我们使用在 activity_main.xml 文件中指定的 id 初始化按钮变量。初始化变量后,我们为按钮添加了一个点击监听器。在按钮的点击监听器中,我们通过 Intent 打开一个新 Activity,最后调用 finish 方法从历史记录堆栈中移除当前 Activity,并将新 Activity 作为 SecondActivity 打开。
步骤 6:使用 activity_second.xml
导航到 activity_second.xml。如果此文件不可见,请打开此文件。在左侧窗格中,导航至 app>res>layout>activity_second.xml 以打开此文件。打开此文件后,将以下代码添加到其中。代码中添加了注释,可以详细了解。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SecondActivity">
<!-- on below line creating a text view for displaying a heading-->
<TextView
android:id="@+id/idTVHeading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_margin="10dp"
android:padding="4dp"
android:text="Welcome to Second Activity"
android:textAlignment="center"
android:textColor="@color/black"
android:textSize="20sp"
android:textStyle="bold" />
</RelativeLayout>
添加上述代码后,我们只需点击顶部栏中的绿色图标即可在移动设备上运行我们的应用程序。
注意 - 确保您已连接到真实设备或模拟器。
输出
在应用程序内部,当我们点击按钮打开新 Activity 时,我们可以看到新 Activity 已打开,但同时我们已经从 Activity 返回栈中清除了当前 Activity。当我们从第二个 Activity 按下"返回"按钮时,应用程序将被关闭。这是因为我们已将 MainActivity 从 Activity 返回栈中移除。
结论
在本文中,我们介绍了如何清除 Android 中的返回栈。与此同时,我们还研究了如何在我们的 Android 应用程序中实现它。

