【问题标题】:How to kill a process?如何杀死一个进程?
【发布时间】:2011-05-07 18:15:28
【问题描述】:

我有两个activity,第一个activity由Launcher启动,第二个activity由第一个启动。当我从第一个活动中杀死 进程 时,该进程被杀死。但是当我从第二个活动中杀死它时,系统会立即启动一个新进程和第一个活动。 (进程的PID改变了。)我怎样才能干净地做到这一点?

我尝试了 3 种不同的方法来终止进程:System.exit(0)、android.os.Process.killProcess(pid),以及通过 Eclipse 的“设备”面板以非编程方式。

以下是我体验过的两个世界上最简单的活动。它们都是各自文件中的外部类。

public class FirstActivity extends Activity  {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ((Button)findViewById(R.id.button)).setOnClickListener(
            new OnClickListener() {
                public void onClick(View v) {
                    startActivity(new Intent(FirstActivity.this, 
                        SecondActivity.class));
        }});
    }
}

public class SecondActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_2);
        ((Button)findViewById(R.id.button)).setOnClickListener( 
            new OnClickListener() {
                public void onClick(View v) {
                    // Method 1
                    int pid = android.os.Process.myPid();
                    android.os.Process.killProcess(pid);
                    // Method 2
                    System.exit(0);
        }});
    }
}

(我知道人们说永远不应该提供一个 UI 来退出程序。但这是出于安全原因。用户必须有一种方法来退出程序并关闭文件,这样他的信息就不会被泄露。)

【问题讨论】:

  • 考虑使用 startActivityForResult 启动第二个活动,然后使用 setResult 和 finish() 将消息从第二个活动传递回第一个活动。然后在 onActivityResult 中捕获消息。打开消息并通话结束?如有必要,在第一个活动中。

标签: android process


【解决方案1】:

你可以试试this.finish()

其他选项会在不通知安卓系统的情况下终止进程,安卓系统会假设用户想要做的事情已经崩溃并重新启动。

但是您关于关闭活动以防止数据泄漏的假设是错误的。如果您想提供一个注销按钮,请执行此操作并让它否定用于获取访问权限的任何访问令牌/密钥。

还要考虑如果其他活动在用户退出您的情况下进入前台会发生什么 - 例如,如果他们接到电话怎么办?

【讨论】:

  • 感谢您的回复。我考虑过使用 finish() 但还没有尝试过。但就我而言,在开始第二个活动之前使用 finish() 并不是一个解决方案——他可能想回去。所以唯一的方法是:在杀死第二个活动之前,如果可能的话,我需要清理系统的历史记录。 (退出意味着他不想(也不能)再使用该软件,那为什么还要在系统中留下一个对他无用的进程呢?这就是为什么我想一劳永逸地杀死它。应用程序有一个计时器可以在进程处于后台或在 FG 中处于非活动状态时终止进程。)
  • 这取决于 android,而不是你决定杀死你的进程 - 这就是它的工作原理,当你发现战斗它不起作用时
【解决方案2】:

只是我的想法,在你开始第二个活动(这一行)之后,

startActivity(new Intent(FirstActivity.this,SecondActivity.class));

你可以杀死第一个活动。通过,

int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);

所以,现在第一个活动没有来。

另一种方式,

您可以通过 bundle 获取第一个 Activity 的进程 id 并将进程 id 发送给第二个 Activity。

先杀掉第一个Activity进程,接下来就可以杀掉第二个Activity进程了。

所以,现在第一个活动没有来。

【讨论】:

    【解决方案3】:

    我在使用 Android 时遇到了这个问题。 我创建了两个活动并从一个布局切换到另一个布局,但是当我终止第二个活动的进程时,第一个活动将是 resume();并且第一个布局将显示在显示屏中。

    您的问题的答案是:在第一个活动简历中,您必须调用 finish(); onResume() 方法中的方法。

    【讨论】:

      【解决方案4】:

      System.exit(0);通过使用这个,所有当前进程都将被杀死

      【讨论】:

        猜你喜欢
        • 2014-10-03
        • 1970-01-01
        • 2015-03-12
        • 2018-06-09
        • 2011-05-28
        • 2013-04-13
        • 2011-07-28
        • 1970-01-01
        相关资源
        最近更新 更多