安卓用户个人资料问题



我正在寻找有关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 源代码(:

  • 构建多用户感知应用

  • 支持多个用户

  • 管理多个用户

相关内容

  • 没有找到相关文章

最新更新