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.
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.
- Gelen Bağlayıcı çağrılarından kullanıcı adını çıkarın:
-
int userHandle = UserHandle.getCallingUserId()
-
- 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)
UserHandle
, uygunsuz bir kullanıcı veya özel herkese açık kullanıcı adlarından biri olabilir:UserHandle.CURRENT
veyaUserHandle.ALL
.CURRENT
şunu belirtir: o anda ön planda olan kullanıcı. İstediğiniz zamanALL
kullanın tüm kullanıcılara bir anons gönderebilir. - Kendi uygulamanızdaki bileşenlerle iletişim kurma:
(INTERACT_ACROSS_USERS)
. Alternatif olarak, diğer uygulamalardaki bileşenlerle:(INTERACT_ACROSS_USERS_FULL)
- 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. - 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.
- 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.