如何在程序中强制停止我的安卓应用?

28

我想在点击“关闭按钮”时强制停止我的Android应用程序。这是我的代码。

protected void onCreate(Bundle savedInstanceState) {

  this.setContentView(R.layout.layoutxml);

  this.closeButton = (Button)this.findViewById(R.id.close);

  this.closeButton.setOnClickListener(new OnClickListener() {

    @Override

    public void onClick(View v) {

      finish();

    }

  });

}

这样就完成了我的应用程序。如果我进入 设置 -> 应用程序 -> 管理应用程序 -> <我的应用程序名称>,我可以看到“强制停止”按钮是可用的。这是否意味着我的应用程序没有完全停止?

如何完全终止我的 Android 应用程序并在“设置”中禁用“强制停止”按钮?从我的有限经验来看,当应用程序发生异常(例如 NullPointerException)时,它会异常停止,看起来像是已经完全停止,并且“强制停止”按钮看起来是禁用的。


3
不要这样做。阅读此处的原因:https://dev59.com/w3I-5IYBdhLWcg3wED5V - EboMike
3
为什么需要这样做?最佳实践是让操作系统管理应用程序的生命周期,包括进程死亡。 - Ted Hopp
这将结束Activity而不是应用程序。 - vinksharma
可能是如何强制停止Android应用程序的重复问题。 - Ankush Bist
7个回答

49

另一种方法是

android.os.Process.killProcess(android.os.Process.myPid());

我认为只要你把这些调用放在onDestroy()中,这样做并不是非常糟糕的。(如果你在事件处理过程中终止了进程,会发生各种问题,例如触摸焦点消失等)

尽管如此,你需要一个充分的理由来偏离最佳实践,即只需调用finish()并让操作系统在需要时处理杀死进程。


2
这个东西被弃用的原因之一是为了让应用程序在用户切换回来时更快地启动。实际上,没有原因就杀死进程只是一个不好的做法。 - EboMike
我想强制停止其他应用程序。这种方法不起作用。 - Amit Thaper
@AndroidDeveloper - 关于杀死另一个应用程序,请参见此问题 - Ted Hopp
1
这不是一个好的选择。Google建议不要这样做。请使用以下解决方案:https://dev59.com/QG435IYBdhLWcg3w-1V_#34340126 - Antonio
1
感谢您的解释,@Ted Hopp。现在我明白了您的观点。谢谢。 - Antonio
显示剩余2条评论

13

注意: 这并不会关闭整个应用程序,但如果你想要结束所有应用活动,这是最好的选择。

Android ≥ 16

finishAffinity();

Android < 16

ActivityCompat.finishAffinity(Activity activity)

希望这可以帮到你。


这只是一种同时在多个活动中调用“finish()”的方法。这仍然不能杀死应用程序本身。 - NikkyD
你说得对!我会在答案中提到的。 - Antonio
@Vinoth Vino,很高兴能帮到你。 - Antonio
我发现这个答案解决了我的问题,适用于React Native 0.38和React Native Router Flux 3.38.0。当android.os.Process.killProcess(pid)对我无效时,它导致应用程序重新打开。谢谢! - siripan

8

一个不好的杀死应用程序的方法是System.exit(0)

编辑: 我认为我需要一些解释。Android会自行处理应用程序的生命周期,您不应该“强制关闭”它,而且我不知道任何好的方法来做到这一点。通常情况下,如果您的应用程序仍在后台运行,这是可以接受的,这样,如果用户再次启动它,它将快速弹出。


如果我想处理异常(比如说没有检测到网络!),然后阻止应用程序继续执行...因为当代码的其他部分开始使用http结果时,它们会抛出NullPointerException,但是我不想让代码到达那里!我想显示一个警报对话框,让用户了解错误并关闭应用程序,因为简单地处理异常仍然会保持应用程序打开......我该怎么办? - Shark
@Shark - 如果你的程序在捕获异常后继续执行,那么问题就出在你的错误处理程序上。如果有异常抛出,"代码的其他部分"不应该再尝试使用http结果。因为由于异常而杀死应用程序是一种非常糟糕的编程方法...但它确实很快。我认为你可以为此提出一个单独的问题。 - m0s
1
我睡了一晚上,冷静了一下,答案就清晰了!现在它按照我想要的方式工作,而不需要强制关闭应用程序。是的,我使用了一些糟糕和愚蠢的编码...已经修复了 :) 我对Android和Java非常陌生...需要时间来理解基础知识:P @m0s 谢谢! - Shark

0

我知道回复晚了,但希望能对某些人有所帮助。

你可以在你的代码片段中尝试使用finishAndRemoveTasks();而不是finish();

这将会杀死你应用程序的所有活动和进程,并从任务管理器中删除最近的应用程序。

注意:如果你的代码中使用了任何类型的handlerthread,请确保删除它们的功能,然后使用上述建议的代码,否则会出现NullPointer ExceptionResourceNotFound Exception


这并不会关闭应用程序的进程。静态数据、应用程序组件以及动态加载库分配的内存等等,除非进程消失,否则它们将不会被释放。 - Ted Hopp

0

简短而简单

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);

-1

-1
为什么不对ActivityManager进行Shell调用?
try {
      Runtime.getRuntime().exec("am force-stop com.me.myapp");
    } catch (IOException e) {
      e.printStackTrace();
    }

1
因为你需要 root 访问权限? - Chisko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接