چندین کاربر را مدیریت کنید

این راهنمای توسعه‌دهنده توضیح می‌دهد که چگونه کنترل‌کننده خط‌مشی دستگاه شما (DPC) می‌تواند چندین کاربر Android را در دستگاه‌های اختصاصی مدیریت کند.

نمای کلی

DPC شما می تواند به چندین نفر کمک کند تا یک دستگاه اختصاصی واحد را به اشتراک بگذارند. DPC شما که روی یک دستگاه کاملاً مدیریت شده اجرا می شود می تواند دو نوع کاربر ایجاد و مدیریت کند:

  • کاربران ثانویه کاربران اندرویدی هستند که برنامه‌ها و داده‌های جداگانه بین جلسات ذخیره می‌شوند. شما کاربر را با یک جزء مدیریت مدیریت می کنید. این کاربران برای مواردی مفید هستند که یک دستگاه در شروع یک شیفت تحویل گرفته می شود، مانند رانندگان تحویل یا کارکنان امنیتی.
  • کاربران زودگذر کاربران ثانویه ای هستند که وقتی کاربر متوقف می شود، سوئیچ می کند یا دستگاه راه اندازی مجدد می شود، سیستم آنها را حذف می کند. این کاربران برای مواردی مفید هستند که داده ها را می توان پس از پایان جلسه حذف کرد، مانند کیوسک های اینترنتی با دسترسی عمومی.

شما از DPC موجود خود برای مدیریت دستگاه اختصاصی و کاربران ثانویه استفاده می کنید. زمانی که کاربران ثانویه جدید را ایجاد می‌کنید، یک جزء سرپرست در DPC شما، خود را به عنوان سرپرست برای کاربران ثانویه تنظیم می‌کند.

کاربر اصلی و دو کاربر ثانویه.
شکل 1. کاربران اولیه و ثانویه که توسط ادمین هایی از همان DPC مدیریت می شوند

مدیران یک کاربر ثانویه باید به همان بسته ای تعلق داشته باشند که سرپرست دستگاه کاملاً مدیریت شده است. برای ساده سازی توسعه، توصیه می کنیم یک ادمین را بین دستگاه و کاربران ثانویه به اشتراک بگذارید.

مدیریت چند کاربر در دستگاه‌های اختصاصی معمولاً به اندروید 9.0 نیاز دارد، اما برخی از روش‌های مورد استفاده در این راهنمای توسعه‌دهنده در نسخه‌های قبلی اندروید موجود است.

کاربران ثانویه

کاربران ثانویه می توانند به Wifi متصل شوند و می توانند شبکه های جدید را پیکربندی کنند. با این حال، آنها نمی توانند شبکه ها را ویرایش یا حذف کنند، حتی شبکه هایی که ایجاد کرده اند.

کاربران ایجاد کنید

DPC شما می‌تواند کاربران بیشتری را در پس‌زمینه ایجاد کند و سپس آنها را به پیش‌زمینه تغییر دهد. این فرآیند برای کاربران ثانویه و زودگذر تقریباً یکسان است. مراحل زیر را در ادمین های دستگاه کاملاً مدیریت شده و کاربر ثانویه اجرا کنید:

  1. DevicePolicyManager.createAndManageUser() را فراخوانی کنید. برای ایجاد یک کاربر زودگذر، MAKE_USER_EPHEMERAL را در آرگومان پرچم‌ها قرار دهید.
  2. برای راه اندازی کاربر در پس زمینه DevicePolicyManager.startUserInBackground() را فراخوانی کنید. کاربر شروع به اجرا می کند، اما شما می خواهید قبل از آوردن کاربر به پیش زمینه و نشان دادن آن به شخصی که از دستگاه استفاده می کند، تنظیمات را تمام کنید.
  3. در ادمین کاربر ثانویه، با DevicePolicyManager.setAffiliationIds() تماس بگیرید تا کاربر جدید را به کاربر اصلی وابسته کنید. هماهنگی DPC را در زیر ببینید.
  4. در ادمین دستگاه کاملاً مدیریت شده، با DevicePolicyManager.switchUser() تماس بگیرید تا کاربر را به پیش زمینه تغییر دهید.

نمونه زیر نشان می دهد که چگونه می توانید مرحله 1 را به DPC خود اضافه کنید:

کاتلین

val dpm = getContext().getSystemService(Context.DEVICE_POLICY_SERVICE)
        as DevicePolicyManager

// If possible, reuse an existing affiliation ID across the
// primary user and (later) the ephemeral user.
val identifiers = dpm.getAffiliationIds(adminName)
if (identifiers.isEmpty()) {
    identifiers.add(UUID.randomUUID().toString())
    dpm.setAffiliationIds(adminName, identifiers)
}

// Pass an affiliation ID to the ephemeral user in the admin extras.
val adminExtras = PersistableBundle()
adminExtras.putString(AFFILIATION_ID_KEY, identifiers.first())
// Include any other config for the new user here ...

// Create the ephemeral user, using this component as the admin.
try {
    val ephemeralUser = dpm.createAndManageUser(
            adminName,
            "tmp_user",
            adminName,
            adminExtras,
            DevicePolicyManager.MAKE_USER_EPHEMERAL or
                    DevicePolicyManager.SKIP_SETUP_WIZARD)

} catch (e: UserManager.UserOperationException) {
    if (e.userOperationResult ==
            UserManager.USER_OPERATION_ERROR_MAX_USERS) {
        // Find a way to free up users...
    }
}

جاوا

DevicePolicyManager dpm = (DevicePolicyManager)
    getContext().getSystemService(Context.DEVICE_POLICY_SERVICE);

// If possible, reuse an existing affiliation ID across the
// primary user and (later) the ephemeral user.
Set<String> identifiers = dpm.getAffiliationIds(adminName);
if (identifiers.isEmpty()) {
  identifiers.add(UUID.randomUUID().toString());
  dpm.setAffiliationIds(adminName, identifiers);
}

// Pass an affiliation ID to the ephemeral user in the admin extras.
PersistableBundle adminExtras = new PersistableBundle();
adminExtras.putString(AFFILIATION_ID_KEY, identifiers.iterator().next());
// Include any other config for the new user here ...

// Create the ephemeral user, using this component as the admin.
try {
  UserHandle ephemeralUser = dpm.createAndManageUser(
      adminName,
      "tmp_user",
      adminName,
      adminExtras,
      DevicePolicyManager.MAKE_USER_EPHEMERAL |
          DevicePolicyManager.SKIP_SETUP_WIZARD);

} catch (UserManager.UserOperationException e) {
  if (e.getUserOperationResult() ==
      UserManager.USER_OPERATION_ERROR_MAX_USERS) {
    // Find a way to free up users...
  }
}

وقتی کاربر جدیدی ایجاد می‌کنید یا راه‌اندازی می‌کنید، می‌توانید با گرفتن استثنای UserOperationException و فراخوانی getUserOperationResult() دلیل هر گونه خرابی را بررسی کنید. تجاوز از محدودیت های کاربر دلایل رایج شکست هستند:

ایجاد یک کاربر ممکن است کمی طول بکشد. اگر مرتباً کاربر ایجاد می‌کنید، می‌توانید با تهیه یک کاربر آماده در پس‌زمینه، تجربه کاربری را بهبود ببخشید. ممکن است لازم باشد مزایای یک کاربر آماده را با حداکثر تعداد کاربران مجاز در یک دستگاه متعادل کنید.

شناسایی

پس از ایجاد یک کاربر جدید، باید به کاربر با شماره سریال ثابت مراجعه کنید. UserHandle ادامه ندهید زیرا هنگام ایجاد و حذف کاربران، سیستم آنها را بازیافت می کند. شماره سریال را با تماس UserManager.getSerialNumberForUser() دریافت کنید:

کاتلین

// After calling createAndManageUser() use a device-unique serial number
// (that isn’t recycled) to identify the new user.
secondaryUser?.let {
    val userManager = getContext().getSystemService(UserManager::class.java)
    val ephemeralUserId = userManager!!.getSerialNumberForUser(it)
    // Save the serial number to storage  ...
}

جاوا

// After calling createAndManageUser() use a device-unique serial number
// (that isn’t recycled) to identify the new user.
if (secondaryUser != null) {
  UserManager userManager = getContext().getSystemService(UserManager.class);
  long ephemeralUserId = userManager.getSerialNumberForUser(secondaryUser);
  // Save the serial number to storage  ...
}

پیکربندی کاربر

بسته به نیاز کاربران خود، می توانید تنظیمات کاربران ثانویه را سفارشی کنید. هنگام فراخوانی createAndManageUser() می‌توانید پرچم‌های زیر را اضافه کنید:

SKIP_SETUP_WIZARD
از اجرای جادوگر تنظیم کاربر جدید که به‌روزرسانی‌ها را بررسی و نصب می‌کند، رد می‌شود، از کاربر می‌خواهد یک حساب Google به همراه خدمات Google اضافه کند، و قفل صفحه را تنظیم می‌کند. این ممکن است کمی طول بکشد و ممکن است برای همه کاربران قابل اجرا نباشد - برای مثال کیوسک های اینترنتی عمومی.
LEAVE_ALL_SYSTEM_APPS_ENABLED
همه برنامه های سیستم را در کاربر جدید فعال می کند. اگر این پرچم را تنظیم نکنید، کاربر جدید فقط شامل حداقل مجموعه ای از برنامه هایی است که تلفن برای کارکردن به آنها نیاز دارد—معمولاً مرورگر فایل، شماره گیر تلفن، مخاطبین و پیامک.

چرخه عمر کاربر را دنبال کنید

DPC شما (اگر سرپرست دستگاه کاملاً مدیریت شده باشد) ممکن است بداند که کاربران ثانویه چه زمانی تغییر می کنند. برای اجرای کارهای بعدی پس از تغییرات، این روش‌های برگشت تماس را در زیرکلاس DeviceAdminReceiver DPC خود لغو کنید:

onUserStarted()
پس از راه اندازی سیستم یک کاربر فراخوانی می شود. ممکن است این کاربر همچنان در حال راه‌اندازی یا در پس‌زمینه باشد. می توانید کاربر را از آرگومان startedUser دریافت کنید.
onUserSwitched()
پس از تغییر سیستم به کاربر دیگری فراخوانی می شود. می‌توانید کاربر جدیدی را که اکنون در پیش‌زمینه اجرا می‌شود، از آرگومان switchedUser دریافت کنید.
onUserStopped()
پس از اینکه سیستم کاربر را متوقف کرد، به دلیل خروج از سیستم، تغییر به کاربر جدید (اگر کاربر زودگذر) یا DPC شما کاربر را متوقف کرد، تماس گرفته می‌شود. می توانید کاربر را از آرگومان stoppedUser دریافت کنید.
onUserAdded()
هنگامی که سیستم یک کاربر جدید اضافه می کند، فراخوانی می شود. معمولاً وقتی DPC شما پاسخ تماس را دریافت می کند، کاربران ثانویه به طور کامل تنظیم نمی شوند. می توانید کاربر را از آرگومان newUser دریافت کنید.
onUserRemoved()
پس از حذف کاربر توسط سیستم تماس گرفته می شود. از آنجایی که کاربر قبلاً حذف شده است، نمی توانید به کاربری که با آرگومان removedUser نشان داده شده است دسترسی پیدا کنید.

برای اطلاع از اینکه سیستم کاربر را به پیش‌زمینه می‌آورد یا کاربر را به پس‌زمینه می‌فرستد، برنامه‌ها می‌توانند یک گیرنده برای پخش‌های ACTION_USER_FOREGROUND و ACTION_USER_BACKGROUND ثبت کنند.

کاربران را کشف کنید

برای دریافت همه کاربران ثانویه، مدیر یک دستگاه کاملاً مدیریت شده می‌تواند با DevicePolicyManager.getSecondaryUsers() تماس بگیرد. نتایج شامل هر کاربر ثانویه یا زودگذری است که مدیر ایجاد کرده است. نتایج همچنین شامل هر کاربر ثانویه (یا کاربر مهمان) است که شخصی که از دستگاه استفاده می کند ممکن است ایجاد کرده باشد. نتایج شامل نمایه‌های کاری نمی‌شود، زیرا آنها کاربران ثانویه نیستند. نمونه زیر نشان می دهد که چگونه می توانید از این روش استفاده کنید:

کاتلین

// The device is stored for the night. Stop all running secondary users.
dpm.getSecondaryUsers(adminName).forEach {
    dpm.stopUser(adminName, it)
}

جاوا

// The device is stored for the night. Stop all running secondary users.
for (UserHandle user : dpm.getSecondaryUsers(adminName)) {
  dpm.stopUser(adminName, user);
}

در اینجا روش های دیگری وجود دارد که می توانید برای اطلاع از وضعیت کاربران ثانویه تماس بگیرید:

DevicePolicyManager.isEphemeralUser()
با این روش از ادمین یک کاربر ثانویه تماس بگیرید تا متوجه شوید که آیا این کاربر زودگذر است یا خیر.
DevicePolicyManager.isAffiliatedUser()
با این روش از مدیر یک کاربر ثانویه تماس بگیرید تا متوجه شوید که آیا این کاربر به کاربر اصلی وابسته است یا خیر. برای کسب اطلاعات بیشتر در مورد وابستگی، به هماهنگی DPC در زیر مراجعه کنید.

مدیریت کاربر

اگر می‌خواهید چرخه عمر کاربر را به طور کامل مدیریت کنید، می‌توانید APIها را برای کنترل دقیق زمان و نحوه تغییر کاربران توسط دستگاه فراخوانی کنید. به عنوان مثال، زمانی که یک دستگاه برای مدتی از دستگاه استفاده نشده است، می‌توانید کاربر را حذف کنید یا می‌توانید سفارش‌های ارسال‌نشده را قبل از پایان شیفت شخص به سرور ارسال کنید.

خروج از سیستم

Android 9.0 یک دکمه خروج از سیستم را به صفحه قفل اضافه کرد تا شخصی که از دستگاه استفاده می کند بتواند جلسه خود را پایان دهد. پس از ضربه زدن روی دکمه، سیستم کاربر ثانویه را متوقف می کند، اگر زودگذر باشد، کاربر را حذف می کند و کاربر اصلی به پیش زمینه باز می گردد. وقتی کاربر اصلی در پیش زمینه باشد، اندروید دکمه را پنهان می کند زیرا کاربر اصلی نمی تواند از سیستم خارج شود.

Android به‌طور پیش‌فرض دکمه پایان جلسه را نشان نمی‌دهد، اما سرپرست شما (یک دستگاه کاملاً مدیریت شده) می‌تواند با فراخوانی DevicePolicyManager.setLogoutEnabled() آن را فعال کند. اگر می‌خواهید وضعیت فعلی دکمه را تأیید کنید، با DevicePolicyManager.isLogoutEnabled() تماس بگیرید.

ادمین یک کاربر ثانویه می تواند به صورت برنامه ریزی شده کاربر را از سیستم خارج کرده و به کاربر اصلی بازگردد. ابتدا تأیید کنید که کاربران ثانویه و اصلی به آن وابسته هستند، سپس DevicePolicyManager.logoutUser() را فراخوانی کنید. اگر کاربر از سیستم خارج شده یک کاربر زودگذر باشد، سیستم متوقف می شود و سپس کاربر را حذف می کند.

کاربران را تغییر دهید

برای جابجایی به یک کاربر ثانویه دیگر، سرپرست یک دستگاه کاملاً مدیریت شده می‌تواند DevicePolicyManager.switchUser() را فراخوانی کند. به عنوان یک راحتی، می توانید برای تغییر به کاربر اصلی، null ارسال کنید.

یک کاربر را متوقف کنید

برای متوقف کردن یک کاربر ثانویه، یک DPC که دارای یک دستگاه کاملاً مدیریت شده است می‌تواند DevicePolicyManager.stopUser() را فراخوانی کند. اگر کاربر متوقف شده یک کاربر زودگذر باشد، کاربر متوقف شده و سپس حذف می شود.

توصیه می‌کنیم تا حد امکان کاربران را متوقف کنید تا کمتر از حداکثر تعداد کاربران در حال اجرا دستگاه باقی بمانید.

حذف یک کاربر

برای حذف دائمی یک کاربر ثانویه، یک DPC می‌تواند یکی از روش‌های DevicePolicyManager زیر را فراخوانی کند:

  • مدیر یک دستگاه کاملاً مدیریت شده می تواند removeUser() را فراخوانی کند.
  • ادمین کاربر ثانویه می تواند wipeData() را فراخوانی کند.

این سیستم، کاربران زودگذر را هنگامی که از سیستم خارج می شوند، متوقف می شوند یا از آن خارج می شوند، حذف می کند.

UI پیش فرض را غیرفعال کنید

اگر DPC شما یک رابط کاربری برای مدیریت کاربران ارائه می‌دهد، می‌توانید رابط چند کاربره داخلی اندروید را غیرفعال کنید. می توانید این کار را با فراخوانی DevicePolicyManager.setLogoutEnabled() و افزودن محدودیت DISALLOW_USER_SWITCH همانطور که در مثال زیر نشان داده شده است انجام دهید:

کاتلین

// Explicitly disallow logging out using Android UI (disabled by default).
dpm.setLogoutEnabled(adminName, false)

// Disallow switching users in Android's UI. This DPC can still
// call switchUser() to manage users.
dpm.addUserRestriction(adminName, UserManager.DISALLOW_USER_SWITCH)

جاوا

// Explicitly disallow logging out using Android UI (disabled by default).
dpm.setLogoutEnabled(adminName, false);

// Disallow switching users in Android's UI. This DPC can still
// call switchUser() to manage users.
dpm.addUserRestriction(adminName, UserManager.DISALLOW_USER_SWITCH);

فردی که از دستگاه استفاده می‌کند نمی‌تواند کاربران ثانویه را با رابط کاربری داخلی Android اضافه کند زیرا سرپرستان دستگاه‌های کاملاً مدیریت شده به‌طور خودکار محدودیت کاربر DISALLOW_ADD_USER را اضافه می‌کنند.

پیام های جلسه

هنگامی که شخصی که از دستگاه استفاده می کند به یک کاربر جدید سوئیچ می کند، Android پانلی را برای برجسته کردن سوئیچ نشان می دهد. اندروید پیام های زیر را نشان می دهد:

  • هنگامی که دستگاه از کاربر اصلی به کاربر ثانویه تغییر می کند ، پیام شروع کاربر-نشست نشان داده می شود.
  • هنگامی که دستگاه از کاربر ثانویه به کاربر اصلی برمی‌گردد ، پیام جلسه کاربر نهایی نشان داده می‌شود.

هنگام جابجایی بین دو کاربر ثانویه، سیستم پیام ها را نشان نمی دهد.

از آنجایی که پیام‌ها ممکن است برای همه موقعیت‌ها مناسب نباشند، می‌توانید متن این پیام‌ها را تغییر دهید. به عنوان مثال، اگر راه حل شما از جلسات کاربر زودگذر استفاده می کند، می توانید آن را در پیام هایی مانند: توقف جلسه مرورگر و حذف داده های شخصی ...

سیستم پیام را فقط برای چند ثانیه نشان می دهد، بنابراین هر پیام باید یک عبارت کوتاه و واضح باشد. برای سفارشی کردن پیام‌ها، سرپرست شما می‌تواند روش‌های DevicePolicyManager setStartUserSessionMessage() و setEndUserSessionMessage() همانطور که در مثال زیر نشان داده شده است فراخوانی کند:

کاتلین

// Short, easy-to-read messages shown at the start and end of a session.
// In your app, store these strings in a localizable resource.
internal val START_USER_SESSION_MESSAGE = "Starting guest session…"
internal val END_USER_SESSION_MESSAGE = "Stopping & clearing data…"

// ...
dpm.setStartUserSessionMessage(adminName, START_USER_SESSION_MESSAGE)
dpm.setEndUserSessionMessage(adminName, END_USER_SESSION_MESSAGE)

جاوا

// Short, easy-to-read messages shown at the start and end of a session.
// In your app, store these strings in a localizable resource.
private static final String START_USER_SESSION_MESSAGE = "Starting guest session…";
private static final String END_USER_SESSION_MESSAGE = "Stopping & clearing data…";

// ...
dpm.setStartUserSessionMessage(adminName, START_USER_SESSION_MESSAGE);
dpm.setEndUserSessionMessage(adminName, END_USER_SESSION_MESSAGE);

برای حذف پیام های سفارشی خود و بازگشت به پیام های پیش فرض اندروید، null را پاس کنید. اگر باید متن پیام فعلی را بررسی کنید، با getStartUserSessionMessage() یا getEndUserSessionMessage() تماس بگیرید.

DPC شما باید پیام های محلی را برای منطقه فعلی کاربر تنظیم کند. همچنین باید پیام‌ها را در صورت تغییر مکان کاربر به‌روزرسانی کنید:

کاتلین

override fun onReceive(context: Context?, intent: Intent?) {
    // Added the <action android:name="android.intent.action.LOCALE_CHANGED" />
    // intent filter for our DeviceAdminReceiver subclass in the app manifest file.
    if (intent?.action === ACTION_LOCALE_CHANGED) {

        // Android's resources return a string suitable for the new locale.
        getManager(context).setStartUserSessionMessage(
                getWho(context),
                context?.getString(R.string.start_user_session_message))

        getManager(context).setEndUserSessionMessage(
                getWho(context),
                context?.getString(R.string.end_user_session_message))
    }
    super.onReceive(context, intent)
}

جاوا

public void onReceive(Context context, Intent intent) {
  // Added the <action android:name="android.intent.action.LOCALE_CHANGED" />
  // intent filter for our DeviceAdminReceiver subclass in the app manifest file.
  if (intent.getAction().equals(ACTION_LOCALE_CHANGED)) {

    // Android's resources return a string suitable for the new locale.
    getManager(context).setStartUserSessionMessage(
        getWho(context),
        context.getString(R.string.start_user_session_message));

    getManager(context).setEndUserSessionMessage(
        getWho(context),
        context.getString(R.string.end_user_session_message));
  }
  super.onReceive(context, intent);
}

هماهنگی DPC

مدیریت کاربران ثانویه معمولاً به دو نمونه از DPC شما نیاز دارد - یکی که مالک دستگاه کاملاً مدیریت شده است و دیگری مالک کاربر ثانویه است. هنگام ایجاد یک کاربر جدید، ادمین دستگاه کاملاً مدیریت شده نمونه دیگری از خود را به عنوان سرپرست کاربر جدید تنظیم می کند.

کاربران وابسته

برخی از APIهای موجود در این راهنمای توسعه‌دهنده تنها زمانی کار می‌کنند که کاربران ثانویه وابسته باشند. از آنجایی که وقتی کاربران ثانویه غیروابسته جدیدی به دستگاه اضافه می‌کنید، Android برخی از ویژگی‌ها را غیرفعال می‌کند (مثلاً گزارش‌گیری از شبکه)، باید در اسرع وقت کاربران را وابسته کنید. مثال زیر را در Setup ببینید.

راه اندازی

قبل از اینکه به افراد اجازه استفاده از آنها را بدهید، کاربران ثانویه جدیدی (از DPC که مالک کاربر ثانویه است) راه اندازی کنید. می‌توانید این تنظیمات را از DeviceAdminReceiver.onEnabled() انجام دهید. اگر قبلاً هر گونه اضافی ادمین را در فراخوانی برای createAndManageUser() تنظیم کرده اید، می توانید مقادیر را از آرگومان intent دریافت کنید. مثال زیر یک DPC را نشان می دهد که به یک کاربر ثانویه جدید در تماس برگشتی وابسته است:

کاتلین

override fun onEnabled(context: Context?, intent: Intent?) {
    super.onEnabled(context, intent)

    // Get the affiliation ID (our DPC previously put in the extras) and
    // set the ID for this new secondary user.
    intent?.getStringExtra(AFFILIATION_ID_KEY)?.let {
        val dpm = getManager(context)
        dpm.setAffiliationIds(getWho(context), setOf(it))
    }
    // Continue setup of the new secondary user ...
}

جاوا

public void onEnabled(Context context, Intent intent) {
  // Get the affiliation ID (our DPC previously put in the extras) and
  // set the ID for this new secondary user.
  String affiliationId = intent.getStringExtra(AFFILIATION_ID_KEY);
  if (affiliationId != null) {
    DevicePolicyManager dpm = getManager(context);
    dpm.setAffiliationIds(getWho(context),
        new HashSet<String>(Arrays.asList(affiliationId)));
  }
  // Continue setup of the new secondary user ...
}

RPC بین DPCها

حتی اگر دو نمونه DPC تحت کاربران جداگانه اجرا شوند، DPCهای صاحب دستگاه و کاربران ثانویه می توانند با یکدیگر ارتباط برقرار کنند. از آنجایی که فراخوانی سرویس DPC دیگر از مرزهای کاربر عبور می کند، DPC شما نمی تواند bindService() همانطور که معمولاً در Android انجام می دهید فراخوانی کند. برای اتصال به سرویسی که در کاربر دیگری اجرا می شود، DevicePolicyManager.bindDeviceAdminServiceAsUser() را فراخوانی کنید.

کاربر اصلی و دو کاربر ثانویه وابسته که با RPC تماس می گیرند.
شکل 2. مدیران کاربران اصلی و ثانویه وابسته که با روش های خدمات تماس می گیرند

DPC شما فقط می‌تواند به سرویس‌های در حال اجرا در کاربرانی که توسط DevicePolicyManager.getBindDeviceAdminTargetUsers() بازگردانده شده‌اند متصل شود. مثال زیر مدیر یک کاربر ثانویه را نشان می دهد که به سرپرست دستگاه کاملاً مدیریت شده متصل شده است:

کاتلین

// From a secondary user, the list contains just the primary user.
dpm.getBindDeviceAdminTargetUsers(adminName).forEach {

    // Set up the callbacks for the service connection.
    val intent = Intent(mContext, FullyManagedDeviceService::class.java)
    val serviceconnection = object : ServiceConnection {
        override fun onServiceConnected(componentName: ComponentName,
                                        iBinder: IBinder) {
            // Call methods on service ...
        }
        override fun onServiceDisconnected(componentName: ComponentName) {
            // Clean up or reconnect if needed ...
        }
    }

    // Bind to the service as the primary user [it].
    val bindSuccessful = dpm.bindDeviceAdminServiceAsUser(adminName,
            intent,
            serviceconnection,
            Context.BIND_AUTO_CREATE,
            it)
}

جاوا

// From a secondary user, the list contains just the primary user.
List<UserHandle> targetUsers = dpm.getBindDeviceAdminTargetUsers(adminName);
if (targetUsers.isEmpty()) {
  // If the users aren't affiliated, the list doesn't contain any users.
  return;
}

// Set up the callbacks for the service connection.
Intent intent = new Intent(mContext, FullyManagedDeviceService.class);
ServiceConnection serviceconnection = new ServiceConnection() {
  @Override
  public void onServiceConnected(
      ComponentName componentName, IBinder iBinder) {
    // Call methods on service ...
  }

  @Override
  public void onServiceDisconnected(ComponentName componentName) {
    // Clean up or reconnect if needed ...
  }
};

// Bind to the service as the primary user.
UserHandle primaryUser = targetUsers.get(0);
boolean bindSuccessful = dpm.bindDeviceAdminServiceAsUser(
    adminName,
    intent,
    serviceconnection,
    Context.BIND_AUTO_CREATE,
    primaryUser);

منابع اضافی

برای کسب اطلاعات بیشتر در مورد دستگاه های اختصاصی، اسناد زیر را مطالعه کنید: