Android用户个人资料问题

时间:2013-10-09 12:27:47

标签: android api profiles

我正在寻找Android用户个人资料(包括完整版和限制版)的技术输入。更具体地说,我想了解:

  • 是否可以创建跨所有配置文件运行的应用程序,即在切换用户配置文件时未停止,暂停,重新启动。我的重点不仅限于活动,但我也有兴趣知道是否可以创建系统应用程序/服务来执行此操作,如果是这样的话。

  • 为非活跃用户的服务维护了什么生命周期。我得到这样的印象:用户的APK服务(至少一些)在锁定屏幕中被激活的时刻开始(即使没有解锁),然后被允许继续运行。但是在低内存条件下会发生什么?非活动用户的服务是否也会收到广播意图?这样的服务可以与用户交互吗?如果是这样的话?

一般情况:有人可以向我指出有关Android配置文件功能的任何技术信息吗?关于它如何看待"有很多文章。对于用户而言,我可以找到很少(除了有关pm和am命令行工具的选项)以及它在技术上如何运作。

提前致谢!

1 个答案:

答案 0 :(得分:1)

  

是否可以创建一个可在所有配置文件上运行的应用程序,即在切换用户配置文件时未停止,暂停或重新启动。我的重点不仅限于活动,而且我还想知道是否可以创建执行此操作的系统应用程序/服务,以及如何创建。

默认Android行为

默认情况下,Android应用程序在特定的Android用户工作空间中运行,但并非为所有Android用户运行

这意味着当用户启动应用程序时,仅适用于当前的Android用户。 从另一个Android用户启动该应用程序时, Android将重新创建您的应用程序的新实例。由于Android用户可以在后台运行,这意味着您可以并行运行同一应用程序的多个实例。

您应用程序的所有Android组件(即服务,活动,广播接收器和ContentProvider)将重新实例化。 在大多数情况下,这是所需的行为,但是对于某些执行系统级处理的应用程序来说,这可能是个问题,而整个系统必须执行一次 考虑到Android用户(例如:JobService对蓝牙事件进行一些处理)。

定义单例组件/应用程序

对于不是活动的应用程序的每个组件,您可以指定希望它作为一个实例运行(即,将为所有Android用户创建一个实例) )。 为此,必须将属性android:singleUser=”true”添加到应用程序AndroidManifest.xml中组件的属性中。

<!-- 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/中)。

  • 您的应用必须由平台证书签名(通过在其LOCAL_CERTIFICATE := platform中指定Android.mk来签名)。

  • 您的应用必须在其AndroidManifest.xml中声明使用以下权限。

<!-- Permission needed to use android:singleUser. -->
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS"/>

其他备注

  • 如果您的应用仅包含singleUser个组件,则整个应用将变为singleUser(即,整个系统只能运行一个应用实例)。

    < / li>
  • android:singleUser=”true”强制为组件添加android:exported=”false”(除非您的应用程序已特权)。

  • 如果您的应用程序组件希望通过Intent与同一个应用程序的singleUser组件进行通信,则无法使用默认的Android API,因为 Intent不会跨越Android用户< / strong>。 在这种情况下,您必须使用由 AsUser 后缀(例如:sendBroadcastAsUser()startServiceAsUser()等)的多用户Intent交换专用API。指定目标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用户上运行,直到该用户停止。

如上所述,Intent不会跨Android用户。因此,如果您在用户10中注册了BroadcastReceiver,并且从用户11发送了一个Intent,那么您的BroadcastReceiver将不会接收到它。唯一的例外是如果您使用 AsUser Intent交换API发送它。

还请注意,只要有新的Android用户启动,就会发送带有操作BOOT_COMPLETED的Intent。它只会发送给初始Android用户的组件。

来源

不幸的是,很少有关于多用户系统的Android在线文档。这是关于它的仅有的文章(如果您在那里找不到答案,建议您直接研究AOSP源代码):