我有一个具有多个页面的应用程序,即,多个活动,其中一些仍然打开。
有没有一次性关闭所有活动的方法?
每当你想退出所有打开的活动,你应该按下一个按钮,加载 第一项活动运行时,你的应用程序启动,然后清除所有其他活动,然后有最后剩余的活动完成。 在您的项目中应用以下代码
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()。
finish()
2)在 AndroidManif.xml 文件中的所有 <activity>标签中写入 android:noHistory="true",如果你打开了一个新的活动,并且当时你没有写 Finish () ,那么在写完你的活动之后,上一个活动总是完成了。
<activity>
android:noHistory="true"
<activity android:name=".Splash_Screen_Activity" android:label="@string/app_name" android:noHistory="true"> </activity>
3)写 system.exit(0)退出应用程序。
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()方法应该具有如下内容:
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 页面本身关闭应用程序。
finish();
这是我用过的密码:
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或更高版本中工作。
Activity
finishAffinity()
对于 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);
对于较低,使用
ActivityCompat.finishAffinity(YourActivity.this)
finishAffinity()的问题在于,只有当前任务中的活动是关闭的,但是使用 singleInstance launchMode 和其他任务中的活动仍然被打开,并在 finishAffinity()之后显示在前台。System.exit(0)的问题在于,你用所有的后台服务和所有分配的内存来完成你的 App 进程,这可能会导致不想要的副作用(比如不再接收通知)。
singleInstance
System.exit(0)
以下是其他 解决这两个问题的两种选择:
ActivityLifecycleCallbacks
ActivityLifecycleMonitorRegistry
使用
finishAffinity ();
而不是:
System.exit(); or finish();
它退出完整的应用程序或所有活动。
您可以使用 finishAffinity()方法来完成当前活动和所有父活动。但它只适用于 API 16+。
API 16+
API 16 + 使用:
以下 API 16用途:
ActivityCompat.finishAffinity(this); //with v4 support library
退出整个应用程序:
finishAffinity(); // Close all activites System.exit(0); // closing files, releasing resources
其他的答案对我来说都不管用。但是我又研究了一些,最终得到了答案。
你实际上要求关闭我需要的应用程序。所以,添加以下代码:
关闭应用程序
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(); }