如何杀死一个应用程序的所有活动? [复制]
Posted
技术标签:
【中文标题】如何杀死一个应用程序的所有活动? [复制]【英文标题】:How to kill an application with all its activities? [duplicate] 【发布时间】:2011-03-07 13:09:00 【问题描述】:可能重复:Quitting an application - is that frowned upon?
我想为用户提供退出应用程序的选项,因为我需要删除一些敏感数据,只要应用程序需要,这些数据就会存储在 SharedPreferences 中。
一旦用户想要退出,SharedPreferences 中的密码就应该被清除,当然应用程序的所有活动都应该关闭(在没有已知密码的情况下运行它们是没有意义的——它们会崩溃)。
我该怎么做?
System.exit(0)
和 finish()
只退出当前活动 - 没用。我知道有一个任务管理器应用程序。那个人是怎么做到的?它能够杀死整个应用程序...
【问题讨论】:
检查这个:finishAffinity(); 有趣的问题,但你试图以错误的方式去做。问题背后的问题的解决方案与问题的答案不同。问题的解决方案是不要使用 SharedPreferences - 清理不是退出活动的好理由。 【参考方案1】:当你使用 finish() 方法时,它并没有完全关闭进程,它仍然在后台工作。
请在主活动中使用此代码(请不要在每个活动或子活动中使用):
@Override
public void onBackPressed()
android.os.Process.killProcess(android.os.Process.myPid());
// This above line close correctly
【讨论】:
哇,正确的方向!!!谢谢 这会杀死进程,但不一定会杀死内存中的任务。因此,当应用程序重新启动时,活动堆栈(任务)将从上次重新创建。 是的,我根本不喜欢这个解决方案。终止进程会带走您可能不得不保存数据或完成任何待处理任务的任何机会。这就像关闭应用程序的最直截了当的穴居人方式,应该不惜一切代价避免。 为什么应用程序在杀死进程后重启 修复了我在 Thread.UncaughtExceptionHandler 之后尝试“完成”时遇到的问题。我注意到 ps 显示进程在挂起状态下仍处于活动状态,但退出线程后,应用程序下次无法正确重启。这行得通。【参考方案2】:使用onBackPressed()
方法:
@Override
public void onBackPressed()
android.os.Process.killProcess(android.os.Process.myPid());
或者使用finish()
方法,我有类似的东西
//Password Error, I call function
Quit();
protected void Quit()
super.finish();
使用 super.finish() 可以关闭超类的活动。
【讨论】:
TNX for this 【参考方案3】:当用户希望退出所有打开的活动时,他们应该按下一个按钮,该按钮会加载在您的应用启动时运行的第一个活动,在我的例子中是“LoginActivity”。
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
上面的代码清除了除LoginActivity之外的所有Activity。 LoginActivity 是用户运行程序时启动的第一个活动。然后将此代码放在 LoginActivity 的 onCreate 中,以在传递“退出”消息时发出信号。
if (getIntent().getBooleanExtra("EXIT", false))
finish();
您从 Android 平台得到的这个问题的答案是:“不要制作退出按钮。完成用户不再需要的活动,活动管理器会在它认为合适的时候清理它们。”
【讨论】:
很好的解决方案,但是启动新的Activity不是开销... 是的,但是请记住,android 非常努力地不让程序员能够为他们的应用程序创建一个“退出”按钮。所以你必须欺骗语言让你退出应用程序,慢慢爬上它,让它认为你只想停止一些活动,然后偷偷接近最后一个命令,让最后一个活动完成。这有点像通过分散他的注意力来绕过一名保安,然后在他不注意的时候跑过去。【参考方案4】:你是对的:调用finish()
只会退出当前活动,而不是整个应用程序。但是,有一个解决方法:
每次启动 Activity 时,请使用 startActivityForResult(...)
启动它。当你想关闭整个应用时,你可以这样做:
setResult(RESULT_CLOSE_ALL);
finish();
然后定义每个活动的onActivityResult(...)
回调,这样当活动返回RESULT_CLOSE_ALL
值时,它也会调用finish()
:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
switch(resultCode)
case RESULT_CLOSE_ALL:
setResult(RESULT_CLOSE_ALL);
finish();
super.onActivityResult(requestCode, resultCode, data);
这将导致关闭所有活动的级联效应。
另外,我支持 CommonsWare 的建议:将密码存储在一个变量中,以便在应用程序关闭时将其销毁。
【讨论】:
这对我帮助很大@mtmurdock。非常感谢您提供此解决方案 RESULT_CLOSE_ALL 无法解析为变量 我搜索了一下,发现有几个人使用零 public final static int RESULT_CLOSE_ALL = 0; 它不起作用。我有一个屏幕区域,单击该区域应该关闭应用程序。但我得到这个编译错误。似乎您不能在公共类 GaugeControl 上使用此代码 extends View The method finish() is undefined for the type GaugeControl 这应该是公认的答案。这是迄今为止最正确和最干净的答案,使用 android 而不是反对它,使用提供的工具和 api,而不是进行严厉的进程杀戮。希望我可以 +2 来提高它。【参考方案5】:存储在 SharesPreferences 只要 应用程序需要它。
为什么?
一旦用户想要退出, SharedPreferences 中的密码 应该擦掉,当然所有 应用程序的活动应该 被关闭(运行没有意义 他们没有已知的密码 - 他们 会崩溃)。
更好的是:不要将密码输入SharedPreferences
。在静态数据成员中保留它。当应用程序中的所有 Activity 退出(例如,BACK 按钮)或以其他方式销毁(例如,在用户按下 HOME 后的某个时间从 RAM 中踢出以腾出空间给其他 Activity)时,数据自然会消失。
如果您想要某种主动的“刷新密码”,只需将静态数据成员设置为 null
,并让您的活动检查该成员并在其为 null
时采取适当的措施。
【讨论】:
谢谢。那行得通,但是一旦任何活动发生崩溃并且它将为NULL,即使其他活动仍然存在。好吧……我想这很好【参考方案6】:我对 Android 应用程序框架的理解是,这是明确不允许的。当应用程序不再包含当前活动时,它会自动关闭。试图创建一个“杀死”按钮显然违背了应用系统的预期设计。
要获得您想要的效果,您可以使用 startActivityForResult() 启动各种活动,并让退出按钮返回一个结果,告诉父活动完成 ()。然后,该活动可以发送相同的结果作为其 onDestroy() 的一部分,这将级联回主活动并导致没有正在运行的活动,这将导致应用程序关闭。
【讨论】:
以上是关于如何杀死一个应用程序的所有活动? [复制]的主要内容,如果未能解决你的问题,请参考以下文章