Mode mengunci tugas

Panduan developer ini menjelaskan cara perangkat khusus dapat dikunci ke satu aplikasi atau kumpulan aplikasi. Jika Anda adalah developer pengelolaan mobilitas perusahaan (EMM) atau integrator solusi, baca panduan ini untuk menambahkan mode mengunci tugas ke solusi Anda.

Ringkasan

Android dapat menjalankan tugas secara imersif, seperti kios yang disebut mode kunci tugas. Anda dapat menggunakan mode mengunci tugas jika mengembangkan aplikasi kios atau peluncur untuk menampilkan kumpulan aplikasi. Saat sistem berjalan dalam mode mengunci tugas, pengguna perangkat biasanya tidak dapat melihat notifikasi, mengakses aplikasi yang tidak diizinkan, atau kembali ke layar utama (kecuali layar utama diizinkan).

Hanya aplikasi yang telah diizinkan oleh pengontrol kebijakan perangkat (DPC) yang dapat berjalan saat sistem berada dalam mode mengunci tugas. Aplikasi diizinkan karena orang yang menggunakan perangkat tidak selalu dapat keluar dari mode mengunci tugas.

Cara Anda menggabungkan aplikasi yang diizinkan untuk mode mengunci tugas dan DPC yang diizinkan akan bergantung pada masalah yang ingin Anda selesaikan. Berikut beberapa contohnya:

  • Paket aplikasi tunggal yang menggabungkan kios (untuk menampilkan konten) dan DPC mini (untuk mengizinkan dirinya sendiri untuk mode mengunci tugas).
  • DPC yang merupakan bagian dari solusi pengelolaan mobilitas perusahaan, meluncurkan aplikasi seluler pelanggan dalam mode mengunci tugas.

Ketersediaan

Sistem dapat berjalan dalam mode mengunci tugas di Android 5.0 atau yang lebih baru. Tabel 1 menunjukkan versi Android yang mendukung pemberian izin aplikasi berdasarkan pengguna.

Tabel 1. Dukungan versi Android untuk mode admin DPC
Versi Android DPC mengelola Catatan
Android 5.0 (API Level 21) atau yang lebih tinggi Perangkat yang sepenuhnya dikelola
Android 8.0 (API level 26) atau yang lebih tinggi Pengguna sekunder terafiliasi Pengguna sekunder harus berafiliasi dengan pengguna utama. Lihat ringkasan beberapa pengguna.
Android 9.0 (API level 28) atau yang lebih tinggi Pengguna sekunder

Di Android 9.0 atau yang lebih baru, DPC bisa memulai aktivitas aplikasi apa pun ke dalam mode mengunci tugas. Pada versi sebelumnya, aplikasi harus sudah mendukung awal aktivitasnya sendiri dalam mode mengunci tugas.

Daftar aplikasi yang diizinkan

DPC harus mengizinkan aplikasi sebelum dapat digunakan dalam mode mengunci tugas. Panggil DevicePolicyManager.setLockTaskPackages() untuk mencantumkan aplikasi yang diizinkan untuk mode mengunci tugas seperti ditunjukkan dalam contoh berikut:

Kotlin

// Allowlist two apps.
private val KIOSK_PACKAGE = "com.example.kiosk"
private val PLAYER_PACKAGE = "com.example.player"
private val APP_PACKAGES = arrayOf(KIOSK_PACKAGE, PLAYER_PACKAGE)

// ...

val context = context
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE)
        as DevicePolicyManager
val adminName = getComponentName(context)
dpm.setLockTaskPackages(adminName, APP_PACKAGES)

Java

// Allowlist two apps.
private static final String KIOSK_PACKAGE = "com.example.kiosk";
private static final String PLAYER_PACKAGE = "com.example.player";
private static final String[] APP_PACKAGES = {KIOSK_PACKAGE, PLAYER_PACKAGE};

// ...

Context context = getContext();
DevicePolicyManager dpm =
    (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminName = getComponentName(context);
dpm.setLockTaskPackages(adminName, APP_PACKAGES);

Untuk mengetahui aplikasi yang sebelumnya diizinkan untuk mode mengunci tugas, DPC dapat memanggil DevicePolicyManager.getLockTaskPackages(). Aplikasi lain dapat memanggil DevicePolicyManager.isLockTaskPermitted() untuk mengonfirmasi bahwa paket aplikasi mendukung mode mengunci tugas.

Mulai mode mengunci tugas

Di Android 9.0 (API level 28) atau yang lebih baru, Anda dapat memulai aktivitas aplikasi lain dalam mode mengunci tugas. Jika aktivitas sudah berjalan di latar depan atau latar belakang, Anda perlu meluncurkan kembali aktivitas tersebut. Panggil ActivityOptions.setLockTaskEnabled() dan berikan opsi ini saat memulai aktivitas. Cuplikan berikut menunjukkan salah satu cara untuk melakukannya:

Kotlin

// Set an option to turn on lock task mode when starting the activity.
val options = ActivityOptions.makeBasic()
options.setLockTaskEnabled(true)

// Start our kiosk app's main activity with our lock task mode option.
val packageManager = context.packageManager
val launchIntent = packageManager.getLaunchIntentForPackage(KIOSK_PACKAGE)
if (launchIntent != null) {
    context.startActivity(launchIntent, options.toBundle())
}

Java

// Set an option to turn on lock task mode when starting the activity.
ActivityOptions options = ActivityOptions.makeBasic();
options.setLockTaskEnabled(true);

// Start our kiosk app's main activity with our lock task mode option.
PackageManager packageManager = context.getPackageManager();
Intent launchIntent = packageManager.getLaunchIntentForPackage(KIOSK_PACKAGE);
if (launchIntent != null) {
  context.startActivity(launchIntent, options.toBundle());
}

Pada versi Android sebelum 9.0, aplikasi memulai aktivitasnya sendiri dalam mode mengunci tugas dengan memanggil Activity.startLockTask(). Untuk memanggil metode ini, aktivitas harus berjalan di latar depan (lihat Konsep siklus proses aktivitas) jadi sebaiknya panggil metode onResume() dari Activity atau Fragment. Berikut cara memanggil startLockTask():

Kotlin

// In our Fragment subclass.
override fun onResume() {
    super.onResume()
    // First, confirm that this package is allowlisted to run in lock task mode.
    if (dpm.isLockTaskPermitted(context.packageName)) {
        activity.startLockTask()
    } else {
        // Because the package isn't allowlisted, calling startLockTask() here
        // would put the activity into screen pinning mode.
    }
}

Java

// In our Fragment subclass.
@Override
public void onResume() {
  super.onResume();

  // First, confirm that this package is allowlisted to run in lock task mode.
  if (dpm.isLockTaskPermitted(context.getPackageName())) {
    getActivity().startLockTask();
  } else {
    // Because the package isn't allowlisted, calling startLockTask() here
    // would put the activity into screen pinning mode.
  }
}

Jangan memulai mode mengunci tugas saat perangkat terkunci karena pengguna mungkin tidak dapat membuka kunci perangkat. Anda dapat memanggil metode KeyguardManager untuk mengetahui apakah perangkat dikunci dan menggunakan callback siklus proses Activity (seperti onResume() yang dipanggil setelah membuka kunci) untuk memulai mode mengunci tugas.

Aplikasi dalam mode mengunci tugas dapat memulai aktivitas baru selama aktivitas tersebut tidak memulai tugas baru—kecuali tugas yang meluncurkan aplikasi yang diizinkan. Untuk memahami hubungan antara tugas dengan aktivitas, baca panduan Memahami Tugas dan Back Stack.

Atau, Anda dapat mendeklarasikan dalam file manifes aplikasi bagaimana suatu aktivitas harus berperilaku saat sistem berjalan dalam mode mengunci tugas. Agar sistem otomatis menjalankan aktivitas Anda dalam mode mengunci tugas, setel atribut android:lockTaskMode ke if_whitelisted seperti yang ditunjukkan dalam contoh berikut:

<activity
    android:name=".MainActivity"
    android:lockTaskMode="if_whitelisted">
    <!-- ... -->
</activity>

Anda dapat mempelajari lebih lanjut cara mendeklarasikan opsi dalam file manifes aplikasi, dengan membaca referensi lockTaskMode.

Hentikan mode mengunci tugas

DPC dapat menghentikan mode mengunci tugas dari jarak jauh dengan menghapus paket aplikasi dari daftar yang diizinkan. Panggil DevicePolicyManager.setLockTaskPackages() di Android 6.0 (API level 23) atau yang lebih baru, dan hapus nama paket dari array daftar yang diizinkan. Saat Anda memperbarui daftar yang diizinkan, aplikasi akan kembali ke tugas sebelumnya dalam stack.

Jika suatu aktivitas sebelumnya bernama startLockTask(), aktivitas tersebut dapat memanggil Activity.stopLockTask() untuk menghentikan mode mengunci tugas. Metode ini hanya berfungsi untuk aktivitas yang memulai mode mengunci tugas.

Callback siklus proses

DPC mungkin merasa perlu mengetahui kapan aplikasi (berjalan di pengguna yang sama) masuk dan keluar dari mode mengunci tugas. Untuk menerima callback, ganti metode callback berikut di subclass DeviceAdminReceiver DPC:

onLockTaskModeEntering()
Dipanggil setelah aplikasi memasuki mode mengunci tugas. Anda bisa mendapatkan nama paket aplikasi dari argumen pkg.
onLockTaskModeExiting()
Dipanggil setelah aplikasi keluar dari mode mengunci tugas. Callback ini tidak menerima informasi tentang aplikasi.

Jika meluncurkan aplikasi lain ke dalam mode mengunci tugas, Anda perlu melacak status yang berjalan di aplikasi Anda sendiri. Untuk memeriksa apakah aplikasi saat ini berjalan dalam mode kunci tugas, gunakan metode di ActivityManager seperti yang ditunjukkan dalam contoh berikut:

Kotlin

// Check if this app is in lock task mode. Screen pinning doesn't count.
var isLockTaskModeRunning = false

val activityManager = context
        .getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    isLockTaskModeRunning =
            activityManager.lockTaskModeState ==
            ActivityManager.LOCK_TASK_MODE_LOCKED
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    // Deprecated in API level 23.
    isLockTaskModeRunning = activityManager.isInLockTaskMode
}

if (isLockTaskModeRunning) {
    // Show the exit button ...
}

Java

// Check if this app is in lock task mode. Screen pinning doesn't count.
boolean isLockTaskModeRunning = false;

ActivityManager activityManager = (ActivityManager)
    getContext().getSystemService(Context.ACTIVITY_SERVICE);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  isLockTaskModeRunning = activityManager.getLockTaskModeState()
      == ActivityManager.LOCK_TASK_MODE_LOCKED;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  // Deprecated in API level 23.
  isLockTaskModeRunning = activityManager.isInLockTaskMode();
}

if (isLockTaskModeRunning) {
  // Show the exit button ...
}

Menyesuaikan UI

Saat aplikasi berjalan dalam mode mengunci tugas, antarmuka pengguna (UI) sistem akan berubah dengan cara berikut:

  • Status bar kosong dengan notifikasi dan informasi sistem tersembunyi.
  • Tombol Beranda dan Ringkasan disembunyikan.
  • Aplikasi lain tidak dapat meluncurkan aktivitas baru.
  • Layar kunci (jika disetel) dinonaktifkan.

Di Android 9.0 atau yang lebih baru, saat mode kunci tugas diaktifkan, DPC dapat mengaktifkan fitur UI sistem tertentu di perangkat—berguna bagi developer yang membuat peluncur kustom. Panggil DevicePolicyManager.setLockTaskFeatures() seperti yang ditunjukkan dalam cuplikan berikut:

Kotlin

// Enable the Home and Overview buttons so that our custom launcher can respond
// using our custom activities. Implicitly disables all other features.
dpm.setLockTaskFeatures(
        adminName,
        DevicePolicyManager.LOCK_TASK_FEATURE_HOME or
              DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW)

Java

// Enable the Home and Overview buttons so that our custom launcher can respond
// using our custom activities. Implicitly disables all other features.
dpm.setLockTaskFeatures(adminName,
    DevicePolicyManager.LOCK_TASK_FEATURE_HOME |
          DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW);

Sistem akan menonaktifkan fitur apa pun yang tidak Anda sertakan dalam argumen flags. Fitur UI yang diaktifkan akan tetap ada di antara peluncuran ke dalam mode mengunci tugas. Jika perangkat sudah berada dalam mode mengunci tugas, perubahan apa pun yang Anda buat pada fitur tugas mengunci akan segera ditampilkan. Tabel 2 menjelaskan fitur UI yang dapat Anda sesuaikan.

Tabel 2. Fitur UI sistem yang dapat disesuaikan dalam mode mengunci tugas
Fitur UI sistem Deskripsi
LOCK_TASK_FEATURE_HOME Menampilkan tombol Beranda. Aktifkan untuk peluncur kustom—mengetuk tombol Layar Utama yang diaktifkan tidak akan melakukan tindakan kecuali Anda mengizinkan peluncur Android default.
LOCK_TASK_FEATURE_OVERVIEW Menampilkan tombol Ringkasan (mengetuk tombol ini akan membuka layar Terbaru). Jika mengaktifkan tombol ini, Anda juga harus mengaktifkan tombol Layar utama.
LOCK_TASK_FEATURE_GLOBAL_ACTIONS Mengaktifkan dialog tindakan global yang ditampilkan saat tombol daya ditekan lama. Satu-satunya fitur yang diaktifkan saat setLockTaskFeatures() belum dipanggil. Pengguna biasanya tidak dapat mematikan perangkat jika Anda menonaktifkan dialog ini.
LOCK_TASK_FEATURE_NOTIFICATIONS Mengaktifkan notifikasi untuk semua aplikasi. Ini menampilkan ikon notifikasi di status bar, notifikasi pendahuluan, dan menu notifikasi yang dapat diluaskan. Jika mengaktifkan tombol ini, Anda juga harus mengaktifkan tombol Beranda. Mengetuk tombol dan tindakan notifikasi yang membuka panel baru tidak berfungsi dalam mode mengunci tugas.
LOCK_TASK_FEATURE_SYSTEM_INFO Mengaktifkan area info sistem status bar yang berisi indikator seperti konektivitas, baterai, serta opsi suara dan getaran.
LOCK_TASK_FEATURE_KEYGUARD Mengaktifkan layar kunci apa pun yang mungkin disetel di perangkat. Biasanya tidak cocok untuk perangkat dengan pengguna publik seperti kios informasi atau reklame digital.
LOCK_TASK_FEATURE_NONE Menonaktifkan semua fitur UI sistem yang tercantum di atas.

DPC dapat memanggil DevicePolicyManager.getLockTaskFeatures() untuk mendapatkan daftar fitur yang tersedia di perangkat saat mode mengunci tugas diaktifkan. Saat perangkat keluar dari mode mengunci tugas, antarmuka pengguna kembali ke status yang dimandatkan oleh kebijakan perangkat yang ada.

Memblokir jendela dan overlay

Saat aplikasi berjalan dalam mode mengunci tugas, aplikasi dan layanan latar belakang lainnya dapat membuat jendela baru yang ditampilkan Android di depan aplikasi dalam mode mengunci tugas. Aplikasi dan layanan membuat jendela ini untuk menampilkan toast, dialog, dan overlay kepada pengguna yang menggunakan perangkat. DPC Anda dapat mencegah hal ini dengan menambahkan batasan pengguna DISALLOW_CREATE_WINDOWS. Contoh berikut menunjukkan cara melakukannya dalam callback onLockTaskModeEntering():

Kotlin

// Called just after entering lock task mode.
override fun onLockTaskModeEntering(context: Context, intent: Intent) {
    val dpm = getManager(context)
    val admin = getWho(context)

    dpm.addUserRestriction(admin, UserManager.DISALLOW_CREATE_WINDOWS)
}

Java

// Called just after entering lock task mode.
public void onLockTaskModeEntering(Context context, Intent intent) {
  DevicePolicyManager dpm = getManager(context);
  ComponentName admin = getWho(context);

  dpm.addUserRestriction(admin, UserManager.DISALLOW_CREATE_WINDOWS);
}

DPC dapat menghapus batasan pengguna saat perangkat keluar dari mode kunci tugas.

Referensi lainnya

Untuk mempelajari perangkat khusus lebih lanjut, baca dokumen berikut: