Mode mengunci tugas

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

Ringkasan

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

Hanya aplikasi yang telah diizinkan oleh pengendali kebijakan perangkat (DPC) yang dapat berjalan saat sistem berada dalam mode kunci tugas. Aplikasi diizinkan karena orang tersebut menggunakan perangkat tidak selalu bisa meninggalkan mode kunci tugas.

Cara Anda menggabungkan aplikasi yang diizinkan untuk mode mengunci tugas dan DPC yang diberi akses akan tergantung pada masalah yang ingin Anda pecahkan. 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, yang 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 mana 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 (level API 26) atau yang lebih tinggi Pengguna sekunder terafiliasi Pengguna sekunder harus berafiliasi dengan pengguna utama. Lihat ringkasan beberapa pengguna.
Android 9.0 (level API 28) atau yang lebih tinggi Pengguna sekunder

Di Android 9.0 atau yang lebih baru, DPC dapat memulai aktivitas aplikasi apa pun ke mode mengunci tugas. Dalam versi sebelumnya, aplikasi harus sudah mendukung proses memulai aktivitasnya sendiri di mode mengunci tugas.

Daftar aplikasi yang diizinkan

DPC harus mengizinkan aplikasi sebelum dapat digunakan dalam mode mengunci tugas. Telepon DevicePolicyManager.setLockTaskPackages() ke mengizinkan aplikasi untuk mode mengunci tugas seperti yang ditampilkan 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() Yang lain aplikasi bisa memanggil DevicePolicyManager.isLockTaskPermitted() untuk mengonfirmasi bahwa paket aplikasi mendukung mode kunci tugas.

Mulai mode mengunci tugas

Di Android 9.0 (API level 28) atau yang lebih tinggi, Anda dapat memulai aktivitas aplikasi lain di mode mengunci tugas. Jika suatu aktivitas sudah berjalan di latar depan atau latar belakang, Anda perlu meluncurkan kembali aktivitas tersebut. Telepon ActivityOptions.setLockTaskEnabled() dan menyediakan pilihan ketika memulai aktivitas. Cuplikan berikut menunjukkan salah satu cara untuk lakukan ini:

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());
}

Di versi Android sebelum 9.0, aplikasi memulai aktivitasnya sendiri dalam tugas kunci dengan memanggil Activity.startLockTask(). Untuk memanggilnya , aktivitas harus berjalan di latar depan (lihat Aktivitas-siklus proses utama) jadi sebaiknya panggil metode 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 mulai mode mengunci tugas saat perangkat terkunci karena pengguna mungkin tidak dapat membuka kunci perangkat. Anda dapat memanggil metode KeyguardManager untuk mencari tahu apakah perangkat terkunci dan menggunakan siklus proses Activity (seperti onResume() yang dipanggil setelah membuka kunci) untuk memulai mode mengunci tugas.

Aplikasi dalam mode mengunci tugas bisa memulai aktivitas baru selama aktivitas tersebut tidak memulai tugas baru—kecuali tugas yang meluncurkan aplikasi yang diizinkan. Kepada memahami bagaimana tugas berkaitan dengan aktivitas, baca panduan Memahami Tugas dan Data Sebelumnya.

Atau, Anda dapat mendeklarasikan di manifes aplikasi file cara perilaku aktivitas saat sistem berjalan dalam mode kunci tugas. Agar sistem berjalan secara otomatis aktivitas Anda dalam mode mengunci tugas, setel android:lockTaskMode ke if_whitelisted sebagai yang ditunjukkan dalam contoh berikut:

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

Anda bisa mempelajari lebih lanjut tentang mendeklarasikan opsi di 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 disetujui. Telepon DevicePolicyManager.setLockTaskPackages(), di Android 6.0 (API level 23) atau yang lebih baru, dan menghilangkan nama paket dari daftar yang diizinkan. Saat Anda memperbarui daftar yang diizinkan, aplikasi akan kembali ke versi sebelumnya tugas dalam tumpukan.

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

Callback siklus proses

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

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

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

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 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 tinggi, jika mode mengunci tugas diaktifkan, DPC dapat mengaktifkan fitur UI sistem tertentu pada perangkat—berguna bagi developer yang membuat peluncur. Telepon 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. Tujuan fitur UI yang diaktifkan akan tetap ada di antara peluncuran ke dalam mode mengunci tugas. Jika perangkat sudah dalam mode mengunci tugas, setiap perubahan yang Anda buat pada fitur mengunci tugas langsung 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 yang diaktifkan Tombol layar utama tidak memiliki tindakan, kecuali jika Anda mengizinkan Android default peluncur.
LOCK_TASK_FEATURE_OVERVIEW Menampilkan tombol Ringkasan (mengetuk tombol ini akan membuka Terbaru). Jika Anda mengaktifkan tombol ini, Anda juga harus mengaktifkan tombol Beranda.
LOCK_TASK_FEATURE_GLOBAL_ACTIONS Mengaktifkan dialog tindakan global yang muncul saat menekan lama tombol daya. 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 peringatan dini, dan menu notifikasi yang dapat diluaskan. Jika Anda mengaktifkan tombol ini, Anda juga harus mengaktifkan tombol Beranda. Mengetuk tombol dan tindakan notifikasi yang membuka panel baru, tidak berfungsi saat terkunci mode tugas.
LOCK_TASK_FEATURE_SYSTEM_INFO Mengaktifkan area info sistem bilah status yang berisi indikator seperti sebagai opsi konektivitas, baterai, serta suara dan getaran.
LOCK_TASK_FEATURE_KEYGUARD Mengaktifkan layar kunci 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 kunci tugas diaktifkan. Kapan perangkat keluar dari mode mengunci tugas, antarmuka pengguna kembali ke status oleh kebijakan perangkat yang ada.

Blokir jendela dan overlay

Saat aplikasi berjalan dalam mode mengunci tugas, aplikasi lain dan layanan latar belakang 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 ke pengguna yang menggunakan perangkat. DPC Anda dapat mencegahnya 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 Anda dapat menghapus batasan pengguna saat perangkat keluar dari mode mengunci tugas.

Referensi lainnya

Untuk mempelajari perangkat khusus lebih lanjut, baca dokumen berikut: