我正在使用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 :(得分:2)
startActivityForResult()
立即触发onActivityResult()
如果您使用
调用外部应用程序Intent intent = this.getPackageManager().getLaunchIntentForPackage("com.app.package");
默认情况下会添加Intent.FLAG_ACTIVITY_NEW_TASK
来创建意图。并且设置了此标志的intent会立即触发onActivityResult()
。所以请致电:
intent.setFlags(0);
将清除所有标志,然后您可以继续:
startActivityForResult(intent, RESULT_CODE);
如果要根据包名停止创建的流程,请尝试
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
am.killBackgroundProcesses("com.app.package");
您必须持有权限android.permission.KILL_BACKGROUND_PROCESSES
才能调用此方法。 (read more about killBackgroundProcesses()
)功能