我有一个包含多个页面的应用程序,即多个活动,其中一些保持打开状态。
有没有办法一次关闭所有活动?
Answers:
每当您希望退出所有打开的活动时,都应按下一个按钮,该按钮将加载在应用程序启动时运行的第一个活动,然后清除所有其他活动,然后完成最后剩余的活动。为此,请在您的项目中应用以下代码
Intent intent = new Intent(getApplicationContext(), FirstActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
上面的代码完成了除FirstActivity之外的所有活动。然后我们需要完成FirstActivity的Enter在Firstactivity的oncreate中输入以下代码
if (getIntent().getBooleanExtra("EXIT", false)) {
    finish();
}
就完成了...
putExtra办?
                    有一种finishAffinity()方法Activity可以完成当前活动和所有父活动,但仅在Android 4.1或更高版本中有效。
对于API 16+,请使用
finishAffinity();
对于较低版本(较低的Android 4.1),请使用
ActivityCompat.finishAffinity(YourActivity.this);
ActivityCompat#finishAffinity()。
                    对于API 16+,请使用
finishAffinity();
对于较低的,使用
ActivityCompat.finishAffinity(YourActivity.this)
清除活动历史记录有三种解决方案。
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)退出应用程序的代码。
您可以使用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
我在同一个问题上挣扎。打开关于页面并致电finish();从那里并没有关闭该应用程序,而是转到上一个活动,我想从About页面本身中关闭该应用程序。
这是为我工作的代码:
Intent startMain = new Intent(Intent.ACTION_MAIN); 
startMain.addCategory(Intent.CATEGORY_HOME); 
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(startMain); 
finish();
希望这可以帮助。
如果您正在寻找的解决方案似乎更“书本上”且采用方法论设计(使用BroadcastReceiver),则最好查看以下链接:http : //www.hrupin.com/2011/10通过简单的调用/如何在您的android应用程序中完成所有活动。
在该链接中显示的建议实施中,需要做一些细微的更改-为了启用暂停的活动,以便能够接收广播并对其进行处理,这意味着在重新启动应用程序时,还应该通过在打开的Activity的onCreate()方法中调用removeStickyBroadcast(Intent)方法来删除该粘性广播。
尽管上面提到的基于startActivity(...)的解决方案,乍一看-看起来非常好,优雅,简短,快速且易于实现-他们感到有些“错误”(开始一项活动-拥有所有可能只是为了杀死它而可能需要和涉及的开销和资源?...)
您可以尝试finishAffinity(),它关闭所有当前活动以在v4.1以上版本上工作
问题finishAffinity()在于,仅关闭当前任务中的活动,而带有singleInstancelaunchMode和其他任务中的活动仍处于打开状态,并在之后移至前台finishAffinity()。问题所在System.exit(0)在于您将使用所有后台服务和所有分配的内存来完成App流程,这可能导致不良的副作用(例如,不再接收通知)。
这是解决这两个问题的另两种选择:
ActivityLifecycleCallbacks在需要的时候,你的应用程序类注册创建活动,并关闭它们:https://gist.github.com/sebaslogen/5006ec133243379d293f9d6221100ddb#file-myandroidapplication-kt-L10ActivityLifecycleMonitorRegistry:https : //github.com/sebaslogen/CleanGUITestArchitecture/blob/master/app/src/androidTest/java/com/neoranga55/cleanguitestarchitecture/util/ActivityFinisher.java#L15您可以存储一个布尔值标志,以表示是否应该完成所有活动(在共享首选项中更优选),然后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提出的问题。
关闭应用
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);
        }
moveTaskToBack(true);
//将此添加到点击列表
@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();
    }
我是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();
    }