Çok Kullanıcıya Duyarlı Uygulamalar Derleme

Bir cihaz birden fazla kullanıcıyı destekliyorsa uygulamaları haberdar olmasını sağladı.

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

Bu tesis:

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

Birden fazla kullanıcı için izin akışının tasvir edildiği aşağıdaki şemaya bakın.

Birden çok kullanıcı izni akışı

Şekil 1. Birden fazla kullanıcı izni

Singleton bileşenini etkinleştirme

Bir uygulamayı tekli olarak tanımlamak için hizmetinize android:singleUser="true" ekleyin, alıcı veya sağlayıcı olabilir.

Sistem, kullanıcı 0 olarak çalışan işlemde bu bileşeni örneklendirir gerekir. Söz konusu sağlayıcıya veya hizmete bağlanma ya da tüm kullanıcılar işleme kullanıcı 0'da yönlendirilir. Uygulamanızdaki tek bileşen buysa uygulamanızın yalnızca bir örneği çalışır.

Paketinizdeki etkinlikler yine de her biri için ayrı bir işlemde başlatılır. UID, ilgili kullanıcının UID aralığında (1010034 gibi) olmalıdır.

Kullanıcılarla etkileşim

İzinleri ayarla

Bu izinler gereklidir

INTERACT_ACROSS_USERS (signature|system)
INTERACT_ACROSS_USERS_FULL (signature)

API kullanın

Uygulamaları birden fazla kullanıcıyı bilgilendirmek için aşağıdaki API'leri kullanın.

  1. Gelen Bağlayıcı çağrılarından kullanıcı adını çıkarın:
    • int userHandle = UserHandle.getCallingUserId()
  2. Belirli bir cihazda hizmetleri, etkinlikleri, yayınları başlatmak için yeni, korumalı API'ler kullanın. kullanıcı:
    • Context.startActivityAsUser(Intent, UserHandle)
    • Context.bindServiceAsUser(Intent, …, UserHandle)
    • Context.sendBroadcastAsUser(Intent, … , UserHandle)
    • Context.startServiceAsUser(Intent, …, UserHandle)
    ziyaret edin. UserHandle, uygunsuz bir kullanıcı veya özel herkese açık kullanıcı adlarından biri olabilir: UserHandle.CURRENT veya UserHandle.ALL. CURRENT şunu belirtir: o anda ön planda olan kullanıcı. İstediğiniz zaman ALL kullanın tüm kullanıcılara bir anons gönderebilir.
  3. Kendi uygulamanızdaki bileşenlerle iletişim kurma: (INTERACT_ACROSS_USERS). Alternatif olarak, diğer uygulamalardaki bileşenlerle: (INTERACT_ACROSS_USERS_FULL)
  4. Kullanıcının işleminde çalışan proxy bileşenleri oluşturmanız ardından kullanıcı 0'daki singleUser bileşenine erişin.
  5. Yeni UserManager sistem hizmetiyle kullanıcıları ve herkese açık kullanıcı adlarını sorgulayın:
    • UserManager.getUsers()
    • UserManager.getUserInfo()
    • UserManager.supportsMultipleUsers()
    • UserManager.getUserSerialNumber(int userHandle) - bir kullanıcı herkese açık kullanıcı adına karşılık gelen, geri dönüştürülmemiş bir numara.
    • UserManager.getUserHandle(int serialNumber)
    • UserManager.getUserProfiles() - varsa, kullanıcının kendisi ve yönetilen profilleri koleksiyonunu döndürür.
  6. Yeni API'lerle belirli kullanıcıları veya tüm kullanıcıları ve geri çağırmaları dinlemek için kaydolun Ek bilgiler sağlayan ContentObserver, PackageMonitor, BroadcastReceiver geri çağırmaya hangi kullanıcının neden olduğuyla ilgili bilgiler.

Birden fazla kullanıcı veya profildeki hizmetler

Tüm hizmetlerin başka bir kullanıcı veya iş profilinde örnek çalıştırması gerekmez. Sistem hizmetiniz gerekiyorsa diğer kullanıcıların altında çalışırken hizmet bileşenlerini devre dışı bırakın. kaynakları korumanıza yardımcı olabilir. Aşağıdaki örnek, hizmetinizin girişinde bunu nasıl yapabileceğiniz gösterilmektedir puan:

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

Örnekte, devre dışı bırakmak için PackageManager.setApplicationEnabledSetting() de kullanılabilir. tüm uygulamayı kapsar.