Birden fazla kullanıcıyı yönetme

Bu geliştirici kılavuzunda, cihaz politikası denetleyicinizin (DPC) özel cihazlarda birden fazla Android kullanıcısını nasıl yönetebileceği açıklanmaktadır.

Genel bakış

DPC'niz, birden fazla kişinin tek bir özel cihazı paylaşmasına yardımcı olabilir. Tümüyle yönetilen bir cihazda çalışan DPC'niz iki tür kullanıcı oluşturabilir ve yönetebilir:

  • İkincil kullanıcılar, ayrı uygulamaları ve oturumlar arasında kaydedilmiş verileri olan Android kullanıcılarıdır. Kullanıcıyı bir yönetici bileşeniyle yönetirsiniz. Bu kullanıcılar, cihazın vardiyanın başında teslim alındığı durumlarda (ör. teslimat şoförleri veya güvenlik çalışanları) faydalıdır.
  • Geçici kullanıcılar, kullanıcı durduğunda, sistemden ayrıldığında veya cihaz yeniden başlatıldığında sistemin sildiği ikincil kullanıcılardır. Bu kullanıcılar, oturum sona erdikten sonra verilerin silinebileceği (ör. herkese açık internet kioskları) durumlarda kullanışlıdır.

Özel cihazı ve ikincil kullanıcıları yönetmek için mevcut DPC'nizi kullanırsınız. DPC'nizdeki bir yönetici bileşeni, yeni ikincil kullanıcıları oluşturduğunuzda kendisini bu kullanıcılar için yönetici olarak ayarlar.

Birincil kullanıcı ve iki ikincil kullanıcı.
Şekil 1. Aynı DPC'den yöneticiler tarafından yönetilen birincil ve ikincil kullanıcılar

İkincil kullanıcının yöneticileri, tümüyle yönetilen cihazın yöneticisiyle aynı pakete ait olmalıdır. Geliştirme sürecini basitleştirmek için cihaz ile ikincil kullanıcılar arasında bir yönetici paylaşmanızı öneririz.

Özel cihazlarda birden fazla kullanıcıyı yönetmek için genellikle Android 9.0 gerekir. Ancak bu geliştirici kılavuzunda kullanılan yöntemlerden bazıları Android'in önceki sürümlerinde de kullanılabilir.

Kullanıcı oluşturma

DPC'niz arka planda ek kullanıcılar oluşturabilir ve ardından bunları ön plana geçirebilir. Bu süreç hem ikincil hem de geçici kullanıcılar için hemen hemen aynıdır. Aşağıdaki adımları, tümüyle yönetilen cihazın ve ikincil kullanıcının yöneticilerine uygulayın:

  1. DevicePolicyManager.createAndManageUser() numaralı telefonu arayın. Geçici kullanıcı oluşturmak için flags bağımsız değişkenine MAKE_USER_EPHEMERAL ifadesini ekleyin.
  2. Kullanıcıyı arka planda başlatmak için DevicePolicyManager.startUserInBackground() numaralı telefonu arayın. Kullanıcı çalışmaya başlar, ancak kullanıcıyı ön plana getirip cihazı kullanan kişiye göstermeden önce kurulumu bitirmeniz gerekir.
  3. İkincil kullanıcının yöneticisinde, yeni kullanıcıyı birincil kullanıcıyla ilişkilendirmek için DevicePolicyManager.setAffiliationIds() numarasını arayın. Aşağıdaki DPC koordinasyonu bölümüne bakın.
  4. Kullanıcıyı ön plana geçirmek için tümüyle yönetilen cihazın yöneticisinde DevicePolicyManager.switchUser() numaralı telefonu arayın.

Aşağıdaki örnekte, 1. adımı DPC'nize nasıl ekleyebileceğiniz gösterilmektedir:

Kotlin

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...
    }
}

Java

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...
  }
}

Yeni bir kullanıcı oluşturduğunuzda veya başlattığınızda UserOperationException istisnasını yakalayıp getUserOperationResult() yöntemini çağırarak hataların nedenini kontrol edebilirsiniz. Kullanıcı sınırlarının aşılması, yaygın olarak görülen hata nedenleridir:

Kullanıcı oluşturma işlemi biraz zaman alabilir. Sık sık kullanıcı oluşturuyorsanız, çalışmaya hazır bir kullanıcıyı arka planda hazırlayarak kullanıcı deneyimini iyileştirebilirsiniz. Kullanıma hazır bir kullanıcının avantajları ile bir cihazda izin verilen maksimum kullanıcı sayısı arasında denge kurmanız gerekebilir.

Tanımlama

Yeni bir kullanıcı oluşturduktan sonra, kalıcı seri numarasıyla kullanıcıya başvurmalısınız. UserHandle öğesini devam ettirmeyin çünkü siz kullanıcıları oluşturup silerken sistem bu değerleri geri dönüştürür. UserManager.getSerialNumberForUser() numarasını arayarak seri numarasını öğrenin:

Kotlin

// 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  ...
}

Java

// 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  ...
}

Kullanıcı yapılandırması

Kullanıcılarınızın ihtiyaçlarına bağlı olarak, ikincil kullanıcıların ayarlarını özelleştirebilirsiniz. createAndManageUser() çağırırken aşağıdaki işaretleri ekleyebilirsiniz:

SKIP_SETUP_WIZARD
Güncellemeleri kontrol edip yükleyen, kullanıcıdan Google hizmetleriyle birlikte bir Google Hesabı eklemesini isteyen ve ekran kilidi ayarlayan yeni kullanıcı kurulum sihirbazını çalıştırmayı atlar. Bu işlem biraz zaman alabilir ve tüm kullanıcılar (örneğin, herkese açık internet kioskları) için geçerli olmayabilir.
LEAVE_ALL_SYSTEM_APPS_ENABLED
Tüm sistem uygulamalarını yeni kullanıcıda etkin durumda bırakır. Bu işareti ayarlamazsanız yeni kullanıcı, telefonun çalıştırması gereken minimum uygulama grubunu (genellikle bir dosya tarayıcısı, telefon numara çevirici, kişiler ve SMS mesajları) içerir.

Kullanıcı yaşam döngüsünü takip edin

DPC'niz (tamamen yönetilen cihazın yöneticisiyseniz) ikincil kullanıcıların ne zaman değiştiğini bilmek yararlı olabilir. Değişikliklerden sonra takip görevleri çalıştırmak için DPC'nizin DeviceAdminReceiver alt sınıfında aşağıdaki geri çağırma yöntemlerini geçersiz kılın:

onUserStarted()
Sistem, kullanıcıyı başlattıktan sonra çağrılır. Bu kullanıcı kurulum aşamasında veya arka planda çalışıyor olabilir. Kullanıcıyı startedUser bağımsız değişkeninden edinebilirsiniz.
onUserSwitched()
Sistem farklı bir kullanıcıya geçtikten sonra çağrılır. Ön planda çalışan yeni kullanıcıyı switchedUser bağımsız değişkeninden edinebilirsiniz.
onUserStopped()
Oturumu kapattığı, yeni bir kullanıcıya geçtiği (kullanıcı geçiciyse) veya DPC'niz kullanıcıyı durdurduğu için sistem kullanıcıyı durdurduktan sonra çağrılır. Kullanıcıyı stoppedUser bağımsız değişkeninden öğrenebilirsiniz.
onUserAdded()
Sistem yeni bir kullanıcı eklediğinde çağrılır. Genellikle, DPC'niz geri çağırmayı aldığında ikincil kullanıcılar tam olarak ayarlanmamıştır. Kullanıcıyı newUser bağımsız değişkeninden öğrenebilirsiniz.
onUserRemoved()
Sistem, kullanıcıyı sildikten sonra çağrılır. Kullanıcı zaten silindiğinden removedUser bağımsız değişkeniyle temsil edilen kullanıcıya erişemezsiniz.

Uygulamalar, sistemin bir kullanıcıyı ne zaman ön plana getirdiğini veya arka plana ne zaman gönderdiğini öğrenmek amacıyla ACTION_USER_FOREGROUND ve ACTION_USER_BACKGROUND yayınları için bir alıcı kaydedebilir.

Kullanıcıları keşfedin

Tüm ikincil kullanıcıları almak için tümüyle yönetilen bir cihazın yöneticisi DevicePolicyManager.getSecondaryUsers() numaralı telefonu arayabilir. Sonuçlar, yöneticinin oluşturduğu tüm ikincil veya geçici kullanıcıları içerir. Sonuçlar, cihazı kullanan bir kişinin oluşturmuş olabileceği ikincil kullanıcılar (veya bir misafir kullanıcı) da içerir. İkincil kullanıcı olmadıkları için sonuçlar, iş profillerini içermez. Aşağıdaki örnekte bu yöntemi nasıl kullanabileceğiniz gösterilmektedir:

Kotlin

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

Java

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

İkincil kullanıcıların durumunu öğrenmek için kullanabileceğiniz diğer yöntemler şunlardır:

DevicePolicyManager.isEphemeralUser()
Bu kullanıcının geçici bir kullanıcı olup olmadığını öğrenmek için ikincil bir kullanıcının yöneticisinden bu yöntemi çağırın.
DevicePolicyManager.isAffiliatedUser()
Bu kullanıcının birincil kullanıcıyla ilişkili olup olmadığını öğrenmek için ikincil bir kullanıcının yöneticisinden bu yöntemi çağırın. Satış ortaklığı hakkında daha fazla bilgi edinmek için aşağıdaki DPC koordinasyonu bölümünü inceleyin.

Kullanıcı yönetimi

Kullanıcı yaşam döngüsünü tamamen yönetmek istiyorsanız cihazın kullanıcıları ne zaman ve nasıl değiştireceği konusunda ayrıntılı kontrol için API'leri çağırabilirsiniz. Örneğin, bir cihaz belirli bir süre kullanılmadığında bir kullanıcıyı silebilir veya kullanıcının vardiyası tamamlanmadan önce gönderilmemiş siparişleri bir sunucuya gönderebilirsiniz.

Çıkış

Android 9.0, cihazı kullanan bir kişinin oturumunu sonlandırabilmesi için kilit ekranına bir çıkış yapma düğmesi ekledi. Düğmeye dokunulduktan sonra sistem, ikincil kullanıcıyı durdurur, geçici bir kullanıcıysa kullanıcıyı siler ve birincil kullanıcı ön plana döner. Birincil kullanıcı çıkış yapamadığı için Android, birincil kullanıcı ön plandayken düğmeyi gizler.

Android, oturumu sonlandır düğmesini varsayılan olarak göstermez ancak yöneticiniz (tümüyle yönetilen bir cihazın) DevicePolicyManager.setLogoutEnabled() çağrısıyla bu düğmeyi etkinleştirebilir. Düğmenin mevcut durumunu onaylamanız gerekiyorsa DevicePolicyManager.isLogoutEnabled() numaralı telefonu arayın.

İkincil kullanıcının yöneticisi, programlı olarak kullanıcının oturumunu kapatabilir ve birincil kullanıcıya geri dönebilir. Öncelikle, ikincil ve birincil kullanıcıların ilişkili olduğunu onaylayın, ardından DevicePolicyManager.logoutUser() adlı kullanıcıyı arayın. Oturumunu kapatan kullanıcı geçici bir kullanıcıysa sistem, kullanıcıyı siler ve siler.

Kullanıcı değiştir

Tümüyle yönetilen bir cihazın yöneticisi, farklı bir ikincil kullanıcıya geçmek için DevicePolicyManager.switchUser() numarasını arayabilir. Kolaylık olması açısından null hesabını kullanarak birincil kullanıcıya geçebilirsiniz.

Kullanıcıyı durdurma

İkincil bir kullanıcıyı durdurmak için tümüyle yönetilen bir cihaza sahip olan DPC, DevicePolicyManager.stopUser() numaralı telefonu arayabilir. Durdurulan kullanıcı geçici bir kullanıcıysa kullanıcı durdurulur ve ardından silinir.

Cihazın maksimum çalışan kullanıcı sayısının altında kalmak için mümkün olduğunda kullanıcıları durdurmanızı öneririz.

Kullanıcı silme

İkincil bir kullanıcıyı kalıcı olarak silmek için DPC aşağıdaki DevicePolicyManager yöntemlerinden birini çağırabilir:

  • Tümüyle yönetilen bir cihazın yöneticisi removeUser() numaralı telefonu arayabilir.
  • İkincil kullanıcının bir yöneticisi wipeData() numarasını arayabilir.

Sistem, çıkış yaptıkları, durdurulduklarında veya geçiş yaptıklarında geçici kullanıcıları siler.

Varsayılan kullanıcı arayüzünü devre dışı bırak

DPC'niz kullanıcıları yönetmek için bir kullanıcı arayüzü sağlıyorsa Android'in yerleşik çok kullanıcılı arayüzünü devre dışı bırakabilirsiniz. Bu işlemi, DevicePolicyManager.setLogoutEnabled() yöntemini çağırıp aşağıdaki örnekte gösterildiği gibi DISALLOW_USER_SWITCH kısıtlamasını ekleyerek yapabilirsiniz:

Kotlin

// 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)

Java

// 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);

Tümüyle yönetilen cihazların yöneticileri DISALLOW_ADD_USER kullanıcı kısıtlamasını otomatik olarak eklediğinden, cihazı kullanan kişi Android'in yerleşik kullanıcı arayüzüyle ikincil kullanıcı ekleyemez.

Oturum mesajları

Bir cihazı kullanan kişi yeni bir kullanıcıya geçiş yaptığında Android, anahtarı vurgulayan bir panel gösterir. Android aşağıdaki mesajları gösterir:

  • Cihaz, birincil kullanıcıdan ikincil bir kullanıcıya geçiş yaptığında gösterilen kullanıcı oturumu başlatma mesajı.
  • Cihaz, ikincil bir kullanıcıdan birincil kullanıcıya döndüğünde gösterilen son kullanıcı oturumu mesajı.

İki ikincil kullanıcı arasında geçiş yapıldığında sistem, mesajları göstermez.

Mesajlar her durum için uygun olmayabileceğinden bu mesajların metnini değiştirebilirsiniz. Örneğin, çözümünüz geçici kullanıcı oturumları kullanıyorsa bunu mesajlara şu şekilde yansıtabilirsiniz: Tarayıcı oturumunu durdurma ve kişisel verileri silme...

Sistem, mesajı birkaç saniyeliğine gösterir. Bu nedenle her mesaj, kısa ve net bir ifade olmalıdır. Mesajları özelleştirmek için yöneticiniz DevicePolicyManager yöntemlerini setStartUserSessionMessage() ve setEndUserSessionMessage() aşağıdaki örnekte gösterildiği gibi çağırabilir:

Kotlin

// 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)

Java

// 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);

Özel mesajlarınızı silip Android'in varsayılan mesajlarına dönmek için null mesajını iletin. Mevcut mesaj metnini kontrol etmeniz gerekiyorsa getStartUserSessionMessage() veya getEndUserSessionMessage() numaralı telefonu arayın.

DPC'niz, kullanıcının geçerli yerel ayarı için yerelleştirilmiş mesajlar belirlemelidir. Ayrıca, kullanıcının yerel ayarı değiştiğinde mesajları güncellemeniz gerekir:

Kotlin

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)
}

Java

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 koordinasyonu

İkincil kullanıcıları yönetmek için genellikle DPC'nizin iki örneği gerekir. Bu örneklerden biri tamamen yönetilen cihaza, diğeri ise ikincil kullanıcıya aittir. Tümüyle yönetilen cihazın yöneticisi yeni bir kullanıcı oluştururken yeni kullanıcının yöneticisi olarak kendisinin başka bir örneğini ayarlar.

İlişkili kullanıcılar

Bu geliştirici kılavuzundaki API'lerden bazıları yalnızca ikincil kullanıcılar ilişkili olduğunda çalışır. Android, cihaza yeni ilişkili olmayan ikincil kullanıcılar eklediğinizde (örneğin, ağ günlük kaydı) bazı özellikleri devre dışı bıraktığından kullanıcıları en kısa sürede ilişkilendirmeniz gerekir. Aşağıdaki Kurulum bölümündeki örneğe bakın.

Kurulum

Kullanıcıların kullanması için önce yeni ikincil kullanıcıları (ikincil kullanıcının sahibi olan DPC'den) oluşturun. Bu kurulumu DeviceAdminReceiver.onEnabled() geri çağırmasından yapabilirsiniz. Daha önce createAndManageUser() çağrısında yönetici ekstraları ayarladıysanız değerleri intent bağımsız değişkeninden alabilirsiniz. Aşağıdaki örnekte, geri aramada yeni bir ikincil kullanıcıyı ilişkilendiren bir DPC gösterilmektedir:

Kotlin

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 ...
}

Java

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 ...
}

DPC'ler arasındaki RPC'ler

İki DPC örneği ayrı kullanıcılar altında çalışıyor olsa da cihazın sahibi olan DPC'ler ve ikincil kullanıcılar birbiriyle iletişim kurabilir. Başka bir DPC'nin hizmetini çağırmak kullanıcı sınırlarını aştığından DPC'niz bindService() yöntemini normalde Android'de yaptığınız gibi çağıramaz. Başka bir kullanıcıda çalışan bir hizmete bağlanmak için DevicePolicyManager.bindDeviceAdminServiceAsUser() numarasını arayın.

RPC&#39;leri çağıran birincil kullanıcı ve ilişkili iki ikincil kullanıcı.
Şekil 2. Hizmet yöntemlerini arayan, ilişkili birincil ve ikincil kullanıcıların yöneticileri

DPC'niz yalnızca DevicePolicyManager.getBindDeviceAdminTargetUsers() tarafından döndürülen kullanıcılarda çalışan hizmetlere bağlanabilir. Aşağıdaki örnekte tümüyle yönetilen cihazın yöneticisine bağlanan ikincil bir kullanıcı yöneticisi gösterilmektedir:

Kotlin

// 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)
}

Java

// 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);

Ek kaynaklar

Özel cihazlar hakkında daha fazla bilgi edinmek için aşağıdaki dokümanları okuyun: