我正在使用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”时,它将停止。当我以编程方式进行操作时,为什么它不起作用?

最佳答案

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

如果您通过以下方式调用外部应用

Intent intent = this.getPackageManager().getLaunchIntentForPackage("com.app.package");


默认情况下会添加Intent.FLAG_ACTIVITY_NEW_TASK来创建意图。设置了此标志的意图会立即触发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

08-18 04:00
查看更多