我正在寻找有关Android用户配置文件的技术输入(完整和受限(。 更具体地说,我想了解:
-
是否可以创建跨所有配置文件运行的应用程序,即在切换用户配置文件时不停止,暂停,重新启动。 我的重点不仅限于活动,而且我也有兴趣了解是否可以创建一个系统应用程序/服务来执行此操作,如果是,如何创建。
-
为非活动用户的服务维护什么生命周期。 我的印象是,用户的APK的(至少一些(服务在锁定屏幕中激活(即使没有解锁(的那一刻就开始了,然后被允许继续运行。 但是在内存不足的情况下会发生什么? 非活动用户的服务是否也会接收广播意图? 这样的服务能否与用户交互,如果是,如何交互?
一般来说:有人可以指出我有关Android配置文件功能的任何技术信息吗? 有很多关于它对用户"外观"的文章,但我几乎找不到(除了关于 pm 和 am 命令行工具选项的信息(关于它在技术上是如何工作的。
提前感谢!
是否可以创建跨所有配置文件运行的应用程序,即在切换用户配置文件时不停止,暂停,重新启动。我的重点不仅限于活动,而且我也有兴趣了解是否可以创建一个系统应用程序/服务来执行此操作,如果是,如何创建。
默认安卓行为
默认情况下,Android 应用程序在特定 Android 用户工作区中运行,它不会为所有 Android 用户运行。
这意味着当用户启动应用程序时,它仅为当前 Android 用户启动。当应用程序从另一个 Android 用户启动时,Android 将重新创建应用程序的新实例。由于Android用户可以在后台运行,这意味着您可以并行运行同一应用程序的多个实例。
您的应用程序的所有Android组件(即。服务、活动、广播接收器和内容提供商(将被重新实例化。大多数情况下,这是想要的行为,但对于某些执行系统级处理的应用程序来说,这可能是一个问题,这些处理必须为整个系统完成一次,而没有考虑到Android用户(例如:对蓝牙事件进行一些处理的工作服务(。
定义单一实例组件/应用程序
对于应用程序中不是活动的每个组件,您可以指定希望它作为单例运行(即,只会为所有 Android 用户创建一个实例(。为此,必须在应用程序的AndroidManifest.xml
中将属性android:singleUser=”true”
添加到组件的属性中。
<!-- Declare a singleUser service in the AndroidManifest.xml -->
<service
android:name=".MySingleUserService"
android:singleUser="true" />
任何singleUser
组件将始终在系统Android用户(即用户0(下运行,即使您的应用程序当前正在为另一个Android用户运行,也无法被Android阻止。
要使用属性android:singleUser=”true”
:
您的应用程序必须是系统应用程序(
system/app/
或system/priv-app/
(。您的应用程序必须由平台证书签名(通过在其
Android.mk
中指定LOCAL_CERTIFICATE := platform
(。您的应用必须在其 AndroidManifest.xml 中声明使用以下权限。
<!-- Permission needed to use android:singleUser. -->
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"/>
补充说明
如果您的应用仅包含
singleUser
组件,则整个应用将变得singleUser
(即,整个系统只会运行应用的一个实例(。android:singleUser=”true”
强制android:exported=”false”
组件(除非你的应用是特权的(。如果您的应用的某个组件想要通过 Intents 与同一应用的
singleUser
组件进行通信,则无法使用默认的 Android API,因为 Intents 不会跨 Android 用户。在这种情况下,您必须使用由AsUser后缀的多用户意图交换专用API(例如:sendBroadcastAsUser()
,startServiceAsUser()
等(,并允许指定目标Android用户(在这种情况下UserHandle.SYSTEM
(。请注意,必须使用以下权限之一:
<!-- Permission needed to send intents to components of the SAME app running in another Android user. -->
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"/>
<!-- Permission needed to send intents to components of ANOTHER app running in another Android user. -->
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
为非活动用户的服务维护什么生命周期。我的印象是,用户的APK的(至少一些(服务在锁定屏幕中激活(即使没有解锁(的那一刻就开始了,然后被允许继续运行。但是在内存不足的情况下会发生什么?非活动用户的服务是否也会接收广播意图?这样的服务能否与用户交互,如果是,如何交互?
正如我上面提到的,Android 用户可以继续在后台运行,即使他们不是活动用户(至少在 Android 10 之前(。如果资源不足,Android可以停止任何不是系统用户的Android用户(即停止所有正在运行的应用程序(。因此,服务可以继续在当前在后台运行的 Android 用户上运行,直到用户停止。
正如我上面提到的,Intents不会跨越Android用户。因此,如果您在用户 10 中注册了一个 BroadcastReceiver,并且该意图是从用户 11 发送的,那么您的 BroadcastReceiver 将不会收到它。唯一的例外是,如果您使用 AsUser Intent 交换 API 发送它。
另请注意,每当启动新的 Android 用户时,都会发送带有操作BOOT_COMPLETED
的 Intent。它仅发送到初始 Android 用户的组件。
来源
不幸的是,关于多用户系统的Android在线文档很少。以下是关于它的唯一文章(如果您在那里找不到答案,我建议您直接查看 AOSP 源代码(:
构建多用户感知应用
支持多个用户
管理多个用户