我正在使用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。