برنامه های چند کاربره آگاه بسازید

هنگامی که یک دستگاه از چندین کاربر پشتیبانی می کند، برنامه های آن باید از این کاربران متمایز آگاه شوند.

برخی از برنامه‌ها باید برخی از مؤلفه‌ها را به صورت تکی اجرا کنند و می‌توانند درخواست‌های هر کاربری را بپذیرند. در حال حاضر فقط برنامه های سیستم می توانند از این ویژگی استفاده کنند.

این تسهیلات:

  • منابع را حفظ می کند
  • داوری یک یا چند منبع مشترک بین کاربران
  • با استفاده از یک اتصال سرور واحد، سربار شبکه را کاهش می دهد

برای نمایش جریان مجوزها با چندین کاربر، نمودار زیر را ببینید.

مجوزهای چند کاربره جریان دارد

شکل 1. مجوزهای چند کاربر

یک مؤلفه singleton را فعال کنید

برای شناسایی یک برنامه به عنوان تک‌تون، android:singleUser="true" را به سرویس، گیرنده یا ارائه‌دهنده خود در مانیفست Android اضافه کنید.

سیستم آن مؤلفه را در فرآیندی که فقط به عنوان کاربر 0 اجرا می شود، نمونه سازی می کند. هر درخواستی برای اتصال به آن ارائه دهنده یا سرویس، یا پخش به آن گیرنده، از هر کاربری به فرآیند کاربر 0 هدایت می شود. اگر این تنها مؤلفه در برنامه شما باشد، تنها یک نمونه از برنامه شما اجرا می شود.

فعالیت‌های بسته شما همچنان در فرآیند جداگانه‌ای برای هر کاربر راه‌اندازی می‌شود، و UID در محدوده UID آن کاربر قرار دارد (مانند 1010034).

با کاربران تعامل داشته باشید

مجوزها را تنظیم کنید

این مجوزها مورد نیاز است:

INTERACT_ACROSS_USERS (signature|system)
INTERACT_ACROSS_USERS_FULL (signature)

از API ها استفاده کنید

از API های زیر برای آگاه کردن برنامه ها از چندین کاربر استفاده کنید.

  1. دسته کاربر را از تماس های ورودی Binder استخراج کنید:
    • int userHandle = UserHandle.getCallingUserId()
  2. از API های جدید و محافظت شده برای شروع خدمات، فعالیت ها، پخش ها در یک کاربر خاص استفاده کنید:
    • Context.startActivityAsUser(Intent, UserHandle)
    • Context.bindServiceAsUser(Intent, …, UserHandle)
    • Context.sendBroadcastAsUser(Intent, … , UserHandle)
    • Context.startServiceAsUser(Intent, …, UserHandle)
    UserHandle می تواند یک کاربر صریح یا یکی از دسته های ویژه باشد: UserHandle.CURRENT یا UserHandle.ALL . CURRENT نشان دهنده کاربری است که در حال حاضر در پیش زمینه است. زمانی که می خواهید پخشی را برای همه کاربران ارسال کنید از ALL استفاده کنید.
  3. با اجزای برنامه خود ارتباط برقرار کنید: (INTERACT_ACROSS_USERS) یا با مؤلفه‌های موجود در برنامه‌های دیگر: (INTERACT_ACROSS_USERS_FULL)
  4. ممکن است لازم باشد اجزای پراکسی ایجاد کنید که در فرآیند کاربر اجرا شوند و سپس به مولفه singleUser در کاربر 0 دسترسی پیدا کنند.
  5. پرس و جو از کاربران و دسته آنها با سرویس جدید سیستم UserManager :
    • UserManager.getUsers()
    • UserManager.getUserInfo()
    • UserManager.supportsMultipleUsers()
    • UserManager.getUserSerialNumber(int userHandle) - یک عدد غیر بازیافتی که مربوط به دسته کاربر است.
    • UserManager.getUserHandle(int serialNumber)
    • UserManager.getUserProfiles() - مجموعه ای از پروفایل های خود و مدیریت شده را در صورت وجود برمی گرداند.
  6. برای گوش دادن به کاربران خاص یا همه و تماس‌های پاسخ‌دهی با 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() برای غیرفعال کردن کل برنامه استفاده کند.