Android memungkinkan beberapa aplikasi berbagi layar yang sama secara bersamaan. Sistem dapat menampilkan dua aplikasi secara berdampingan (mode layar terpisah), satu aplikasi di jendela kecil yang menempatkan aplikasi lain (mode picture-in-picture), atau aplikasi terpisah yang dapat dipindahkan, jendela yang dapat diubah ukurannya (mode bentuk bebas).
Gambar 1. Dua aplikasi berjalan berdampingan dalam mode layar terpisah.
Pengalaman pengguna bergantung pada versi Android OS dan jenis perangkat:
-
Android 7.0 menyediakan mode layar terpisah di perangkat genggam dan mode picture-in-picture di TV.
Mode layar terpisah mengisi layar dengan dua aplikasi yang ditampilkan secara berdampingan atau satu di atas yang lain. Pengguna dapat menarik pembagi yang memisahkan kedua aplikasi untuk membuat aplikasi yang lebih besar dan yang lainnya lebih kecil.
Mode picture-in-picture memungkinkan pengguna melanjutkan pemutaran video saat berinteraksi dengan aplikasi lain (lihat Dukungan Picture-in-picture).
Produsen perangkat berukuran lebih besar dapat memilih untuk mengaktifkan mode format bebas, yang memungkinkan pengguna bebas mengubah ukuran setiap aktivitas.
Anda dapat mengonfigurasi cara aplikasi menangani tampilan multi-aplikasi dengan menentukan dimensi minimum yang diizinkan aktivitas Anda. Anda juga dapat menonaktifkan tampilan multi-aplikasi untuk aplikasi dengan menetapkan
resizeableActivity="false"
untuk memastikan sistem selalu menampilkan layar penuh aplikasi. - Android 8.0 memperluas mode picture-in-picture ke perangkat genggam.
Android 12 membuat perilaku standar mode multi-aplikasi.
Pada layar besar (sw >= 600dp), platform mendukung semua aplikasi dalam mode multi-aplikasi, terlepas dari konfigurasi aplikasi. Jika
resizeableActivity="false"
, aplikasi dialihkan ke mode kompatibilitas saat diperlukan untuk mengakomodasi dimensi tampilan.Pada layar kecil (sw < 600dp), sistem akan memeriksa
minWidth
danminHeight
aktivitas untuk menentukan apakah aktivitas dapat berjalan dalam mode multi-aplikasi. JikaresizeableActivity="false"
, aplikasi tidak dapat berjalan dalam mode multi-aplikasi, terlepas dari lebar dan tinggi minimum.Catatan: Produsen perangkat dapat mengganti perilaku ini.
Aktivasi mode layar terpisah
Pengguna dapat mengaktifkan mode layar terpisah dengan melakukan hal berikut:
- Buka layar Terbaru
- Geser aplikasi ke tampilan
- Tekan ikon aplikasi pada baris judul aplikasi
- Pilih opsi menu Layar terpisah
- Pilih aplikasi lain dari layar Terbaru, atau tutup layar Terbaru dan jalankan aplikasi lain
Pengguna dapat keluar dari mode layar terpisah dengan menarik pembagi jendela ke tepi layar ke kedua arah.
Siklus proses multi-aplikasi
Mode multi-aplikasi tidak mengubah siklus proses aktivitas. Namun, status aplikasi yang dilanjutkan di beberapa jendela bervariasi pada berbagai versi Android.
Multi-resume
Di Android 10 (API level 29) dan yang lebih baru, semua aktivitas
tetap dalam status
RESUMED
saat perangkat dalam mode multi-aplikasi. Fitur ini disebut multi-resume.
Perhatikan bahwa suatu aktivitas dapat dijeda jika ada aktivitas transparan di atas
atau aktivitas yang tidak dapat difokuskan (mis., mode picture-in-picture). Mungkin
juga bahwa tidak ada aktivitas yang memiliki fokus pada waktu tertentu, misalnya, jika
panel samping notifikasi terbuka. Metode onStop
berfungsi seperti biasa; metode ini dipanggil setiap kali aktivitas dihapus dari layar.
Multi-resume juga tersedia di perangkat tertentu yang menjalankan Android 9. Untuk mengikutsertakan multi-resume di perangkat tersebut, tambahkan metadata manifes berikut:
<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />
Untuk memverifikasi bahwa perangkat yang ditentukan mendukung metadata manifes ini, lihat spesifikasi perangkat.
Android 9
Dalam mode multi-aplikasi di Android 9 (API level 28) dan lebih rendah, hanya aktivitas
yang paling sering digunakan pengguna yang akan aktif pada waktu tertentu. Aktivitas
ini dianggap utama, dan merupakan satu-satunya aktivitas dalam status
RESUMED
. Semua aktivitas lain yang terlihat
STARTED
tetapi tidak
RESUMED
. Namun, bagi sistem aktivitas yang terlihat tetapi tidak dilanjutkan ini memiliki prioritas lebih tinggi daripada aktivitas yang tidak terlihat. Jika
pengguna berinteraksi dengan salah satu aktivitas yang terlihat, aktivitas tersebut akan dilanjutkan,
dan aktivitas utama sebelumnya akan memasuki status
STARTED
.
Jika ada beberapa aktivitas dalam satu proses aplikasi aktif, aktivitas dengan urutan z tertinggi akan dilanjutkan dan yang lainnya dijeda.
Catatan: Dalam mode multi-aplikasi di Android 9 dan yang lebih rendah, aplikasi
mungkin tidak dalam status
RESUMED
meskipun terlihat oleh pengguna, tetapi
aplikasi mungkin perlu melanjutkan operasinya saat tidak menjadi yang utama. Misalnya
, aplikasi video dalam status ini harus terus memutar videonya. Karena
\alasan ini, kami menyarankan aktivitas yang memutar video tidak
menjeda pemutaran video sebagai respons terhadap
peristiwa siklus proses
ON_PAUSE
. Sebagai gantinya, aktivitas akan memulai
pemutaran sebagai respons terhadap
ON_START
, dan menjeda pemutaran sebagai respons terhadap
ON_STOP
. Jika Anda menangani peristiwa siklus proses secara langsung dan bukan
menggunakan paket
Siklus proses,
jeda pemutaran video di pengendali onStop()
, lalu lanjutkan pemutaran di
onStart()
.
Perubahan konfigurasi
Bila pengguna mengalihkan aplikasi ke mode multi-aplikasi, sistem akan memberi tahu aktivitas tentang perubahan konfigurasi, sebagaimana disebutkan dalam Menangani perubahan konfigurasi. Hal ini juga terjadi bila pengguna mengubah ukuran aplikasi, atau mengalihkan aplikasi kembali ke mode layar penuh.
Pada dasarnya, perubahan ini memiliki implikasi siklus proses aktivitas yang sama seperti saat sistem memberi tahu aplikasi bahwa perangkat telah beralih dari orientasi potret ke mode lanskap, kecuali dimensi perangkat telah berubah, bukan hanya ditukar. Sebagaimana dibahas dalam Menangani perubahan konfigurasi, aktivitas dapat menangani perubahan konfigurasi itu sendiri, atau dapat mengizinkan sistem menghancurkan aktivitas dan membuatnya kembali dengan dimensi baru.
Jika pengguna mengubah ukuran jendela dan membuat dimensinya lebih besar,
sistem akan mengubah ukuran aktivitas untuk menyesuaikan dengan tindakan pengguna dan memunculkan perubahan konfigurasi
sesuai kebutuhan. Jika aplikasi mengalami keterlambatan dalam menggambar di area yang baru ditampilkan,
sistem akan mengisi sementara area tersebut dengan warna yang ditetapkan oleh
atribut windowBackground
atau atribut gaya windowBackgroundFallback
default.
Akses resource eksklusif
Untuk membantu mendukung fitur multi-resume, terdapat callback siklus proses yang baru,
onTopResumedActivityChanged()
.
Metode ini dipanggil ketika suatu aktivitas memperoleh atau kehilangan posisi teratas aktivitas yang dilanjutkan. Ini penting untuk diketahui saat suatu aktivitas menggunakan resource singleton yang dipakai bersama, seperti mikrofon atau kamera.
Kotlin
override fun onTopResumedActivityChanged(topResumed: Boolean) { if (topResumed) { // Top resumed activity // Can be a signal to re-acquire exclusive resources } else { // No longer the top resumed activity } }
Java
@Override public void onTopResumedActivityChanged(boolean topResumed) { if (topResumed) { // Top resumed activity // Can be a signal to re-acquire exclusive resources } else { // No longer the top resumed activity } }
Perhatikan bahwa aplikasi dapat kehilangan resource karena alasan lain, seperti pelepasan hardware yang digunakan bersama.
Dalam kasus apa pun, aplikasi harus dapat menangani peristiwa dan perubahan status yang memengaruhi resource yang tersedia dengan baik.
Untuk aplikasi yang menggunakan kamera,
CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged()
memberikan petunjuk bahwa ini mungkin saat yang tepat untuk mencoba mendapatkan akses ke
kamera. Metode ini tersedia mulai Android 10 (API level 29).
Ingat bahwa resizeableActivity=false
tidak menjamin akses eksklusif ke
kamera, karena aplikasi lain yang menggunakan kamera dapat dibuka di layar
lain.
Gambar 2. Kamera dalam mode multi-aplikasi.
Aplikasi Anda tidak perlu merilis kamera saat aplikasi kehilangan fokus. Misalnya, Anda mungkin ingin melanjutkan pratinjau kamera saat pengguna berinteraksi dengan aplikasi teratas yang dilanjutkan yang baru difokuskan. Aplikasi Anda tetap dapat menjalankan kamera saat tidak menjadi aplikasi teratas yang dilanjutkan, tetapi aplikasi harus menangani kasus pemutusan hubungan dengan benar. Ketika aplikasi teratas yang dilanjutkan ingin menggunakan kamera, aplikasi tersebut dapat membukanya, dan aplikasi Anda akan kehilangan akses. Aplikasi Anda dapat membuka kembali kamera saat aplikasi mendapatkan fokus kembali.
Setelah aplikasi menerima
CameraDevice.StateCallback#onDisconnected()
callback, panggilan selanjutnya pada perangkat kamera akan menampilkan
CameraAccessException
.
Multi-tampilan
Android 10 (API level 29) mendukung aktivitas pada tampilan sekunder. Jika suatu aktivitas berjalan pada perangkat dengan beberapa tampilan, pengguna dapat memindahkan aktivitas dari satu tampilan ke tampilan lainnya. Multi-resume juga berlaku untuk skenario multilayar; beberapa aktivitas dapat menerima input pengguna secara bersamaan.
Aplikasi dapat menentukan tampilan mana yang harus dijalankan pada saat diluncurkan, atau saat
membuat aktivitas lain. Perilaku ini bergantung pada mode peluncuran aktivitas
yang ditentukan dalam file manifes, dan dalam flag intent serta opsi yang disetel oleh
entitas yang meluncurkan aktivitas. Lihat
ActivityOptions
untuk detail
selengkapnya.
Saat berpindah ke tampilan sekunder, aktivitas dapat melalui update
konteks, perubahan ukuran jendela, serta perubahan konfigurasi dan resource. Jika aktivitas menangani perubahan konfigurasi, aktivitas akan diberi tahu di onConfigurationChanged()
; jika tidak, aktivitas akan diluncurkan kembali.
Suatu aktivitas harus memeriksa tampilan saat ini di onCreate
dan
onConfigurationChanged
jika menangani perubahan konfigurasi. Pastikan untuk
memperbarui resource dan tata letak saat tampilan berubah.
Jika mode peluncuran yang dipilih untuk suatu aktivitas memungkinkan beberapa instance, peluncuran pada layar sekunder dapat membuat instance aktivitas baru. Kedua aktivitas akan dilanjutkan secara bersamaan.
Gambar 3. Beberapa instance aktivitas di beberapa tampilan.
Anda mungkin juga ingin membaca tentang API multi-tampilan yang diperkenalkan di Android 8.0.
Konteks aktivitas vs aplikasi
Menggunakan konteks yang tepat sangat penting dalam multi-tampilan. Saat mengakses resource, konteks aktivitas (yang ditampilkan) berbeda dengan konteks aplikasi (yang tidak ditampilkan).
Konteks aktivitas berisi informasi tentang tampilan dan selalu disesuaikan untuk area tampilan tempat aktivitas muncul. Hal ini memungkinkan Anda mendapatkan informasi yang benar tentang kepadatan tampilan atau metrik jendela yang dimiliki aplikasi Anda saat ini. Anda harus selalu menggunakan konteks aktivitas (atau konteks berbasis UI lainnya) untuk mendapatkan informasi tentang jendela atau tampilan saat ini. Hal ini juga memengaruhi beberapa API sistem yang menggunakan informasi dari konteks (misalnya, lihat Ringkasan Toast).
Konfigurasi jendela aktivitas dan tampilan induk menentukan resource dan konteks. Dapatkan tampilan saat ini sebagai berikut:
Kotlin
val activityDisplay = activity.getDisplay()
Java
Display activityDisplay = activity.getDisplay();
Mendapatkan metrik jendela aktivitas saat ini:
Kotlin
val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()
Java
WindowMetrics windowMetrics = activity.getWindowManager().getCurrentWindowMetrics();
Dapatkan metrik jendela maksimum untuk konfigurasi sistem saat ini:
Kotlin
val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()
Java
WindowMetrics maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics();
Metrik jendela maksimum adalah untuk membuat perhitungan, pilihan tata letak, atau
menentukan ukuran resource yang akan diambil sebelumnya. Dengan tersedianya metrik ini dalam onCreate()
, memungkinkan Anda membuat keputusan tersebut sebelum tata letak pertama
diteruskan. Metrik ini tidak boleh digunakan untuk menata letak elemen tampilan tertentu; sebagai gantinya, gunakan informasi dari objek Configuration
.
Potongan layar
Perangkat foldable mungkin memiliki geometri potongan yang berbeda saat dilipat dan dibentangkan. Untuk menghindari masalah potongan, baca Praktik terbaik untuk potongan layar.
Layar sekunder
Anda bisa mendapatkan tampilan yang tersedia dari
layanan sistem DisplayManager
:
Kotlin
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays = displayManager.getDisplays()
Java
DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE); Display[] displays = displayManager.getDisplays();
Gunakan class Display
untuk mendapatkan
informasi tentang tampilan tertentu, seperti ukuran tampilan atau
flag yang menunjukkan apakah
tampilan aman. Namun, jangan anggap bahwa ukuran tampilan akan
sama dengan area tampilan yang dialokasikan untuk aplikasi Anda. Ingatlah bahwa dalam
mode multi-aplikasi, aplikasi Anda menempati sebagian tampilan.
Menentukan apakah aktivitas dapat diluncurkan pada tampilan:
Kotlin
val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent)
Java
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); boolean activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent);
Kemudian, luncurkan aktivitas di layar:
Kotlin
val options = ActivityOptions.makeBasic() options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent, options.toBundle())
Java
ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchDisplayId(targetDisplay.displayId); startActivity(intent, options.toBundle());
Dukungan multi-tampilan
Android memberikan dukungan multi-tampilan untuk keyboard virtual, wallpaper, dan peluncur.
Keyboard virtual
Keyboard dapat ditampilkan di layar sekunder jika tampilan dikonfigurasi untuk mendukung dekorasi sistem. Editor metode input otomatis muncul jika kolom teks meminta input pada tampilan tersebut.
Gambar 4. Keyboard pada tampilan sekunder.
Wallpaper
Di Android 10 (API level 29), layar sekunder bisa memiliki wallpaper sendiri. Framework
membuat instance terpisah dari
WallpaperService.Engine
untuk setiap tampilan. Pastikan permukaan setiap mesin ditarik
secara independen. Developer dapat memuat aset menggunakan konteks tampilan di
WallpaperService.Engine#getDisplayContext()
.
Selain itu, pastikan file WallpaperInfo.xml
Anda menyetel
android:supportsMultipleDisplays="true"
.
Gambar 5. Wallpaper di ponsel dan tampilan sekunder.
Peluncur
Kategori filter intent baru, SECONDARY_HOME
, menyediakan aktivitas khusus
untuk layar sekunder. Instance aktivitas ini digunakan pada semua layar yang
mendukung dekorasi sistem, satu instance untuk setiap layar.
<activity>
...
<intent-filter>
<category android:name="android.intent.category.SECONDARY_HOME" />
...
</intent-filter>
</activity>
Aktivitas harus memiliki mode peluncuran yang tidak mencegah beberapa instance
dan dapat beradaptasi dengan berbagai ukuran layar. Mode peluncuran tidak boleh
singleInstance
atau singleTask
.
Misalnya, implementasi AOSP dari Launcher3
mendukung aktivitas SECONDARY_HOME
.
Gambar 6. Peluncur Desain Material di ponsel.
Gambar 7. Peluncur Desain Material pada tampilan sekunder.
Metrik aplikasi
Android 11 (API level 30) memperkenalkan metode
WindowManager
berikut untuk
menyediakan batas aplikasi yang berjalan dalam mode multi-aplikasi:
getCurrentWindowMetrics()
: menampilkan objekWindowMetrics
untuk status windowing sistem saat inigetMaximumWindowMetrics()
: menampilkanWindowMetrics
untuk status windowing potensial terbesar pada sistem
Metode library Jetpack WindowManager
computeCurrentWindowMetrics()
dan
computeMaximumWindowMetrics()
masing-masing menawarkan fungsionalitas yang serupa, tetapi dengan kompatibilitas mundur untuk
API level 14.
Metode yang tidak digunakan lagi
Metode Display
getSize()
dan
getMetrics()
tidak digunakan lagi dalam API level 30 untuk mendukung metode WindowManager
baru.
Android 12 (API level 31) tidak lagi menggunakan metode Display
getRealSize()
dan
getRealMetrics()
serta mengupdate perilakunya agar lebih cocok dengan perilaku
getMaximumWindowMetrics()
.
Konfigurasi mode multi-aplikasi
Jika aplikasi menargetkan Android 7.0 (API level 24) atau yang lebih tinggi, Anda dapat mengonfigurasi
cara dan apakah aktivitas aplikasi mendukung tampilan multi-aplikasi. Anda dapat
menyetel atribut dalam manifes untuk mengontrol ukuran dan tata letak. Setelan
atribut aktivitas root berlaku untuk semua aktivitas dalam stack tugasnya.
Misalnya, jika aktivitas root memiliki android:resizeableActivity="true"
,
semua aktivitas dalam stack tugas dapat diubah ukurannya. Pada beberapa perangkat yang lebih besar, seperti Chromebook, aplikasi mungkin berjalan di jendela yang dapat diubah ukurannya meskipun Anda
menentukan android:resizeableActivity="false"
. Jika hal ini akan merusak aplikasi, Anda
dapat menggunakan filter untuk membatasi ketersediaan aplikasi di perangkat tersebut.
Catatan: Jika Anda mem-build aplikasi multi-orientasi yang menargetkan API level 23 atau yang lebih rendah, dan pengguna menggunakan aplikasi dalam mode multi-aplikasi, sistem akan mengubah ukuran aplikasi secara paksa. Sistem menampilkan kotak dialog yang memperingatkan pengguna bahwa aplikasi mungkin berperilaku tidak terduga. Sistem tidak mengubah ukuran aplikasi berorientasi tetap; jika pengguna berusaha membuka aplikasi berorientasi tetap saat dalam mode multi-aplikasi, aplikasi akan menggunakan seluruh layar.
Android 12 (API level 31) ditetapkan secara default ke mode multi-aplikasi. Pada layar besar
(sw >= 600dp), semua aplikasi berjalan dalam mode multi-aplikasi, terlepas dari konfigurasi
aplikasi. Pada layar kecil, sistem memeriksa aktivitas
minWidth
,
minHeight
,
dan setelan
resizeableActivity
untuk menentukan apakah aktivitas dapat berjalan dalam mode multi-aplikasi.
resizeableActivity
Tetapkan atribut ini dalam elemen
<activity>
atau
<application>
manifes Anda untuk
mengaktifkan atau menonaktifkan tampilan multi-aplikasi untuk API level 30 dan yang lebih rendah:
<application android:name=".MyActivity" android:resizeableActivity=["true" | "false"] />
Jika atribut ini ditetapkan ke true, aktivitas dapat diluncurkan dalam mode layar terpisah dan format bebas. Jika atribut ini ditetapkan ke false, aktivitas tidak akan mendukung mode multi-aplikasi. Jika nilainya adalah false, dan pengguna mencoba meluncurkan aktivitas dalam mode multi-aplikasi, aktivitas tersebut akan mengambil alih layar penuh.
Jika aplikasi menargetkan API level 24 atau yang lebih tinggi, tetapi Anda tidak menetapkan nilai untuk atribut ini, nilai atribut akan ditetapkan secara default ke true.
Jika aplikasi Anda menargetkan API level 31 atau yang lebih tinggi, atribut ini berfungsi secara berbeda pada layar kecil dan besar:
- Layar besar (sw >= 600dp): Semua aplikasi mendukung mode multi-aplikasi. Atribut
ini menunjukkan apakah suatu aktivitas dapat diubah ukurannya. Jika
resizeableActivity="false"
, aplikasi dialihkan ke mode kompatibilitas saat diperlukan agar sesuai dengan dimensi tampilan. - Layar kecil (sw < 600dp): Jika
resizeableActivity="true"
dan lebar minimum dan tinggi minimum aktivitas berada dalam persyaratan multi-aplikasi, aktivitas akan mendukung mode multi-aplikasi. JikaresizeableActivity="false"
, aktivitas tidak mendukung mode multi-aplikasi, terlepas dari tinggi dan lebar minimum aktivitas.
supportsPictureInPicture
Tetapkan atribut ini ke node
<activity>
manifes untuk menunjukkan
apakah aktivitas mendukung mode picture-in-picture.
<activity android:name=".MyActivity" android:supportsPictureInPicture=["true" | "false"] />
Catatan: Jika supportsPictureInPicture="true"
, Anda
harus menetapkan atribut android:configChanges
untuk memungkinkan
aktivitas Anda menangani perubahan konfigurasi (lihat
Dukungan picture-in-picture).
configChanges
Untuk menangani sendiri perubahan konfigurasi multi-aplikasi, seperti saat pengguna
mengubah ukuran jendela, tambahkan
atribut android:configChanges
ke node manifes aplikasi Anda
<activity>
dengan
nilai minimal berikut:
<activity android:name=".MyActivity" android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation" />
Setelah menambahkan
android:configChanges
,
aktivitas dan fragmen Anda akan menerima callback ke
onConfigurationChanged()
bukan dihancurkan dan dibuat ulang. Kemudian, Anda dapat memperbarui tampilan secara
manual, memuat ulang resource, dan melakukan operasi lain sesuai kebutuhan.
<layout>
Dengan Android 7.0, elemen manifes <layout>
mendukung beberapa atribut
yang memengaruhi cara aktivitas berperilaku dalam mode multi-aplikasi:
-
android:defaultWidth
- Lebar default aktivitas saat diluncurkan dalam mode format bebas.
-
android:defaultHeight
- Tinggi default aktivitas saat diluncurkan dalam mode format bebas.
-
android:gravity
-
Penempatan awal aktivitas saat diluncurkan dalam mode format bebas. Lihat referensi
Gravity
untuk mengetahui nilai yang cocok. -
android:minHeight
,android:minWidth
- Tinggi dan lebar minimum untuk aktivitas dalam mode layar terpisah dan format bebas. Jika pengguna memindahkan pembagi dalam mode layar terpisah untuk membuat aktivitas lebih kecil dari batas minimum yang ditetapkan, sistem akan memangkas aktivitas sesuai ukuran yang diminta pengguna.
Kode berikut menunjukkan cara menentukan ukuran dan lokasi default aktivitas dan ukuran minimumnya saat aktivitas ditampilkan dalam mode format bebas:
<activity android:name=".MyActivity"> <layout android:defaultHeight="500dp" android:defaultWidth="600dp" android:gravity="top|end" android:minHeight="450dp" android:minWidth="300dp" /> </activity>
Mode multi-aplikasi saat runtime
Mulai dari Android 7.0, sistem menawarkan fungsi untuk mendukung aplikasi yang dapat berjalan dalam mode multi-aplikasi.
Fitur yang dinonaktifkan dalam mode multi-aplikasi
Fitur tertentu akan dinonaktifkan atau diabaikan bila perangkat sedang dalam mode multi-aplikasi, karena dianggap tidak logis bagi suatu aktivitas yang mungkin berbagi layar perangkat dengan aktivitas atau aplikasi lainnya.
Beberapa opsi penyesuaian UI sistem dinonaktifkan; misalnya, aplikasi tidak dapat menyembunyikan status bar jika berjalan dalam mode multi-aplikasi (lihat Mengontrol visibilitas UI sistem).
Sistem mengabaikan perubahan pada atribut android:screenOrientation
.
Kueri dan callback mode multi-aplikasi
Class Activity
menawarkan
metode berikut untuk mendukung tampilan multi-aplikasi:
-
isInMultiWindowMode()
- Menunjukkan apakah aktivitas sedang dalam mode multi-aplikasi.
-
isInPictureInPictureMode()
- Menunjukkan apakah aktivitas dalam mode picture-in-picture.
-
Catatan: Mode picture-in-picture adalah kasus khusus
mode multi-aplikasi. Jika
myActivity.isInPictureInPictureMode()
menampilkan true, makamyActivity.isInMultiWindowMode()
juga akan menampilkan true. -
onMultiWindowModeChanged()
- Sistem akan memanggil metode ini setiap kali aktivitas masuk atau keluar dari mode multi-aplikasi. Sistem akan meneruskan nilai true ke metode ini jika aktivitas memasuki mode multi-aplikasi, dan nilai false jika aktivitas keluar dari mode multi-aplikasi.
-
onPictureInPictureModeChanged()
- Sistem akan memanggil metode ini setiap kali aktivitas masuk atau keluar dari mode picture-in-picture. Sistem akan meneruskan nilai true ke metode ini jika aktivitas memasuki mode picture-in-picture, dan nilai false jika aktivitas keluar dari mode picture-in-picture.
Class Fragment
menampilkan versi
berbagai metode ini; misalnya,
Fragment.onMultiWindowModeChanged()
.
Mode picture-in-picture
Untuk mengalihkan aktivitas ke mode picture-in-picture, panggil
enterPictureInPictureMode()
Metode ini tidak berpengaruh jika perangkat tidak mendukung mode
picture-in-picture. Untuk informasi selengkapnya, lihat
Dukungan Picture-in-picture.
Aktivitas baru dalam mode multi-aplikasi
Saat meluncurkan aktivitas baru, Anda dapat menunjukkan bahwa aktivitas baru harus
ditampilkan berdampingan dengan aktivitas saat ini jika memungkinkan. Gunakan flag intent
FLAG_ACTIVITY_LAUNCH_ADJACENT
, yang memberi tahu sistem untuk mencoba
membuat aktivitas baru di jendela sebelah, sehingga kedua aktivitas tersebut berbagi
layar. Sistem melakukan upaya terbaik untuk melakukannya, tetapi keberhasilannya tidak
dijamin.
Jika perangkat sedang dalam mode format bebas dan Anda meluncurkan aktivitas baru, dimensi dan lokasi layarnya
dapat ditetapkan dengan memanggil
ActivityOptions.setLaunchBounds()
. Metode ini tidak berpengaruh jika
perangkat tidak sedang dalam mode multi-aplikasi.
Pada API level 30 dan yang lebih rendah, jika Anda meluncurkan aktivitas dalam stack tugas, aktivitas tersebut akan menggantikan aktivitas pada layar, dan mewarisi semua properti multi-aplikasinya. Jika ingin meluncurkan aktivitas baru sebagai jendela terpisah dalam mode multi-aplikasi, Anda harus meluncurkannya dalam stack tugas baru.
Android 12 (API level 31) memungkinkan aplikasi membagi jendela tugas aplikasi di antara beberapa aktivitas. Anda dapat menentukan cara aplikasi menampilkan aktivitasnya — layar penuh, berdampingan, atau ditumpuk — dengan membuat file konfigurasi XML atau melakukan panggilan Jetpack WindowManager API.
Tarik lalu lepas
Pengguna dapat menarik lalu melepas data dari satu aktivitas ke aktivitas lainnya saat kedua
aktivitas berbagi layar. (Sebelum Android 7.0, pengguna hanya dapat
menarik lalu melepas data dalam satu aktivitas.) Untuk menambahkan dukungan
dengan cepat guna menerima konten yang dilepas di widget TextView
yang dapat diedit, lihat
antarmuka
OnReceiveContentListener
. Untuk dukungan tarik lalu lepas yang komprehensif, seperti
memungkinkan penarikan konten dari aplikasi Anda, lihat
Tarik lalu lepas.
Class dan metode penting untuk mengimplementasikan tarik lalu lepas mencakup hal-hal berikut:
-
ClipData
- Representasi data di papan klip. Mereferensikan data yang akan ditransfer oleh operasi tarik lalu lepas.
-
DragAndDropPermissions
- Objek token bertanggung jawab menetapkan izin yang diberikan untuk aplikasi yang menerima pelepasan.
-
DragAndDropPermissions.release()
-
Merilis izin yang diperlukan untuk mengakses data di URI konten yang diberikan
dalam
ClipData
. Jika metode ini tidak dipanggil, izin akan dirilis secara otomatis saat aktivitas yang memuatnya dihancurkan. -
View.startDragAndDrop()
-
Untuk mengaktifkan tarik lalu lepas lintas aktivitas, teruskan flag
DRAG_FLAG_GLOBAL
. Jika Anda perlu memberikan izin URI untuk aktivitas penerima, teruskanDRAG_FLAG_GLOBAL_URI_READ
atauDRAG_FLAG_GLOBAL_URI_WRITE
. -
View.cancelDragAndDrop()
- Membatalkan operasi tarik yang sedang berlangsung. Hanya dapat dipanggil oleh aplikasi yang menghasilkan operasi tarik.
-
View.updateDragShadow()
- Menggantikan bayangan tarik untuk operasi tarik yang sedang berlangsung. Hanya dapat dipanggil oleh aplikasi yang menghasilkan operasi tarik.
-
Activity.requestDragAndDropPermissions()
-
Meminta izin untuk URI konten yang diteruskan dengan
ClipData
yang terdapat dalamDragEvent
.
Multi-instance
Setiap aktivitas root memiliki tugasnya sendiri, yang berjalan pada proses terpisah dan
ditampilkan di jendelanya sendiri. Untuk meluncurkan instance baru aplikasi di jendela
terpisah, Anda dapat memulai aktivitas baru dengan flag FLAG_ACTIVITY_NEW_TASK
.
Anda dapat menggabungkannya dengan beberapa atribut multi-aplikasi untuk
meminta lokasi tertentu untuk jendela baru. Misalnya, aplikasi belanja
dapat menampilkan beberapa jendela untuk membandingkan produk.
Android 12 (API level 31) memungkinkan Anda meluncurkan dua instance aktivitas berdampingan di jendela tugas yang sama.
Multi-instance bukan tata letak multi-panel, yaitu tata letak daftar/detail
yang menggunakan
SlidingPaneLayout
, yang
berjalan di dalam satu jendela.
Perhatikan bahwa ketika beberapa instance berjalan di jendela terpisah pada perangkat foldable, satu atau beberapa instance mungkin dikirim ke latar belakang jika posenya berubah. Misalnya, anggaplah perangkat dibentangkan dan memiliki dua instance aplikasi yang berjalan di dua jendela pada salah satu batas tampilan. Jika perangkat dilipat, salah satu instance mungkin akan dihentikan, bukan mencoba menyesuaikan ke jendela untuk kedua instance pada layar yang lebih kecil.
Verifikasi mode multi-aplikasi
Baik aplikasi menargetkan API level 24 atau yang lebih tinggi maupun tidak, Anda harus memastikan perilaku aplikasi dalam mode multi-aplikasi jika pengguna mencoba meluncurkannya dalam mode multi-aplikasi di perangkat yang menjalankan Android 7.0 atau yang lebih tinggi.
Mengonfigurasi perangkat pengujian
Jika menjalankan Android 7.0 atau yang lebih tinggi, perangkat otomatis mendukung mode layar terpisah.
Jika aplikasi Anda menargetkan API level 23 atau yang lebih rendah
Saat pengguna mencoba menggunakan aplikasi dalam mode multi-aplikasi, sistem akan mengubah ukuran aplikasi secara paksa kecuali jika aplikasi mendeklarasikan orientasi tetap.
Jika aplikasi tidak mendeklarasikan orientasi tetap, Anda harus meluncurkan aplikasi di perangkat yang menjalankan Android 7.0 atau yang lebih tinggi dan mencoba mengalihkan aplikasi tersebut ke mode layar terpisah. Pastikan pengalaman pengguna dapat diterima jika aplikasi diubah ukurannya secara paksa.
Jika aplikasi mendeklarasikan orientasi tetap, Anda harus mencoba mengalihkan aplikasi ke mode multi-aplikasi. Pastikan bahwa saat Anda melakukannya, aplikasi tetap dalam mode layar penuh.
Jika aplikasi Anda menargetkan API level 24 hingga 30
Jika aplikasi Anda menargetkan API level 24 hingga 30 dan tidak menonaktifkan dukungan multi-aplikasi, verifikasi perilaku berikut dalam mode layar terpisah dan mode berformat bebas:
- Luncurkan aplikasi dalam layar penuh, lalu beralihlah ke mode multi-aplikasi dengan menekan lama tombol Terbaru. Pastikan bahwa aplikasi beralih dengan benar.
- Luncurkan aplikasi secara langsung dalam mode multi-aplikasi dan pastikan bahwa aplikasi diluncurkan dengan benar. Anda dapat meluncurkan aplikasi dalam mode multi-aplikasi dengan menekan tombol Terbaru, lalu menekan lama baris judul aplikasi dan menariknya ke salah satu area yang disorot pada layar.
- Ubah ukuran aplikasi dalam mode layar terpisah dengan menarik pembagi layar. Pastikan apakah aplikasi mengubah ukuran tanpa error dan elemen UI yang diperlukan terlihat.
- Jika Anda telah menetapkan dimensi minimum untuk aplikasi, coba ubah ukuran aplikasi di bawah dimensi tersebut. Pastikan bahwa Anda tidak dapat mengubah ukuran aplikasi menjadi lebih kecil dari dimensi minimum yang ditetapkan.
- Melalui semua pengujian, pastikan bahwa performa aplikasi dapat diterima. Misalnya, pastikan bahwa tidak ada keterlambatan yang terlalu lama dalam mengupdate UI setelah ukuran aplikasi diubah.
Jika aplikasi Anda menargetkan API level 31 atau yang lebih tinggi
Jika aplikasi Anda menargetkan API level 31 atau yang lebih tinggi, serta lebar minimum dan tinggi minimum aktivitas utama kurang dari atau sama dengan dimensi masing-masing area tampilan yang tersedia, verifikasi semua perilaku yang tercantum untuk API level 24 hingga 30.
Catatan: Anda dapat secara terprogram menentukan apakah aplikasi berada dalam
mode multi-aplikasi dengan memeriksa nilai hasil
Activity#isInMultiWindowMode()
.
Checklist pengujian
Untuk memastikan performa aplikasi dalam mode multi-aplikasi, coba operasi berikut. Anda harus mencoba operasi ini dalam mode layar terpisah dan mode format bebas, kecuali dinyatakan lain.
- Masuk dan keluar dari mode multi-aplikasi.
- Alihkan dari aplikasi Anda ke aplikasi lain, dan pastikan bahwa aplikasi berperilaku sebagaimana mestinya saat terlihat tetapi tidak aktif. Misalnya, jika aplikasi Anda sedang memutar video, pastikan bahwa video terus diputar saat pengguna berinteraksi dengan aplikasi lain.
- Dalam mode layar terpisah, coba geser pembagi layar untuk membuat aplikasi Anda lebih besar dan lebih kecil. Coba operasi ini dalam konfigurasi berdampingan dan atas-bawah. Pastikan bahwa aplikasi tidak error, fungsi penting dapat terlihat, dan operasi ubah ukuran tidak memerlukan waktu terlalu lama.
- Lakukan beberapa operasi ubah ukuran berturut-turut dalam waktu cepat. Pastikan bahwa aplikasi tidak error atau mengalami kebocoran memori. Memory Profiler Android Studio menyediakan informasi tentang penggunaan memori aplikasi Anda (lihat Memeriksa penggunaan memori aplikasi dengan Memory Profiler).
- Gunakan aplikasi secara normal di sejumlah konfigurasi jendela berbeda, dan pastikan bahwa aplikasi berperilaku sebagaimana mestinya. Pastikan bahwa teks terbaca dan elemen UI tidak terlalu kecil untuk interaksi.
Jika Anda telah menonaktifkan dukungan multi-aplikasi
Pada API level 24 hingga 30, jika Anda menonaktifkan dukungan multi-aplikasi dengan menetapkan
android:resizeableActivity="false"
, Anda harus meluncurkan aplikasi di
perangkat yang menjalankan Android 7.0 hingga 11 dan mencoba menempatkan aplikasi di
mode layar terpisah dan format bebas. Pastikan bahwa saat Anda melakukannya, aplikasi tetap
dalam mode layar penuh.
Referensi tambahan
Untuk informasi selengkapnya tentang dukungan multi-aplikasi di Android, lihat: