از 27 مارس 2025، توصیه می کنیم از android-latest-release
به جای aosp-main
برای ساختن و کمک به AOSP استفاده کنید. برای اطلاعات بیشتر، به تغییرات AOSP مراجعه کنید.
برنامه های چند کاربره آگاه بسازید
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
هنگامی که یک دستگاه از چندین کاربر پشتیبانی می کند، برنامه های آن باید از این کاربران متمایز آگاه شوند.
برخی از برنامهها باید برخی از مؤلفهها را به صورت تکی اجرا کنند و میتوانند درخواستهای هر کاربری را بپذیرند. در حال حاضر فقط برنامه های سیستم می توانند از این ویژگی استفاده کنند.
این تسهیلات:
- منابع را حفظ می کند
- داوری یک یا چند منبع مشترک بین کاربران
- با استفاده از یک اتصال سرور واحد، سربار شبکه را کاهش می دهد
برای نمایش جریان مجوزها با چندین کاربر، نمودار زیر را ببینید.

شکل 1. مجوزهای چند کاربر
یک مؤلفه singleton را فعال کنید
برای شناسایی یک برنامه به عنوان تکتون، android:singleUser="true"
را به سرویس، گیرنده یا ارائهدهنده خود در مانیفست Android اضافه کنید.
سیستم آن مؤلفه را در فرآیندی که فقط به عنوان کاربر 0 اجرا می شود، نمونه سازی می کند. هر درخواستی برای اتصال به آن ارائه دهنده یا سرویس، یا پخش به آن گیرنده، از هر کاربری به فرآیند کاربر 0 هدایت می شود. اگر این تنها مؤلفه در برنامه شما باشد، تنها یک نمونه از برنامه شما اجرا می شود.
فعالیتهای بسته شما همچنان در فرآیند جداگانهای برای هر کاربر راهاندازی میشود، و UID در محدوده UID آن کاربر قرار دارد (مانند 1010034).
با کاربران تعامل داشته باشید
مجوزها را تنظیم کنید
این مجوزها مورد نیاز است:
INTERACT_ACROSS_USERS (signature|system)
INTERACT_ACROSS_USERS_FULL (signature)
از API ها استفاده کنید
از API های زیر برای آگاه کردن برنامه ها از چندین کاربر استفاده کنید.
- دسته کاربر را از تماس های ورودی Binder استخراج کنید:
-
int userHandle = UserHandle.getCallingUserId()
- از API های جدید و محافظت شده برای شروع خدمات، فعالیت ها، پخش ها در یک کاربر خاص استفاده کنید:
-
Context.startActivityAsUser(Intent, UserHandle)
-
Context.bindServiceAsUser(Intent, …, UserHandle)
-
Context.sendBroadcastAsUser(Intent, … , UserHandle)
-
Context.startServiceAsUser(Intent, …, UserHandle)
UserHandle
می تواند یک کاربر صریح یا یکی از دسته های ویژه باشد: UserHandle.CURRENT
یا UserHandle.ALL
. CURRENT
نشان دهنده کاربری است که در حال حاضر در پیش زمینه است. زمانی که می خواهید پخشی را برای همه کاربران ارسال کنید از ALL
استفاده کنید. - با اجزای برنامه خود ارتباط برقرار کنید:
(INTERACT_ACROSS_USERS)
یا با مؤلفههای موجود در برنامههای دیگر: (INTERACT_ACROSS_USERS_FULL)
- ممکن است لازم باشد اجزای پراکسی ایجاد کنید که در فرآیند کاربر اجرا شوند و سپس به مولفه
singleUser
در کاربر 0 دسترسی پیدا کنند. - پرس و جو از کاربران و دسته آنها با سرویس جدید سیستم
UserManager
:-
UserManager.getUsers()
-
UserManager.getUserInfo()
-
UserManager.supportsMultipleUsers()
-
UserManager.getUserSerialNumber(int userHandle)
- یک عدد غیر بازیافتی که مربوط به دسته کاربر است. -
UserManager.getUserHandle(int serialNumber)
-
UserManager.getUserProfiles()
- مجموعه ای از پروفایل های خود و مدیریت شده را در صورت وجود برمی گرداند.
- برای گوش دادن به کاربران خاص یا همه و تماسهای پاسخدهی با APIهای جدید در ContentObserver، PackageMonitor، BroadcastReceiver ثبت نام کنید که اطلاعات بیشتری در مورد اینکه کدام کاربر باعث پاسخ به تماس شده است، ارائه میکند.
خدمات در چندین کاربر یا نمایه
لازم نیست همه سرویسها نمونهای را در نمایه کاربری یا کاری دیگر اجرا کنند. اگر سرویس سیستم شما فقط باید به عنوان کاربر 0 اجرا شود، برای کمک به حفظ منابع، اجزای سرویس را هنگام اجرا تحت سایر کاربران غیرفعال کنید. مثال زیر نشان می دهد که چگونه می توانید این کار را در نقاط ورودی سرویس خود انجام دهید:
// Add on all entry points such as boot_completed or other manifest-listed receivers and providers
if (!UserManager.isSystemUser()) {
// Disable the service
ComponentName targetServiceName = new ComponentName(this, TargetService.class);
context.getPackageManager().setComponentEnabledSetting(
targetServiceName, COMPONENT_ENABLED_STATE_DISABLED, 0);
}
این مثال همچنین میتواند از PackageManager.setApplicationEnabledSetting()
برای غیرفعال کردن کل برنامه استفاده کند.
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","easyToUnderstand","thumb-up"],["مشکلم را برطرف کرد","solvedMyProblem","thumb-up"],["غیره","otherUp","thumb-up"]],[["اطلاعاتی که نیاز دارم وجود ندارد","missingTheInformationINeed","thumb-down"],["بیشازحد پیچیده/ مراحل بسیار زیاد","tooComplicatedTooManySteps","thumb-down"],["قدیمی","outOfDate","thumb-down"],["مشکل ترجمه","translationIssue","thumb-down"],["مشکل کد / نمونهها","samplesCodeIssue","thumb-down"],["غیره","otherDown","thumb-down"]],["تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی."],[],[],null,["# Build multiuser-aware apps\n\nWhen a device supports [multiple users](/docs/devices/admin/multi-user), its apps must be\nmade aware of these distinct users.\n\nCertain apps need to have some components run as singletons and can accept\nrequests from any user. Only system apps can currently use this feature.\n\nThis facility:\n\n- Conserves resources\n- Arbitrates one or more shared resources across users\n- Reduces network overhead by using a single server connection\n\nSee the diagram below for a depiction of permissions flow with multiple users.\n\n\n**Figure 1.** Multiple users permissions\n\nEnable a singleton component\n----------------------------\n\nTo identify an app as a singleton, add `android:singleUser=\"true\"` to your service,\nreceiver, or provider in the Android manifest.\n\nThe system instantiates that component in the process running as user 0\nonly. Any requests to connect to that provider or service, or to broadcast to that receiver, from\nany user is routed to the process in user 0. If this is the only component in your app,\nonly one instance of your app runs.\n\nActivities in your package are still launched in a separate process for\neach user, with the UID being in the UID range for that user (such as 1010034).\n\nInteract with users\n-------------------\n\n### Set permissions\n\nThese permissions are required: \n\n```\nINTERACT_ACROSS_USERS (signature|system)\nINTERACT_ACROSS_USERS_FULL (signature)\n```\n\n### Employ APIs\n\nUse the following APIs to make apps aware of multiple users.\n\n1. Extract the user handle from incoming Binder calls:\n - `int userHandle = UserHandle.getCallingUserId()`\n2. Use new, protected APIs to start services, activities, broadcasts on a specific user:\n - `Context.startActivityAsUser(Intent, UserHandle)`\n - `Context.bindServiceAsUser(Intent, ..., UserHandle)`\n - `Context.sendBroadcastAsUser(Intent, ... , UserHandle)`\n - `Context.startServiceAsUser(Intent, ..., UserHandle)`\n\n `UserHandle` can be an explicit user or one of the special handles: `UserHandle.CURRENT` or `UserHandle.ALL`. `CURRENT` indicates the user that is currently in the foreground. Use `ALL` when you want to send a broadcast to all users.\n3. Communicate with components in your own app: `(INTERACT_ACROSS_USERS)` Or with components in other apps: `(INTERACT_ACROSS_USERS_FULL)`\n4. You might need to create proxy components that run in the user's process that then access the `singleUser` component in user 0.\n5. Query users and their handles with the new `UserManager` system service:\n - `UserManager.getUsers()`\n - `UserManager.getUserInfo()`\n - `UserManager.supportsMultipleUsers()`\n - `UserManager.getUserSerialNumber(int userHandle)` - a nonrecycled number that corresponds to a user handle.\n - `UserManager.getUserHandle(int serialNumber)`\n - `UserManager.getUserProfiles()` - returns the collection of self and managed profiles, if any.\n6. Register to listen to specific or all users and the callbacks with new APIs on ContentObserver, PackageMonitor, BroadcastReceiver that provide additional information about which user has caused the callback.\n\n### Services in multiple users or profiles\n\nNot all services need to run an instance in another user or work profile. If your system service\nonly needs to run as user 0, disable the service's components when running under other users to\nhelp preserve resources. The following example shows how you might do this at your service's entry\npoints: \n\n```\n// Add on all entry points such as boot_completed or other manifest-listed receivers and providers\nif (!UserManager.isSystemUser()) {\n // Disable the service\n ComponentName targetServiceName = new ComponentName(this, TargetService.class);\n context.getPackageManager().setComponentEnabledSetting(\n targetServiceName, COMPONENT_ENABLED_STATE_DISABLED, 0);\n}\n```\n\nThe example could also use `PackageManager.setApplicationEnabledSetting()` to disable\nthe entire app."]]