一次完成所有活动

时间:2012-12-22 10:18:35

标签: android android-activity activity-finish

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

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

21 个答案:

答案 0 :(得分:119)

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

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

你完成了......

答案 1 :(得分:56)

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

对于API 16+,请使用

finishAffinity();

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

ActivityCompat.finishAffinity(YourActivity.this);

答案 2 :(得分:22)

我找到的最佳解决方案,它与API级别<11

的设备兼容
Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

此解决方案需要Android支持库

答案 3 :(得分:18)

对于API 16+,请使用

finishAffinity();

对于较低的,请使用

ActivityCompat.finishAffinity(YourActivity.this)

答案 4 :(得分:11)

明确的活动历史有三种解决方案。

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

2)在Androidmanifest.xml文件中的所有android:noHistory="true"标记中写入<activity>,如果您打开了新活动而没有写入finish(),那么之前的活动总是完成写完你的活动后就像这样。

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

</activity>

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

答案 5 :(得分:9)

我正在努力解决同样的问题。打开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();

希望这有帮助。

答案 6 :(得分:3)

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

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

希望这会有所帮助。

答案 7 :(得分:3)

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

答案 8 :(得分:3)

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

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

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

答案 9 :(得分:2)

你可以试试justAffinity(),关闭所有当前活动,以便在v4.1以上工作

答案 10 :(得分: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提出的问题。

答案 11 :(得分:1)

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

以下是解决这两个问题的其他两个替代方案

  1. 在app app中使用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

答案 12 :(得分:1)

使用

finishAffinity ();

而不是:

System.exit(); or finish();

退出完整申请或所有活动。

答案 13 :(得分:1)

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

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

finishAffinity();

我希望这会对你们有所帮助。

答案 14 :(得分:0)

如果有根:

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

答案 15 :(得分: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);
        }

答案 16 :(得分:0)

您可以使用以下代码:

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

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

startActivity(i);

答案 17 :(得分: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();
    }

答案 18 :(得分:0)

moveTaskToBack(true);

//将其添加到点击列表器中

答案 19 :(得分: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();
    }

答案 20 :(得分:-8)

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