一次完成所有活动

我有一个应用程序与多个页面,即多个活动,其中一些保持开放。

有没有办法一次closures所有的活动?

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

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

上面的代码完成除了FirstActivity以外的所有活动。 然后我们需要完成FirstActivity的input在Firstactivity的oncreate下面的代码

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

你完成了….

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

对于API 16+,请使用

 finishAffinity(); 

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

 ActivityCompat.finishAffinity(YourActivity.this); 

我发现的最佳解决scheme是与API级别<11的设备兼容

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

这个解决scheme需要Android支持库

对于API 16+,请使用

 finishAffinity(); 

为了更低,使用

 ActivityCompat.finishAffinity(YourActivity.this) 

清晰的活动历史有三个解决scheme。

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

2)在Androidmanifest.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)退出应用程序。

我正在同样的问题挣扎。 打开关于页面并调用finish(); 从那里没有closures应用程序,而是要去以前的活动,我想closures从约页面本身的应用程序。

这是为我工作的代码:

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

希望这可以帮助。

如果您正在寻找一种解决scheme,看起来更像是“本书”,而且采用方法论devise(使用BroadcastReceiver),那么最好查看以下链接: http : //www.hrupin.com/2011/10 / how-to-finish-all-activities-in-your-android-application-through-simple-call 。

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

虽然上面提到的基于startActivity(…)的解决scheme,乍一看似乎是非常好,优雅,简短,快速和容易实现 – 他们感觉有点“错误”(开始一个活动 – 尽可能开销和可能需要的资源,只是为了杀死它?)

你可以尝试一下finishAffinity(),它closures所有当前的活动,在v4.1以上工作

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

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

希望这可以帮助。

你可以存储一个布尔标志来表示是否应该完成所有的活动(在共享偏好中更优先),那么每个活动的onStart()方法应该是这样的:

 SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(this); boolean needToDestroyFlag=pref.getBoolean("destroyFlag", false); if(needToDestroyFlag) { finish(); }else { //... } 

显然你可以设置这个标志,如下所示,当你需要完成所有的活动(在当前的活动)后,你可以调用当前活动的finish()方法,将导致终止当前活动和popup活动从一个堆栈一个,每个的onStart()方法执行并导致终止它:

 SharedPreferences.Editor editor=PreferenceManager.getDefaultSharedPreferences(this).edit(); editor.putBoolean("destroyFlag", true); editor.apply(); 

如果您使用@letsnurturebuild议的方法,您将面临@gumuruh提出的问题。

如果扎根:

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

我在java / android的入门,可能是这个简单的解决scheme帮助你

首先 ,创build静态类

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