Android - 从另一个应用程序启动和杀死应用程序

时间:2016-06-15 18:52:43

标签: android android-intent android-activity kill

我正在使用AndroidAsync在我的Android设备上托管服务器。我希望能够在POST请求时启动新应用程序,并在DELETE请求时终止该应用程序。但是,应用程序可能会自行完成,因此我希望能够在应用程序完成后从应用程序中获取结果。

以下是我启动应用程序的方法:

Intent intent = getPackageManager().getLaunchIntentForPackage("com.app.package");
startActivityForResult(intent, 100);

以下是我尝试杀死该应用程序的方法:

Runtime.getRuntime().exec("am force-stop com.app.package");

以下是我在另一个应用程序(启动和杀死的应用程序)上的代码:

public boolean kill;

@Override
protected void onCreate(Bundle savedInstanceState) {

    ...

    final Intent returnIntent = new Intent();
    setResult(Activity.RESULT_OK, returnIntent);

    new Thread() {
        public void run() {
            try {
                if (!kill) {
                    Process p = Runtime.getRuntime().exec("sleep 10");
                    p.waitFor();
                }
            } catch (Exception e) {
                setResult(Activity.RESULT_CANCELED, returnIntent);
            }

            finish();
        }
    }.start();
}

@Override
public void onDestroy() {
    super.onDestroy();
    kill = true;
}

当我试图杀死应用程序时,没有任何反应。

我不知道为什么这不起作用。我想我必须根据我的设备来获得“am force-stop”命令才能做任何事情,这是对的吗?

编辑:

当我在应用程序运行时在adb shell中运行“am force-stop com.app.package”时,它会停止。当我以编程方式执行时,为什么它不起作用?

1 个答案:

答案 0 :(得分:2)

问题0:startActivityForResult()立即触发onActivityResult()

如果您使用

调用外部应用程序
Intent intent = this.getPackageManager().getLaunchIntentForPackage("com.app.package");

默认情况下会添加Intent.FLAG_ACTIVITY_NEW_TASK来创建意图。并且设置了此标志的intent会立即触发onActivityResult()。所以请致电:

intent.setFlags(0);

将清除所有标志,然后您可以继续:

startActivityForResult(intent, RESULT_CODE);

问题1:无法杀死已启动的应用程序

如果要根据包名停止创建的流程,请尝试

ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
am.killBackgroundProcesses("com.app.package");

您必须持有权限android.permission.KILL_BACKGROUND_PROCESSES才能调用此方法。 read more about killBackgroundProcesses())功能

<强> UPD 即可。请参阅author的解决方案here