android-一次完成所有活动

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

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

steve asked 2019-11-08T07:55:11Z
19个解决方案
121 votes

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

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();
}

就完成了...

letsnurture answered 2019-11-08T07:55:36Z
60 votes

Activity中提供了Activity方法,该方法将完成当前活动和所有父活动,但仅在Android 4.1或更高版本中有效。

对于API 16+,请使用

finishAffinity();

对于较低版本(Android 4.1以下版本),请使用

ActivityCompat.finishAffinity(YourActivity.this);
King of Masses answered 2019-11-08T07:56:14Z
23 votes

我发现了最好的解决方案,它与API级别<11的设备兼容

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

此解决方案需要Android支持库

Mongi Zaidi answered 2019-11-08T07:56:46Z
20 votes

对于API 16+,请使用

finishAffinity();

对于较低的,使用

ActivityCompat.finishAffinity(YourActivity.this)
Radu Grigoras answered 2019-11-08T07:57:15Z
11 votes

清除活动历史记录有三种解决方案。

1)您可以通过意图在开始新活动时编写system.exit(0)

2)在Androidmanifest.xml文件的所有<activity>标记中写入system.exit(0),如果您打开的是新活动,并且当时不编写finish(),则以前的活动始终会完成,在编写活动后,请使用此代码。

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

</activity>

3)编写system.exit(0)以退出应用程序。

Dipak Keshariya answered 2019-11-08T07:58:04Z
9 votes

我在同一个问题上挣扎。 打开About页面并从那里调用finish();并没有关闭该应用程序,而是转到上一个活动,我想从About页面本身中关闭该应用程序。

这是为我工作的代码:

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

希望这可以帮助。

TheOddAbhi answered 2019-11-08T07:58:38Z
6 votes

您可以使用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
Hasib Akter answered 2019-11-08T07:59:22Z
4 votes

如果您正在寻找的解决方案似乎更“书本上”且采用方法论设计(使用BroadcastReceiver),则最好查看以下链接:[http://www.hrupin.com/2011/ 10 /如何通过简单的调用完成您的android应用程序中的所有活动。]

在该链接中显示的建议实施中,需要做一些细微的更改-为了启用 暂停活动,以便能够接收广播并对其进行处理,这意味着您还应该在重新启动应用程序时,通过在打开的Activity的onCreate()方法中调用removeStickyBroadcast(Intent)方法来删除该粘性广播。

尽管上面提到的基于startActivity(...)的解决方案,乍一看-看起来非常好,优雅,简短,快速且易于实现-他们感到有些“错误”(开始一项活动-拥有所有可能 只是为了杀死它而可能需要和涉及的开销和资源?...)

user3139591 answered 2019-11-08T08:00:04Z
4 votes

以下两个标志为我工作。 他们将清除之前的所有活动并开始新的活动

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

希望这可以帮助。

Ajji answered 2019-11-08T08:00:32Z
3 votes

上面提到的答案都没有对我有用。 但是我进行了更多研究,终于得到了答案。

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

finishAffinity();

希望对您有帮助。

Himanshu Sharma answered 2019-11-08T08:01:20Z
2 votes

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

Vinodh Kumar answered 2019-11-08T08:01:47Z
2 votes

ActivityLifecycleMonitorRegistry的问题在于,仅关闭当前任务中的活动,而singleInstance launchMode和其他任务中的活动仍处于打开状态,并在finishAffinity()之后进入前台。System.exit(0)的问题在于,您使用所有后台服务和 所有分配的内存,这可能导致不希望的副作用(例如,不再接收通知)。

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

  1. 在您的应用程序类中使用ActivityLifecycleMonitorRegistry注册创建的活动并在需要时将其关闭:[https://gist.github.com/sebaslogen/5006ec133243379d293f9d6221100ddb#file-myandroidapplication-kt-L10]
  2. 在测试中,您可以使用ActivityLifecycleMonitorRegistry:[https://github.com/sebaslogen/CleanGUITestArchitecture/blob/master/app/src/androidTest/java/com/neoranga55/cleanguitestarchitecture/util/ActivityFinisher.java#L15]
Sebas LG answered 2019-11-08T08:02:34Z
1 votes

您可以存储一个布尔值标志,以表示是否应该完成所有活动(在共享首选项中更优选),每个活动的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提出的问题。

Dmila Ram answered 2019-11-08T08:03:17Z
1 votes

使用

finishAffinity ();

代替:

System.exit(); or finish();

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

Anandhu Vijayan answered 2019-11-08T08:03:49Z
0 votes

如果扎根:

Runtime.getRuntime().exec("su -c service call activity 42 s16 com.example.your_app");
nafsaka answered 2019-11-08T08:04:18Z
0 votes

关闭应用

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);
        }
ryan christoper lucasan answered 2019-11-08T08:04:52Z
0 votes

您可以使用以下代码:

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

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

startActivity(i);
Enad answered 2019-11-08T08:05:20Z
0 votes
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();
    }
Đắc Nguyễn answered 2019-11-08T08:05:41Z
-8 votes

我是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();
    }
Sergey Nikonenko answered 2019-11-08T08:06:31Z
translate from https://stackoverflow.com:/questions/14001963/finish-all-activities-at-a-time