是否有意为所有用户卸载应用程序?

and*_*per 8 android uninstall multi-user android-intent android-5.0-lollipop

背景

通过使用"ACTION_DELETE"意图,调用应用程序卸载应用程序的正常方法是:

startActivity(new Intent(Intent.ACTION_DELETE, Uri.parse("package:" +packageName)));
Run Code Online (Sandbox Code Playgroud)

问题

从一些Android版本(不记得哪个)开始,可以在同一设备上为多个用户安装应用程序.

这意味着有一种卸载应用程序的新方法,将为所有用户卸载该应用程序(图片取自Lollipop - Android 5.0):

在此输入图像描述

这个问题

我在文档中搜索过,但无法找到答案:

  1. 有没有办法通过意图执行此操作?也许有些东西要添加到我上面写的意图中?

  2. ADB是否有新命令为所有用户删除应用程序?

  3. 有没有办法检查是否为多个用户安装了应用程序?

adn*_*eal 8

有没有办法通过意图执行此操作?也许有些东西要添加到我上面写的意图中?

是的,但要小心.您可以传递Intent.EXTRA_UNINSTALL_ALL_USERS.

然而,它是隐藏的,因为它:

不应该是正常应用程序流程的一部分

无论如何,如果你认为有必要并且不同意谷歌就可以传递常数.例如,这里是传入falsetrue使用该常量之间的差异

    final Uri packageURI = Uri.parse("package:" + "some.package.name");
    final Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI);
    uninstallIntent.putExtra("android.intent.extra.UNINSTALL_ALL_USERS", false or true);
    startActivity(uninstallIntent);
Run Code Online (Sandbox Code Playgroud)

结果

例

ADB是否有新命令为所有用户删除应用程序?

不,命令保持不变.

`adb uninstall 'some.package.name'` 
Run Code Online (Sandbox Code Playgroud)

这将删除所有用户的该应用程序.我不知道指定特定用户的方法.

有没有办法检查是否为多个用户安装了应用程序?

不,不是我知道的.事实上,当设置应用程序决定在选项菜单中放置"为所有用户卸载"选项时,它基本上是基于是否存在多个用户周期而不是当前用户和另一个用户都有应用程序时这样做安装.

更不用说,大多数方法UserManager甚至需要告诉设备上是否有多个用户,例如UserManager.getUserCount,需要MANAGE_USERS权限是系统API并隐藏.所以,我甚至不确定为什么这是一种公共方法.

此外,通过在设备上创建虚拟用户,您可以轻松地测试所有问题,就像我一样.您甚至不需要登录Google帐户.

  • 对于 adb,您可以运行: `adb uninstall --user -1 'some.package.name'` - 这意味着所有用户都卸载,因为 -1 = `UserHandle.USER_ALL` 和 `if (userId == UserHandle.USER_ALL ) { userId = UserHandle.USER_OWNER; 标志 |= PackageManager.DELETE_ALL_USERS; }` (2认同)