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.
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.
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:
- Cookbook perangkat khusus dengan contoh lebih lanjut untuk membatasi perangkat khusus dan meningkatkan pengalaman pengguna.
- Ringkasan perangkat khusus adalah ringkasan perangkat khusus.
- Mengelola beberapa pengguna menjelaskan cara berbagi perangkat antar-pengguna.