71

我有一个包含多个页面的应用程序,即多个活动,其中一些保持打开状态。

有没有办法一次关闭所有活动?

4

21 回答 21

135

每当您希望退出所有打开的活动时,您应该按下一个按钮,该按钮会加载应用程序启动时运行的第一个活动,然后清除所有其他活动,然后完成最后一个剩余活动。为此,在您的项目中应用以下代码

Intent intent = new Intent(getApplicationContext(), FirstActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

上面的代码完成了除 FirstActivity 之外的所有活动。然后我们需要完成FirstActivity的在FirstActivity的oncreate中输入下面的代码

if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();
}

你完成了....

于 2012-12-22T10:28:11.030 回答
78

有一种finishAffinity()方法Activity可以完成当前活动和所有父活动,但它仅适用于 Android 4.1 或更高版本。

对于 API 16+,请使用

finishAffinity();

对于更低版本(Android 4.1 更低版本),请使用

ActivityCompat.finishAffinity(YourActivity.this);
于 2015-08-25T11:39:15.587 回答
24

The best solution i have found, which is compatible with devices having API level <11

Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

This solution requires Android support library

于 2014-04-24T09:59:15.240 回答
22

对于 API 16+,请使用

finishAffinity();

对于较低的,使用

ActivityCompat.finishAffinity(YourActivity.this)
于 2017-01-20T00:10:21.517 回答
12

There are three solution for clear activity history.

1) You can write finish() at the time of start new activity through intent.

2) Write android:noHistory="true" in all <activity> tag in Androidmanifest.xml file, using this if you are open new activity and you don't write finish() at that time previous activity is always finished, after write your activity look like this.

<activity
    android:name=".Splash_Screen_Activity"
    android:label="@string/app_name"
    android:noHistory="true">

</activity>

3) write system.exit(0) for exit from the application.

于 2012-12-22T10:46:06.513 回答
11

您可以使用finishAffinity()将完成当前活动和所有父活动的方法。但它仅适用于API 16+.

API 16+ 使用:

finishAffinity();

API 16 以下使用:

ActivityCompat.finishAffinity(this); //with v4 support library

要退出整个应用程序:

finishAffinity(); // Close all activites
System.exit(0);  // closing files, releasing resources
于 2018-06-02T21:28:04.993 回答
9

我正在努力解决同样的问题。打开关于页面并finish();从那里调用并没有关闭应用程序,而是转到以前的活动,我想从关于页面本身关闭应用程序。

这是对我有用的代码:

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

希望这可以帮助。

于 2014-07-21T18:07:55.590 回答
9

以下两个标志对我有用。他们将清除所有以前的活动并开始新的活动

  Intent intent = new Intent(getApplicationContext(), MyDetails.class);
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);

希望这可以帮助。

于 2016-05-29T07:58:28.247 回答
8

其他答案都不适合我。但我研究了更多,终于得到了答案。

您实际上要求根据我的需要关闭应用程序。因此,添加以下代码:

finishAffinity();

于 2018-07-17T20:24:03.577 回答
4

如果您正在寻找一种似乎更“按书本”和方法设计(使用广播接收器)的解决方案,您最好查看以下链接:http ://www.hrupin.com/2011/10 /how-to-finish-all-activities-in-your-android-application-through-simple-call

该链接中出现的建议实现需要稍作更改 - 您应该使用 sendStickyBroadcast(Intent) 方法(不要忘记将 BROADCAST_STICKY 权限添加到您的清单)而不是 sendBroadcast(Intent),以便启用您的暂停活动以便能够接收广播并对其进行处理,这意味着您还应该在重新启动应用程序时删除该粘性广播,方法是在打开活动的 onCreate() 方法中调用 removeStickyBroadcast(Intent) 方法。

尽管上面提到的基于 startActivity(...) 的解决方案,乍一看 - 似乎非常好、优雅、简短、快速且易于实现 - 他们觉得有点“错误”(开始一个活动 - 尽一切可能可能需要和参与其中的开销和资源,只是为了杀死它?...)

于 2014-06-15T18:28:30.610 回答
3

您可以尝试 finishAffinity() ,它关闭所有当前活动以在 v4.1 以上工作

于 2015-04-01T09:34:22.153 回答
3

问题finishAffinity()是只有当前任务中的活动被关闭,但具有singleInstance启动模式和其他任务的活动仍然打开并在finishAffinity(). 问题System.exit(0)是您使用所有后台服务和所有分配的内存完成您的应用程序进程,这可能导致不良副作用(例如不再接收通知)。

以下是解决这两个问题的其他两种选择

  1. 在您的应用程序类中使用ActivityLifecycleCallbacks来注册创建的活动并在需要时关闭它们:https ://gist.github.com/sebaslogen/5006ec133243379d293f9d6221100ddb#file-myandroidapplication-kt-L10
  2. 在测试中,您可以使用ActivityLifecycleMonitorRegistryhttps ://github.com/sebaslogen/CleanGUITestArchitecture/blob/master/app/src/androidTest/java/com/neoranga55/cleanguitestarchitecture/util/ActivityFinisher.java#L15
于 2018-01-28T17:16:28.887 回答
1

您可以存储一个布尔标志来表示是否所有活动都应该完成(在您的共享首选项中更优选)然后onStart()每个活动的方法应该具有如下内容:

SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this);
boolean needToDestroyFlag=pref.getBoolean("destroyFlag", false);
if(needToDestroyFlag)
{
    finish();
}else
{
    //...
}

显然,当您需要完成所有活动(在当前活动中)之后,您可以像下面这样设置此标志,您可以在当前活动上调用 finish() 方法,这将导致终止当前活动并从堆栈中弹出活动一个一,每个人的onStart()方法执行并导致终止它:

SharedPreferences.Editor editor=PreferenceManager.getDefaultSharedPreferences(this).edit();
editor.putBoolean("destroyFlag", true);
editor.apply();

如果您使用@letsnurture 建议的方法,您将面临@gumuruh 提出的问题。

于 2014-07-18T20:51:08.113 回答
1

利用

finishAffinity ();

代替:

System.exit(); or finish();

它退出完整的应用程序或所有活动。

于 2018-02-24T20:21:08.003 回答
1

您可以使用以下代码:

Intent i = new Intent(OldActivity.this, NewActivity.class);

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

startActivity(i);
于 2019-07-17T14:22:37.053 回答
0

如果扎根:

Runtime.getRuntime().exec("su -c service call activity 42 s16 com.example.your_app");
于 2015-05-15T13:58:24.803 回答
0
in LoginActivity

@Override
    public void onBackPressed() {
        Intent startMain = new Intent(Intent.ACTION_MAIN);
        startMain.addCategory(Intent.CATEGORY_HOME);
        startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(startMain);
        finish();
        super.onBackPressed();
    }
于 2019-09-14T05:35:07.350 回答
0

moveTaskToBack(true);

//将此添加到点击列表

于 2020-01-23T12:31:35.450 回答
0

关闭应用程序

Intent intent = new Intent(getApplicationContext(), Splash_Screen.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                intent.putExtra("EXIT", true);
                startActivity(intent);

把它放在打开的第一个活动的 oncreate 和 onResume 中。前任。正在启动屏幕活动

if (getIntent().getBooleanExtra("EXIT", false)) {
            this.finish();
            System.exit(0);
        }
于 2018-08-17T08:30:53.217 回答
0
@Override
    public void onBackPressed(){
        MaterialAlertDialogBuilder alert = new MaterialAlertDialogBuilder(BorrowForm.this, MyTheme);
        alert.setTitle("Confirmation");
        alert.setCancelable(false);
        alert.setMessage("App will exit. Data will not be saved. Continue?");
        alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast toast = Toast.makeText(BorrowForm.this, "App terminated.", Toast.LENGTH_SHORT);
                toast.getView().setBackgroundColor(Color.parseColor("#273036"));
                toast.setGravity(Gravity.CENTER_HORIZONTAL,0,0);
                TextView toastMessage=(TextView) toast.getView().findViewById(android.R.id.message);
                toastMessage.setTextColor(Color.WHITE);
                toast.show();
                finishAffinity();
            }
        });
        alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        });
        alert.setCancelable(false);
        alert.show();
    }
于 2020-11-11T12:16:03.607 回答
-9

我是 java/android 的初学者,可能这个简单的解决方案对你有帮助

首先,创建静态类

public class ActivityManager {

    static Activity  _step1;
    static Activity _step2;
    static Activity _step3;

    public static void setActivity1(Activity activity)
    {
        _step1 = activity;
    }

    public static void setActivity2(Activity activity)
    {
        _step2 = activity;
    }

    public static void setActivity3(Activity activity)
    {
        _step3 = activity;
    }

    public static void finishAll()
    {
        _step1.finish();
        _step2.finish();
        _step3.finish();
    }

}

然后 当您运行新的活动保存链接到您的经理时(在步骤 1 中):

ActivityManager.setActivity1(this);
AddValuesToSharedPreferences();
Intent intent = new Intent(Step1.this, Step2.class);
startActivity(intent);

然后在你的最后一步完成所有:

 public void OkExit(View v) throws IOException {
        ActivityManager.finishAll();
    }
于 2014-11-20T12:42:11.547 回答