一次完成所有活动

我有一个具有多个页面的应用程序,即,多个活动,其中一些仍然打开。

有没有一次性关闭所有活动的方法?

140742 次浏览

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

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

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

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

你就完了。

清晰的活动历史有三种解决方案。

1)您可以在通过意图开始新活动时编写 finish()

2)在 AndroidManif.xml 文件中的所有 <activity>标签中写入 android:noHistory="true",如果你打开了一个新的活动,并且当时你没有写 Finish () ,那么在写完你的活动之后,上一个活动总是完成了。

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


</activity>

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

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

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

这个解决方案需要 Android 支持库

如果您正在寻找一个看起来更加“按章办事”和方法设计(使用 BroadcastReceiver)的解决方案,那么您最好看看以下链接: http://www.hrupin.com/2011/10/how-to-finish-all-activities-in-your-android-application-through-simple-call

在这个链接中出现的建议的实现需要一个小小的改变——你应该使用 sendSticyBroadcast (意图)方法(不要忘记在你的清单中添加 BROADCAST _ STICKY 权限)而不是 sendBroadcast (意图) ,以便让你暂停的活动能够接收和处理广播,这意味着你也应该在重新启动应用程序时通过调用活动的 onCreate ()方法中的 RemoveSticyBroadcast (意图)方法来删除那个粘性广播。

尽管上面提到的基于 startActivity (...)的解决方案,乍一看——看起来非常漂亮、优雅、简短、快速和易于实现——他们感觉有点“错误”(开始一个活动——可能需要的所有开销和资源,只是为了杀死它?...)

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

我也有同样的问题。打开 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();

希望这个能帮上忙。

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

FIRST ,创建静态类

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


}

THEN 当你运行新的活动时,保存链接到你的经理(步骤1) :

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

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

 public void OkExit(View v) throws IOException {
ActivityManager.finishAll();
}

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

如果扎根:

Runtime.getRuntime().exec("su -c service call activity 42 s16 com.example.your_app");

Activity中有一个 finishAffinity()方法,它将完成当前活动和所有父活动,但它只能在 Android 4.1或更高版本中工作。

对于 API 16 + ,请使用

finishAffinity();

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

ActivityCompat.finishAffinity(YourActivity.this);

以下两个标志为我工作。他们将 全部清除以前的活动和 重新开始

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

希望这个能帮上忙。

对于 API 16 + ,请使用

finishAffinity();

对于较低,使用

ActivityCompat.finishAffinity(YourActivity.this)

finishAffinity()的问题在于,只有当前任务中的活动是关闭的,但是使用 singleInstance launchMode 和其他任务中的活动仍然被打开,并在 finishAffinity()之后显示在前台。System.exit(0)的问题在于,你用所有的后台服务和所有分配的内存来完成你的 App 进程,这可能会导致不想要的副作用(比如不再接收通知)。

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

  1. 在应用程序类中使用 ActivityLifecycleCallbacks注册创建的活动,并在需要时关闭它们: 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

使用

finishAffinity ();

而不是:

System.exit(); or finish();

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

您可以使用 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

其他的答案对我来说都不管用。但是我又研究了一些,最终得到了答案。

你实际上要求关闭我需要的应用程序。所以,添加以下代码:

finishAffinity();

关闭应用程序

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

您可以使用以下代码:

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


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


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

MoveTaskToBack (真实) ;

//将其添加到 click listner

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