一次完成所有活动
我有一个应用程序与多个页面,即多个活动,其中一些保持开放。
有没有办法一次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(); }