【问题标题】:Android - Starting and Killing an App from another AppAndroid - 从另一个应用程序启动和终止一个应用程序
【发布时间】:2016-06-15 18:52:42
【问题描述】:

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

当我尝试终止应用程序时,什么也没有发生。

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

编辑:

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

【问题讨论】:

  • 应该是public volatile boolean kill;,因为你在一个线程中写入它并从另一个线程读取它。

标签: android android-intent android-activity kill


【解决方案1】:

问题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

【讨论】:

  • 这解决了这个问题,谢谢。但是,核心问题仍然存在,我已经编辑了我的帖子以反映这一点。
  • @Infamous911 查看更新。请告诉我们结果;我不能 100% 确定这是一个可行的解决方案。
  • 不起作用。调用后应用程序仍保留在前台(并获得许可)。
  • @Infamous911 为什么?见Android log
  • 当我尝试关闭它时,Android 日志什么也不显示:06-16 08:53:40.180 592 623 I ActivityManager: Displayed com.app.package/.MainActivity: +576ms (total +36s734ms) 06 -16 08:53:50.191 592 618 I ActivityManager: Killing 3092:com.google.android.gms:car/u0a8 (adj 15): empty #17 (这里显示,然后在 10 秒后被杀死,但没有被杀死介于两者之间,也就是我发送 DELETE 请求的时候)
猜你喜欢
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
相关资源
最近更新 更多