Jika perangkat mendukung banyak pengguna , aplikasinya harus mengetahui pengguna yang berbeda tersebut.
Aplikasi tertentu perlu menjalankan beberapa komponen sebagai singleton dan dapat menerima permintaan dari pengguna mana pun. Saat ini hanya aplikasi sistem yang dapat menggunakan fitur ini.
Fasilitas ini:
- Menghemat sumber daya
- Arbitrase satu atau lebih sumber daya bersama antar pengguna
- Mengurangi overhead jaringan dengan menggunakan satu koneksi server
Lihat diagram di bawah untuk gambaran alur izin dengan banyak pengguna.
Mengaktifkan komponen tunggal
Untuk mengidentifikasi aplikasi sebagai aplikasi tunggal, tambahkan android:singleUser="true"
ke layanan, penerima, atau penyedia Anda di manifes Android.
Sistem akan membuat instance komponen tersebut dalam proses yang berjalan sebagai pengguna 0 saja. Setiap permintaan untuk menyambung ke penyedia atau layanan tersebut, atau untuk menyiarkan ke penerima tersebut, dari pengguna mana pun akan dirutekan ke proses di pengguna 0. Jika ini adalah satu-satunya komponen di aplikasi Anda, hanya satu instance aplikasi Anda yang akan berjalan.
Aktivitas dalam paket Anda akan tetap diluncurkan dalam proses terpisah untuk setiap pengguna, dengan UID berada dalam rentang UID untuk pengguna tersebut (misalnya 1010034).
Berinteraksi dengan pengguna
Tetapkan izin
Izin ini diperlukan
INTERACT_ACROSS_USERS (signature|system) INTERACT_ACROSS_USERS_FULL (signature)
Gunakan API
Gunakan API berikut untuk membuat aplikasi mengetahui banyak pengguna.
- Ekstrak pegangan pengguna dari panggilan Binder yang masuk:
-
int userHandle = UserHandle.getCallingUserId()
-
- Gunakan API baru yang dilindungi untuk memulai layanan, aktivitas, siaran pada pengguna tertentu:
-
Context.startActivityAsUser(Intent, UserHandle)
-
Context.bindServiceAsUser(Intent, …, UserHandle)
-
Context.sendBroadcastAsUser(Intent, … , UserHandle)
-
Context.startServiceAsUser(Intent, …, UserHandle)
UserHandle
dapat berupa pengguna eksplisit atau salah satu pegangan khusus:UserHandle.CURRENT
atauUserHandle.ALL
.CURRENT
menunjukkan pengguna yang saat ini berada di latar depan. GunakanALL
ketika Anda ingin mengirim siaran ke semua pengguna. -
- Berkomunikasi dengan komponen di aplikasi Anda sendiri:
(INTERACT_ACROSS_USERS)
Atau dengan komponen di aplikasi lain:(INTERACT_ACROSS_USERS_FULL)
- Anda mungkin perlu membuat komponen proksi yang berjalan di proses pengguna yang kemudian mengakses komponen
singleUser
di pengguna 0. - Kueri pengguna dan pegangannya dengan layanan sistem
UserManager
baru:-
UserManager.getUsers()
-
UserManager.getUserInfo()
-
UserManager.supportsMultipleUsers()
-
UserManager.getUserSerialNumber(int userHandle)
- nomor non-daur ulang yang sesuai dengan pegangan pengguna. -
UserManager.getUserHandle(int serialNumber)
-
UserManager.getUserProfiles()
- mengembalikan kumpulan profil mandiri dan terkelola, jika ada.
-
- Daftar untuk mendengarkan pengguna tertentu atau semua pengguna dan panggilan balik dengan API baru di ContentObserver, PackageMonitor, BroadcastReceiver yang memberikan informasi tambahan tentang pengguna mana yang menyebabkan panggilan balik.
Layanan di banyak pengguna atau profil
Tidak semua layanan perlu menjalankan instance di pengguna atau profil kerja lain. Jika layanan sistem Anda hanya perlu dijalankan sebagai pengguna 0, nonaktifkan komponen layanan saat dijalankan di bawah pengguna lain untuk membantu melestarikan sumber daya. Contoh berikut menunjukkan bagaimana Anda dapat melakukan hal ini di titik masuk layanan Anda:
// 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); }
Contohnya juga dapat menggunakan PackageManager.setApplicationEnabledSetting()
untuk menonaktifkan seluruh aplikasi.