Membangun Aplikasi yang Sadar Banyak Pengguna

Saat perangkat mendukung banyak pengguna , aplikasinya harus diberi tahu tentang pengguna yang berbeda ini.

Aplikasi tertentu harus menjalankan beberapa komponen sebagai lajang dan dapat menerima permintaan dari pengguna mana pun. Hanya aplikasi sistem yang saat ini dapat menggunakan fitur ini.

Fasilitas ini:

  • Menghemat sumber daya
  • Arbitrase satu atau lebih sumber daya bersama di seluruh pengguna
  • Mengurangi overhead jaringan dengan menggunakan koneksi server tunggal

Lihat diagram di bawah untuk penggambaran alur izin dengan banyak pengguna.

Aliran izin beberapa pengguna

Gambar 1. Izin beberapa pengguna

Mengaktifkan komponen tunggal

Untuk mengidentifikasi aplikasi sebagai singleton, tambahkan android:singleUser=”true” ke layanan, penerima, atau penyedia Anda di manifes Android.

Sistem akan menginstansiasi komponen tersebut dalam proses yang berjalan sebagai pengguna 0 saja. Setiap permintaan untuk terhubung ke penyedia atau layanan itu, atau untuk menyiarkan ke penerima itu, 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 (seperti 1010034).

Berinteraksi dengan pengguna

Setel 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.

  1. Ekstrak pegangan pengguna dari panggilan Binder yang masuk:
    • int userHandle = UserHandle.getCallingUserId()
  2. 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 menjadi pengguna eksplisit atau salah satu dari pegangan khusus: UserHandle.CURRENT atau UserHandle.ALL . CURRENT menunjukkan pengguna yang saat ini berada di latar depan. Gunakan ALL saat Anda ingin mengirim siaran ke semua pengguna.
  3. Berkomunikasi dengan komponen di aplikasi Anda sendiri: (INTERACT_ACROSS_USERS) Atau dengan komponen di aplikasi lain: (INTERACT_ACROSS_USERS_FULL)
  4. Anda mungkin perlu membuat komponen proxy yang berjalan dalam proses pengguna yang kemudian mengakses komponen singleUser di pengguna 0.
  5. Buat kueri pengguna dan pegangan mereka 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 koleksi profil mandiri dan terkelola, jika ada.
  6. Daftar untuk mendengarkan pengguna tertentu atau semua 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 berjalan di bawah pengguna lain untuk membantu melestarikan sumber daya. Contoh berikut menunjukkan bagaimana Anda dapat melakukan 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);
}

Contoh juga dapat menggunakan PackageManager.setApplicationEnabledSetting() untuk menonaktifkan seluruh aplikasi.