gpt4 book ai didi

android - Android用户个人资料问题

转载 作者:行者123 更新时间:2023-11-30 03:20:14 25 4
gpt4 key购买 nike

我正在寻找有关Android用户个人资料的技术建议(完整和受限)。更具体地说,我想了解:


切换用户个人资料时,是否可以创建可在所有个人资料上运行的应用程序,即是否不停止,暂停或重新启动。我的重点不仅限于活动,而且我还想知道是否可以创建执行此操作的系统应用程序/服务,以及如何创建。
为非活动用户的服务维护什么生命周期。我得到的印象是,用户的APK(至少某些)服务在锁定屏幕中被激活(即使没有解锁)后即开始运行,然后被允许继续运行。但是,在内存不足的情况下会发生什么?非活动用户的服务还会收到广播意图吗?这样的服务可以与用户互动吗?


一般来说:有人可以向我指出有关Android个人资料功能的任何技术信息吗?有很多关于它对用户的“外观”的文章,但是我在技术上如何真正起作用的很少(除了pm上的信息和命令行工具的选项)。

提前致谢!

最佳答案

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


默认的Android行为

默认情况下,Android应用程序在特定的Android用户工作空间中运行,而不是在所有Android用户中都不运行。

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

您应用程序的所有Android组件(即服务,活动,BroadcastReceivers和ContentProviders)都将重新实例化。
在大多数情况下,这是所需的行为,但是对于某些执行系统级处理的应用程序来说,这可能是个问题,而整个系统必须执行一次
考虑到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(即,整个系统仅运行您的应用程序的一个实例)。
android:singleUser=”true”强制为您的组件使用 android:exported=”false”(除非您的应用已特权)。
如果您的应用程序组件希望通过Intent与同一应用程序的 singleUser组件进行通信,则无法使用默认的Android API,因为Intent不会跨越Android用户。
在这种情况下,您必须使用多用户Intent交换专用API,这些API带有AsUser后缀(例如: 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用户上运行,直到该用户停止。

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

另请注意,每当新的Android用户启动时,都会发送带有操作 BOOT_COMPLETED的Intent。它仅发送给初始Android用户的组件。

资料来源

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


Building Multiuser-Aware Apps
Supporting Multiple Users
Manage multiple users

关于android - Android用户个人资料问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19272015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com