Android多用户

news/2024/11/16 4:20:03/文章来源:https://www.cnblogs.com/bluestorm/p/18298022
  • Context.startActivityAsUser(Intent, UserHandle)
  • Context.bindServiceAsUser(Intent, …, UserHandle)
  • Context.sendBroadcastAsUser(Intent, … , UserHandle)
  • Context.startServiceAsUser(Intent, …, UserHandle)

\android\os\UserHandle.java

    /** @hide A user id to indicate all users on the device */@UnsupportedAppUsage@TestApipublic static final @UserIdInt int USER_ALL = -1;/** @hide A user handle to indicate all users on the device */@SystemApipublic static final @NonNull UserHandle ALL = new UserHandle(USER_ALL);/** @hide A user id to indicate the currently active user */@UnsupportedAppUsage@TestApipublic static final @UserIdInt int USER_CURRENT = -2;/** @hide A user handle to indicate the current user of the device */@SystemApipublic static final @NonNull UserHandle CURRENT = new UserHandle(USER_CURRENT);/** @hide A user id to indicate that we would like to send to the current*  user, but if this is calling from a user process then we will send it*  to the caller's user instead of failing with a security exception */@UnsupportedAppUsagepublic static final @UserIdInt int USER_CURRENT_OR_SELF = -3;/** @hide An undefined user id */@UnsupportedAppUsage@TestApipublic static final @UserIdInt int USER_NULL = -10000;private static final @NonNull UserHandle NULL = new UserHandle(USER_NULL);/*** @hide A user id constant to indicate the "owner" user of the device* @deprecated Consider using either {@link UserHandle#USER_SYSTEM} constant or* check the target user's flag {@link android.content.pm.UserInfo#isAdmin}.*/@UnsupportedAppUsage@Deprecatedpublic static final @UserIdInt int USER_OWNER = 0;/*** @hide A user handle to indicate the primary/owner user of the device* @deprecated Consider using either {@link UserHandle#SYSTEM} constant or* check the target user's flag {@link android.content.pm.UserInfo#isAdmin}.*/@UnsupportedAppUsage@Deprecatedpublic static final @NonNull UserHandle OWNER = new UserHandle(USER_OWNER);/** @hide A user id constant to indicate the "system" user of the device */@UnsupportedAppUsage@TestApipublic static final @UserIdInt int USER_SYSTEM = 0;/** @hide A user serial constant to indicate the "system" user of the device */@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)public static final int USER_SERIAL_SYSTEM = 0;/** @hide A user handle to indicate the "system" user of the device */@SystemApipublic static final @NonNull UserHandle SYSTEM = new UserHandle(USER_SYSTEM);

 

构建可感知多用户的应用

对于支持多用户的设备,其中的应用必须能够感知不同的用户。

某些应用需要将一些组件作为单例运行,并且可接受来自任意用户的请求。目前只有系统应用可以使用此功能。

这种便利功能有以下益处:

  • 节约资源
  • 可在用户间裁决一项或多项共享资源
  • 由于使用单一服务器连接,可减少网络开销

下图描绘了涉及多用户时的权限流程。

多用户权限流程

图 1. 多用户权限

启用单例组件

如需将应用标识为单例,请将 android:singleUser=”true” 添加至 Android 清单中的服务、接收器或提供程序。

系统会在仅以用户 0 身份运行的进程中将该组件实例化。任何用户若提出任何连接到上述提供程序或服务或者向上述接收器发送广播的请求,都会传送到以用户 0 身份运行的进程中。如果该组件是应用中的唯一组件,则只有一个应用实例会运行。

软件包中的活动仍将在每个用户各自的进程中启动,并且 UID 处于相应用户的 UID 范围内(例如 1010034)。

与用户互动

设置权限

需要下列权限:

 
INTERACT_ACROSS_USERS (signature|system)
INTERACT_ACROSS_USERS_FULL (signature)

使用 API

使用下列 API 可使应用能够感知多个用户。

  1. 从传入的 Binder 调用中提取用户句柄:
    • int userHandle = UserHandle.getCallingUserId()
  2. 使用受保护的新 API 为特定用户启动服务、Activity 和广播:
    • Context.startActivityAsUser(Intent, UserHandle)
    • Context.bindServiceAsUser(Intent, …, UserHandle)
    • Context.sendBroadcastAsUser(Intent, … , UserHandle)
    • Context.startServiceAsUser(Intent, …, UserHandle)
    UserHandle 可以是显式用户,也可以是以下特殊句柄之一:UserHandle.CURRENT 或 UserHandle.ALLCURRENT 表示当前位于前台的用户。如果您想向所有用户发送广播,可以使用 ALL
  3. 如需与您自己应用中的组件通信,请使用 (INTERACT_ACROSS_USERS);如需与其他应用中的组件通信,请使用 (INTERACT_ACROSS_USERS_FULL)
  4. 您可能需要创建代理组件,这些代理组件先在用户进程中运行,之后会访问以用户 0 身份运行的 singleUser 组件。
  5. 使用新的 UserManager 系统服务查询用户及其句柄:
    • UserManager.getUsers()
    • UserManager.getUserInfo()
    • UserManager.supportsMultipleUsers()
    • UserManager.getUserSerialNumber(int userHandle) - 与用户句柄对应的不可再循环数字。
    • UserManager.getUserHandle(int serialNumber)
    • UserManager.getUserProfiles() - 返回用户本人个人资料和托管个人资料的集合(如有)。
  6. 注册即可借助 ContentObserver、PackageMonitor 和 BroadcastReceiver 上的新 API 监听特定或所有用户以及回调(可提供与回调发起用户相关的其他信息)。

多个用户或资料中的服务

并非所有服务都需要在其他用户或工作资料中运行实例。如果您的系统服务只需要以用户 0 的身份运行,则在以其他用户的身份运行时应停用该服务的组件,以帮助节省资源。下例显示了如何在服务的入口点执行此操作:

 
// Add on all entry points such as boot_completed or other manifest-listed receivers and providers
if (!UserManager.isSystemUser()) {// Disable the serviceComponentName targetServiceName = new ComponentName(this, TargetService.class);context.getPackageManager().setComponentEnabledSetting(targetServiceName, COMPONENT_ENABLED_STATE_DISABLED, 0);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/742414.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTPS、SSL和TLS

1、HTTPS相关概念 1.1、对称加密和非对称加密 简单描述一下,加密密钥和解密密钥相同,则称为对称加密;加密密钥和解密密钥不同,则称为非对称加密; 对称加密比非对称加密的效率要高。详细的描述的可以查看 对称加密与非对称加密详解 - 浪迹天涯的派大星 - 博客园 (cnblogs.c…

仙侠天花板,圆你土豪梦,上古传说手游详细图文架设教程

这次给大家带来的是一款我的心头好,绝对是我所有架设游戏里排名前三的,一款经典的仙侠手游,安卓苹果双端,画质精美程度真的没有哪几个游戏可以比得上,故事情节加上背景音乐绝对值得沉浸其中慢慢玩。前言 这次给大家带来的是一款我的心头好,绝对是我所有架设游戏里排名前三…

【Spring Cloud】之Nacos

——笔记源于黑马使用Nacos启动Nacosstartup.cmd -m standalone 单机启动Nacos在父工程pom.xml引入依赖<!--spring cloud alibaba--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</arti…

DevOps系列一(介绍)

一、DevOps字面意思 是Development&Operations的缩写,也就是开发&运维。 二、DevOps强调的是 高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件。三、整体的软件开发流程包括PLAN:开发团队根据客户的目…

pycharm 远程运行时,出现报错 cant open file /tmp/ : [Errno 2] No such file or directory

路径映射出现问题,在部署时,使用自动检测的根目录,可以解决问题

麒麟合盛网络技术股份公司-移动端测试|12-20K

1、公司要求条件详细要求 任职条件: 1)本科及以上学历,1-3年左右手机APP测试经验 2) 熟悉Python、PHP等语言,有Python脚本经验更佳 3) 熟悉MYSQL、Linux常用命令,熟悉HTTP协议 4)熟悉使用如下工具:ADB、Charles/ Fiddler、Teambition、Jira、Jenkins等 5)精通测试流程和用例…

MUR2060CTR-ASEMI无人机专用MUR2060CTR

MUR2060CTR-ASEMI无人机专用MUR2060CTR编辑:ll MUR2060CTR-ASEMI无人机专用MUR2060CTR 型号:MUR2060CTR 品牌:ASEMI 封装:TO-220 批号:最新 最大平均正向电流(IF):20A 最大循环峰值反向电压(VRRM):600V 最大正向电压(VF):0.95V~1.90V 工作温度:-50C~150C 反向恢…

Solo 开发者周刊 (第13期):独立开发者的创新集——橘猫、记一杯与Newcar

这里会整合 Solo 社区每周推广内容、产品模块或活动投稿,每周五发布。在这期周刊中,我们将深入探讨开源软件产品的开发旅程,分享来自一线独立开发者的经验和见解。本杂志开源,欢迎投稿。产品推荐 1、橘猫起始页——一款不一样的浏览器标签页功能介绍极简首屏 聚合搜索,支持…

ssh免密码登录

一、本地创建ssh秘钥 ssh-genkey -t rsa # 生成的文件在当前用户的~/.ssh目录下二、将本地生成的公钥上传到服务器 1. ssh-copy-id username@ip -p port # 需要知道服务器密码 2. 将公钥内容或文件写入到服务器的authorized_keys文件 # 用于通过堡垒机登录服务器不知道密码的…

关于Java内存区域的理解和记录

近期做项目遇到了FullGC的问题,干脆总结一下Java内存区域分布和垃圾回收是咋回事。 Java内存区域按照线程隔离状态直接分成三大块空间: 线程私有: 程序计数器 是一块较小的内存空间,可以看做当前线程所执行的字节码的行号指示器。在虚拟机概念模型里,字节码解释器工作时就…

项目前端

目录vue组件基础页面组件组件与链接关联按键绑定网址获取当前网页地址bootstrap常用★实现地图以及地图刷新游戏基类游戏对象地图变量函数null墙★PK页面 vue组件 基础组件名两个大写字母 template,script,style(带上scoped,给该css加上随机字符串,不影响到其他组件) 使用…

Vue3中组件使用ref时获取组件类型推导

本文由 ChatMoney团队出品 我们在使用Vue3+ts开发时,常常会用到一些第三方组件库,比如Element-Plus UI、Navie UI等,这些UI框架中有些组件常常会暴露一些方法给我们便捷的去实现各种复杂的交互,我们经常会像下面这样去给组件定义一个ref去获取组件的实例: <template>…