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.
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.
- Kullanıcı tanıtıcısını gelen Binder çağrılarından çıkarın:
-
int userHandle = UserHandle.getCallingUserId()
-
- 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
veyaUserHandle.ALL
.CURRENT
o anda ön planda olan kullanıcıyı belirtir. Tüm kullanıcılara yayın göndermek istediğinizdeALL
kullanın. -
- Kendi uygulamanızdaki bileşenlerle iletişim kurun:
(INTERACT_ACROSS_USERS)
Veya diğer uygulamalardaki bileşenlerle iletişim kurun:(INTERACT_ACROSS_USERS_FULL)
- 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. - 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.
-
- 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.