Çok Kullanıcılı Uygulamalar Oluşturma

Bir cihaz birden fazla kullanıcıyı desteklediğinde, uygulamalarının bu farklı kullanıcılar hakkında bilgilendirilmesi gerekir.

Bazı uygulamaların bazı bileşenlerin tekil olarak çalıştırılması gerekir ve herhangi bir kullanıcıdan gelen istekleri kabul edebilir. Şu anda bu özelliği yalnızca sistem uygulamaları kullanabilir.

Bu tesis:

  • Kaynakları korur
  • Kullanıcılar arasında bir veya daha fazla paylaşılan kaynağı hakemleştirir
  • Tek bir sunucu bağlantısı kullanarak ağ yükünü azaltır

Birden fazla kullanıcıyla izin akışının gösterimi için aşağıdaki şemaya bakın.

Çoklu kullanıcı izinleri akışı

Şekil 1. Çoklu kullanıcı izinleri

Singleton bileşenini etkinleştirme

Bir uygulamayı singleton olarak tanımlamak için Android bildiriminde hizmetinize, alıcınıza veya sağlayıcınıza android:singleUser="true" ekleyin.

Sistem bu bileşeni yalnızca kullanıcı 0 olarak çalışan süreçte başlatacaktır. Herhangi bir kullanıcıdan bu sağlayıcıya veya hizmete bağlanma veya bu alıcıya yayın yapma istekleri, kullanıcı 0'daki işleme yönlendirilecektir. Bu, uygulamanızdaki tek bileşense, uygulamanızın yalnızca bir örneği çalıştırılacaktır.

Paketinizdeki etkinlikler, UID'nin söz konusu kullanıcının UID aralığında (1010034 gibi) olmasıyla her kullanıcı için ayrı bir işlemde başlatılacaktır.

Kullanıcılarla etkileşim kurma

İzinleri ayarlayın

Bu izinler gerekli

INTERACT_ACROSS_USERS (signature|system)
INTERACT_ACROSS_USERS_FULL (signature)

API'leri kullanın

Uygulamaların birden fazla kullanıcıyı tanımasını sağlamak için aşağıdaki API'leri kullanın.

  1. Kullanıcı tanıtıcısını gelen Binder çağrılarından çıkarın:
    • int userHandle = UserHandle.getCallingUserId()
  2. Belirli bir kullanıcı üzerinde hizmetleri, etkinlikleri ve yayınları başlatmak için yeni, korumalı API'leri kullanın:
    • Context.startActivityAsUser(Intent, UserHandle)
    • Context.bindServiceAsUser(Intent, …, UserHandle)
    • Context.sendBroadcastAsUser(Intent, … , UserHandle)
    • Context.startServiceAsUser(Intent, …, UserHandle)
    UserHandle açık bir kullanıcı veya özel tanıtıcılardan biri olabilir: UserHandle.CURRENT veya UserHandle.ALL . CURRENT o anda ön planda olan kullanıcıyı belirtir. Tüm kullanıcılara yayın göndermek istediğinizde ALL kullanın.
  3. Kendi uygulamanızdaki bileşenlerle iletişim kurun: (INTERACT_ACROSS_USERS) Veya diğer uygulamalardaki bileşenlerle iletişim kurun: (INTERACT_ACROSS_USERS_FULL)
  4. Kullanıcı işleminde çalışan ve daha sonra kullanıcı 0'daki singleUser bileşenine erişen proxy bileşenleri oluşturmanız gerekebilir.
  5. Yeni UserManager sistem hizmetiyle kullanıcıları ve tanıtıcılarını sorgulayın:
    • UserManager.getUsers()
    • UserManager.getUserInfo()
    • UserManager.supportsMultipleUsers()
    • UserManager.getUserSerialNumber(int userHandle) - bir kullanıcı tanıtıcısına karşılık gelen, geri dönüştürülmeyen bir sayı.
    • UserManager.getUserHandle(int serialNumber)
    • UserManager.getUserProfiles() - varsa kişisel ve yönetilen profillerin koleksiyonunu döndürür.
  6. Hangi kullanıcının geri aramaya neden olduğu hakkında ek bilgi sağlayan ContentObserver, PackageMonitor, BroadcastReceiver'daki yeni API'lerle belirli veya tüm kullanıcıları ve geri aramaları dinlemek için kaydolun.

Birden fazla kullanıcı veya profildeki hizmetler

Tüm hizmetlerin başka bir kullanıcı veya iş profilinde bir örneği çalıştırması gerekmez. Sistem hizmetinizin yalnızca kullanıcı 0 olarak çalışması gerekiyorsa, kaynakların korunmasına yardımcı olmak için diğer kullanıcılar altında çalışırken hizmetin bileşenlerini devre dışı bırakın. Aşağıdaki örnek, bunu hizmetinizin giriş noktalarında nasıl yapabileceğinizi gösterir:

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

Örnek, uygulamanın tamamını devre dışı bırakmak için PackageManager.setApplicationEnabledSetting() işlevini de kullanabilir.