如何在安卓系统中关闭另一个应用程序?

7

我一直在开发一个应用程序,需要在我的代码中关闭另一个应用程序。有人知道任何可以调用以关闭应用程序的API吗?

顺便说一下:我的应用程序将被预安装。

谢谢。


1
不要这样做。你不应该“关闭”其他人的应用程序。 - Falmarri
@Falmarri 为什么不呢?你有没有考虑过这可能是一个实际要求的可能性? - Chisko
5个回答

8
自从Android 2.2(即向前)开始,您只能关闭其他应用程序的后台进程,无法关闭它们的主要活动。如果您的应用程序针对的是Android <2.2,请查看android.permission.RESTART_PACKAGE。如果您希望它在2.2及以上版本上正常工作(您应该这样做:-)),请查看android.permission.KILL_BACKGROUND_PROCESSES,但同样,这只会关闭后台服务等,并可能“搞砸”其他应用程序,而不是有所好处。有了正确的权限,您可以执行以下操作:
private ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
am.restartPackage("com.jimmy.appToBeClosed");

am.restartPackage()已被弃用,现在使用另一个API“killBackgroundProcesses()”。但还是感谢,非常感激。 - Jimmy

5
尝试这个。
    ActivityManager am = (ActivityManager) getApplicationContext().getSystemService("activity");
    Method forceStopPackage;                
    forceStopPackage =am.getClass().getDeclaredMethod("forceStopPackage",String.class);
    forceStopPackage.setAccessible(true);
    forceStopPackage.invoke(am, pkg);

在清单文件中添加以下内容:

在清单文件中添加这个

<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"></uses-permission>

1
这真的有效!(我的应用程序已使用系统证书签名) - Bojan Radivojevic
什么是“activity”和String.classpkg - ankalagba
@ankalagba 这是一个内部(私有)方法的名称和其参数类型。不确定 pkg 是什么意思... - ETL
实际上,pkg 将是您想要关闭的应用程序 ID(包)的字符串。 - ETL
1
forceStopPackage 方法在 Android 11 上已经不存在。 - ETL
@ETL 我不知道 Android 11,但在 Android 12 上它对我有效。 - zeitgeist

0

我已经成功地在Android 12上关闭了另一个应用程序。以下是方法:

基本上,我正在从服务中关闭另一个应用程序,尽管您也应该能够从应用程序中执行此操作。

  1. 我的服务是一个特权系统应用程序,安装在system/priv-app/中(它的Android.mk中有LOCAL_PRIVILEGED_MODULE := true

  2. 我在AndroidManifest.xml中添加了<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES" />

  3. 我在privapp-permissions.xml中添加了

    <privapp-permissions package="<my service package name>">
        <permission name="android.permission.FORCE_STOP_PACKAGES"/>
    </privapp-permissions>
  1. 我使用应用程序的包名调用了我的服务方法,以关闭该应用程序:
    private void closePackageApp(String namePackage) {
        ActivityManager activityManager = (ActivityManager)
                context.getSystemService(Context.ACTIVITY_SERVICE);
        try {
            Method forceStopPackage = activityManager.getClass().
                    getDeclaredMethod("forceStopPackage", String.class);
            forceStopPackage.setAccessible(true);
            forceStopPackage.invoke(activityManager, namePackage);
        } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

我测试了一下,日志显示应用程序已被关闭。但是在最近使用的屏幕上并没有将该应用删除(日志建议首先使用输入管理器将应用删除后再进行处理!)。

然而,通过比较重新打开时的生命周期,我确信该应用程序确实在后台被关闭了。通常,它是onPause-> onResume,但现在是onPause-> onCreate。


0

-1

由于Android活动生命周期,您实际上永远不想关闭另一个应用程序。
如果它不是您自己的应用程序,则关闭另一个应用程序始终会带来不利影响,而关闭自己的应用程序也几乎没有什么好处。

http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

如果您确定永远不需要根活动及其子级(即“应用程序”),则可以停止它以释放内存(并不能释放太多内存),但是如果用户在缓存中仍然停止了应用程序,则可能会重新启动该应用,这可能会导致在恢复停止状态时出现问题。因此,这是一种不好的做法。

1
另外,预安装是最糟糕的想法。请告诉你的老板强制用户使用软件是邪恶的行为。你碰巧在为Verizon工作吗? - Android Dev Dude
2
我肯定有一个有效的用例来强制关闭一个问题 Android 应用程序。我的设备上的拨号应用程序由于实现中的错误而出现故障。具体来说,它正在消耗电池,并且永远不会有更新,首先因为它是 Android,其次因为我的手机已经老旧。我发现在呼叫等事件后强制关闭它不会对我的手机使用产生负面影响,但确实可以节省电池电量,因此我希望有一个服务来监视并强制关闭拨号应用程序,而不是我手动操作。 - paulius_l
@AndroidDevDude 你是否曾考虑过企业使用安卓设备进行自用,并为其自有设备开发应用程序的商业化? - ETL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接