Mode multi-aplikasi memungkinkan beberapa aplikasi berbagi layar yang sama secara bersamaan. Aplikasi dapat berdampingan atau satu di atas yang lain (mode layar terpisah), satu aplikasi di jendela kecil yang menempatkan aplikasi lain (mode picture-in-picture), atau aplikasi di jendela terpisah yang dapat dipindahkan dan diubah ukurannya (mode bentuk bebas).
Pengalaman pengguna bergantung pada versi Android dan jenis perangkat:
Android 7.0 (API level 24) memperkenalkan mode layar terpisah di layar kecil perangkat dan mode picture-in-picture di perangkat tertentu.
Mode layar terpisah mengisi layar dengan dua aplikasi, yang menampilkannya secara berdampingan atau satu di atas yang lain. Pengguna dapat menarik {i>divider<i} memisahkan kedua aplikasi untuk membuat satu aplikasi 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).
Mode bentuk bebas, yang memungkinkan pengguna dengan bebas mengubah ukuran setiap aktivitas, dapat diaktifkan oleh produsen perangkat layar besar.
Anda dapat mengonfigurasi cara aplikasi menangani mode multi-aplikasi dengan menentukan dimensi minimum yang diizinkan aktivitas Anda. Anda juga dapat menonaktifkan mode multi-aplikasi untuk aplikasi dengan menyetel
resizeabableActivity="false"
untuk memastikan sistem selalu menampilkan aplikasi Anda dalam layar penuh.
Android 8.0 (API level 26) memperluas mode picture-in-picture ke layar perangkat layar.
Android 12 (API level 31) membuat perilaku standar mode multi-aplikasi.
Di perangkat layar besar (class ukuran jendela sedang atau diperluas), platform mendukung semua aplikasi dalam mode multi-aplikasi, apa pun aplikasi konfigurasi Anda. Jika
resizeableActivity="false"
, aplikasi ditempatkan ke mode kompatibilitas saat diperlukan untuk mengakomodasi dimensi tampilan.Di layar kecil (class ukuran jendela ringkas), sistem akan memeriksa
minWidth
danminHeight
aktivitas untuk menentukan apakah aktivitas dapat berjalan dalam mode multi-aplikasi. JikaresizeableActivity="false"
, aplikasi dicegah berjalan di mode multi-aplikasi, terlepas dari lebar dan tinggi minimum.
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—atas atau bawah, kiri atau kanan.
Peluncuran berdekatan
Jika aplikasi Anda perlu mengakses konten melalui intent, Anda bisa menggunakan
FLAG_ACTIVITY_LAUNCH_ADJACENT
untuk membuka konten di sebelah
{i>split-screen window <i}(layar terpisah).
FLAG_ACTIVITY_LAUNCH_ADJACENT
diperkenalkan di Android 7.0 (API level 24) untuk
aktifkan aplikasi yang berjalan dalam mode layar terpisah untuk meluncurkan aktivitas di area yang berdekatan
jendela.
Android 12L (API level 32) dan yang lebih baru telah memperluas definisi tanda ke aktifkan aplikasi yang berjalan pada layar penuh untuk mengaktifkan mode layar terpisah, lalu luncurkan aktivitas di jendela sebelahnya.
Untuk meluncurkan aktivitas yang berdekatan, gunakan FLAG_ACTIVITY_LAUNCH_ADJACENT
di
bersama dengan FLAG_ACTIVITY_NEW_TASK
, misalnya:
Kotlin
fun openUrlInAdjacentWindow(url: String) { Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url) addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or Intent.FLAG_ACTIVITY_NEW_TASK) }.also { intent -> startActivity(intent) } }
Java
public void openUrlInAdjacentWindow(String url) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }
Siklus proses aktivitas dalam mode multi-aplikasi
Mode multi-aplikasi tidak mengubah siklus proses aktivitas. Namun, status aplikasi yang dilanjutkan di beberapa jendela berbeda pada versi yang berbeda Android.
Multi-resume
Android 10 (level API 29) dan versi yang lebih tinggi mendukung multi-resume—semua
aktivitas tetap dalam status RESUMED
saat perangkat berada dalam multi-aplikasi
mode. Suatu aktivitas dapat dijeda jika aktivitas transparan berada di atas
atau tidak dapat difokuskan, misalnya, aktivitas dalam
mode picture-in-picture. Mungkin juga tidak ada aktivitas yang memiliki fokus pada
waktu tertentu, misalnya, jika panel samping notifikasi terbuka. onStop()
berfungsi seperti biasa: metode ini dipanggil setiap kali aktivitas dinonaktifkan
layar.
Multi-resume juga tersedia di perangkat tertentu yang menjalankan Android 9 (API level) 28). Untuk ikut serta dalam multi-resume di perangkat Android 9, tambahkan manifes berikut {i>metadata<i}:
<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. Ini
aktivitas dianggap utama, dan merupakan satu-satunya aktivitas di RESUMED
status. Semua aktivitas lain yang terlihat bernilai STARTED
, tetapi tidak RESUMED
.
Akan tetapi, sistem memberikan aktivitas yang terlihat namun tidak dilanjutkan ini lebih tinggi
prioritas dibandingkan aktivitas yang tidak terlihat. Jika pengguna berinteraksi dengan salah satu
aktivitas yang terlihat, aktivitas tersebut akan dilanjutkan, dan aktivitas teratas
aktivitas memasuki status STARTED
.
Jika ada beberapa aktivitas dalam satu proses aplikasi aktif, aktivitas dengan urutan z tertinggi akan dilanjutkan, dan yang lainnya dijeda.
Perubahan konfigurasi
Bila pengguna mengalihkan aplikasi ke mode multi-aplikasi, sistem akan memberi tahu aktivitas perubahan konfigurasi seperti yang ditentukan dalam Handle configuration perubahan. Hal ini juga terjadi saat pengguna mengubah ukuran aplikasi atau mengembalikan aplikasi ke mode layar penuh.
Pada dasarnya, perubahan ini memiliki implikasi siklus proses aktivitas yang sama seperti ketika sistem memberi tahu aplikasi bahwa perangkat telah beralih dari mode potret ke mode potret orientasi lanskap, kecuali bahwa dimensi aplikasi diubah, bukan hanya tertukar. Aktivitas Anda dapat menangani perubahan konfigurasi itu sendiri, atau aplikasi Anda dapat memungkinkan 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 tertinggal dalam menggambar di area yang baru diekspos,
sistem akan mengisi sementara area tersebut dengan warna yang ditetapkan oleh
Atribut windowBackground
atau secara default
Atribut gaya windowBackgroundFallback
.
Akses resource eksklusif
Untuk membantu mendukung fitur multi-resume, gunakan
Callback siklus proses onTopResumedActivityChanged()
.
Callback dipanggil saat aktivitas memperoleh atau kehilangan aktivitas teratas yang dilanjutkan penting, yang penting ketika suatu aktivitas menggunakan sumber daya singleton 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 secara baik menangani peristiwa dan perubahan status yang memengaruhi resource yang tersedia.
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).
Perlu diingat bahwa resizeableActivity=false
tidak menjamin akses ke kamera eksklusif
akses, karena aplikasi lain yang menggunakan kamera dapat dibuka di layar lain.
Aplikasi Anda tidak perlu merilis kamera saat aplikasi kehilangan fokus. Misalnya, Anda mungkin ingin melanjutkan pratinjau kamera saat pengguna berinteraksi dengan aplikasi yang dilanjutkan paling atas dan baru difokuskan. Tidak masalah jika aplikasi Anda mempertahankan menjalankan kamera jika itu bukan aplikasi teratas yang dilanjutkan, tetapi harus menangani {i>casing<i} pemutusan koneksi dengan benar. Bila aplikasi yang dilanjutkan paling atas ingin menggunakan kamera, hapenya 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 memunculkan
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 berlaku untuk juga untuk skenario multilayar; beberapa aktivitas dapat menerima input pengguna di perangkat lain di waktu yang sama.
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 entity yang meluncurkan aktivitas. Lihat class ActivityOptions
untuk mengetahui informasi selengkapnya
spesifikasi
pendukung.
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 di layar sekunder dapat membuat instance baru dari aktivitas. Kedua aktivitas akan dilanjutkan secara bersamaan.
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 untuk dapatkan informasi yang benar tentang kepadatan tampilan atau metrik jendela . Anda harus selalu menggunakan konteks aktivitas (atau konteks berbasis UI lainnya konteks) 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();
Dapatkan 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. Tersedianya metrik ini dalam onCreate()
memungkinkan Anda membuat keputusan tersebut sebelum tata letak pertama diteruskan. Metrik ini tidak boleh digunakan untuk menata 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, lihat Mendukung potongan layar.
Tampilan 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
sebagai ukuran tampilan atau flag yang menunjukkan apakah layar aman.
Namun, jangan berasumsi bahwa ukuran tampilan akan sama dengan
area tampilan yang dialokasikan untuk aplikasi Anda. Ingatlah bahwa dalam mode multi-aplikasi,
aplikasi Anda menempati sebagian layar.
Tentukan 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.
Wallpaper
Di Android 10 (API level 29), layar sekunder bisa memiliki wallpaper sendiri. Tujuan
membuat instance terpisah dari WallpaperService.Engine
untuk masing-masing
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
menetapkan android:supportsMultipleDisplays="true"
.
Peluncur
Kategori filter intent baru, SECONDARY_HOME
, menyediakan aktivitas khusus
untuk layar sekunder. Instance aktivitas ini digunakan pada semua tampilan yang mendukung dekorasi sistem, satu instance untuk setiap tampilan.
<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
.
Metrik jendela aplikasi
Android 11 (level API 30) memperkenalkan metode WindowManager
berikut
untuk menyediakan batasan aplikasi yang berjalan dalam mode multi-aplikasi:
getCurrentWindowMetrics()
: Menampilkan objekWindowMetrics
untuk status windowing sistem saat ini.getMaximumWindowMetrics()
: menampilkanWindowMetrics
untuk status windowing potensial dari sistem.
Metode library Jetpack WindowManager computeCurrentWindowMetrics()
dan computeMaximumWindowMetrics()
menawarkan fungsi serupa
masing-masing, tetapi dengan kompatibilitas mundur ke level API 14.
Guna mendapatkan metrik untuk layar selain tampilan saat ini, lakukan hal berikut (seperti yang ditunjukkan dalam cuplikan kode):
- Buat konteks tampilan
- Buat konteks aplikasi untuk tampilan
- Dapatkan
WindowManager
dari konteks jendela aplikasi - Dapatkan
WindowMetrics
dari area tampilan maksimum yang tersedia untuk aplikasi
Kotlin
val windowMetrics = context.createDisplayContext(display) .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null) .getSystemService(WindowManager::class.java) .maximumWindowMetrics
Java
WindowMetrics windowMetrics = context.createDisplayContext(display) .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null) .getSystemService(WindowManager.class) .getMaximumWindowMetrics();
Metode yang tidak digunakan lagi
Metode Display
getSize()
dan getMetrics()
tidak digunakan lagi di
API level 30 yang mendukung metode WindowManager
baru.
Android 12 (API level 31) menghentikan penggunaan metode Display
getRealSize()
dan
getRealMetrics()
dan memperbarui perilakunya agar lebih cocok dengan
perilaku getMaximumWindowMetrics()
.
Konfigurasi mode multi-aplikasi
Jika aplikasi Anda menargetkan Android 7.0 (API level 24) atau yang lebih tinggi, Anda bisa mengonfigurasi cara
dan apakah aktivitas aplikasi Anda mendukung mode multi-aplikasi. Anda dapat mengatur
di manifes Anda untuk mengontrol ukuran dan tata letak. Aktivitas root
setelan atribut berlaku untuk semua aktivitas dalam tumpukan tugasnya. Misalnya,
jika aktivitas root memiliki android:resizeableActivity="true"
, maka semua
aktivitas dalam tumpukan tugas
bisa diubah ukurannya. Pada beberapa perangkat
yang lebih besar, seperti
Pada Chromebook, aplikasi Anda mungkin berjalan di jendela yang dapat diubah ukurannya meskipun Anda menentukan
android:resizeableActivity="false"
. Jika ini merusak aplikasi, Anda dapat menggunakan
filter di Google Play untuk membatasi ketersediaan aplikasi di perangkat tersebut.
Android 12 (API level 31) ditetapkan secara default ke mode multi-aplikasi. Di perangkat layar besar
(class ukuran jendela sedang atau diperluas), semua aplikasi berjalan di multi-aplikasi
tanpa memandang konfigurasi aplikasi. Pada layar kecil, sistem memeriksa
minWidth
, minHeight
, dan resizeableActivity
aktivitas
setelan untuk menentukan apakah aktivitas bisa berjalan dalam mode multi-aplikasi.
resizeableActivity
Tetapkan atribut ini dalam <activity>
atau <application>
manifes Anda
untuk mengaktifkan atau menonaktifkan mode multi-aplikasi untuk level API 30 dan yang lebih rendah:
<application
android:name=".MyActivity"
android:resizeableActivity=["true" | "false"] />;
Jika atribut ini ditetapkan ke true
, aktivitas dapat diluncurkan di layar terpisah
dan mode bentuk bebas. Jika atribut ditetapkan ke false
, aktivitas tidak akan
mendukung mode multi-aplikasi. Jika nilainya false, dan pengguna mencoba
meluncurkan aktivitas dalam mode multi-aplikasi, aktivitas akan mengambil alih
layar.
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 layar kecil dan besar:
- Layar besar (class ukuran jendela sedang atau diperluas): Semua aplikasi
mendukung mode multi-aplikasi. Atribut menunjukkan apakah suatu aktivitas dapat
diubah ukurannya. Jika
resizeableActivity="false"
, aplikasi ditempatkan ke mode kompatibilitas jika diperlukan agar sesuai dengan dimensi tampilan. - Layar kecil (class ukuran jendela ringkas): Jika
resizeableActivity="true"
serta lebar dan tinggi minimum aktivitas berada dalam persyaratan multi-aplikasi, aktivitas mendukung multi-aplikasi mode. JikaresizeableActivity="false"
, aktivitas tidak mendukung mode multi-aplikasi, terlepas dari lebar dan tinggi minimum aktivitas.
supportsPictureInPicture
Tetapkan atribut ini dalam node <activity>
manifes untuk menunjukkan apakah
aktivitas tersebut mendukung mode picture-in-picture.
<activity
android:name=".MyActivity"
android:supportsPictureInPicture=["true" | "false"] />
configChanges
Untuk menangani sendiri perubahan konfigurasi multi-aplikasi, seperti saat pengguna
mengubah ukuran jendela, menambahkan atribut android:configChanges
ke aplikasi
node <activity>
manifes dengan setidaknya nilai 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>
Di Android 7.0 (API level 24) dan yang lebih tinggi, elemen manifes <layout>
mendukung beberapa atribut yang memengaruhi cara perilaku aktivitas dalam multi-aplikasi
mode:
android:defaultHeight
,android:defaultWidth
: Tinggi dan lebar default aktivitas ketika diluncurkan dalam mode bentuk bebas.android:gravity
: Penempatan awal aktivitas saat diluncurkan di mode bentuk bebas. Lihat classGravity
untuk mengetahui nilai yang sesuai.android:minHeight
,android:minWidth
: Tinggi dan lebar minimum untuk aktivitas ini dalam mode layar terpisah dan bentuk bebas. Jika pengguna berpindah {i>divider<i} dalam mode layar terpisah untuk membuat aktivitas lebih kecil dari minimum yang ditetapkan, sistem akan memangkas aktivitas sesuai ukuran pengguna permintaan.
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
Dalam mode multi-aplikasi, Android mungkin menonaktifkan atau mengabaikan fitur yang tidak berlaku untuk aktivitas yang berbagi layar perangkat dengan aktivitas atau aplikasi lain.
Selain itu, 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 multi-aplikasi
mode:
isInMultiWindowMode()
: Menunjukkan apakah aktivitas berada dalam mode multi-aplikasi.isInPictureInPictureMode()
: Menunjukkan apakah aktivitas berada dalam mode picture-in-picture.onMultiWindowModeChanged()
: Sistem memanggil metode ini setiap kali masuk atau keluar dari mode multi-jendela. Sistem meneruskan metode nilai true (benar) jika aktivitas memasuki mode multi-aplikasi atau false jika aktivitas akan keluar dari mode multi-aplikasi.onPictureInPictureModeChanged()
: Sistem memanggil metode ini setiap kali aktivitas masuk atau keluar dari mode {i>picture-in-picture<i}. Sistem meneruskan metode adalah nilai true (benar) jika aktivitas memasuki mode picture-in-picture atau salah (false) jika aktivitas keluar dari mode picture-in-picture.
Class Fragment
menampilkan versi dari banyak 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 memilikinya
tidak mendukung mode picture-in-picture. Untuk informasi selengkapnya, lihat artikel Menambahkan video menggunakan
picture-in-picture (PiP).
Aktivitas baru dalam mode multi-aplikasi
Saat meluncurkan aktivitas baru, Anda bisa menunjukkan bahwa aktivitas baru tersebut harus
ditampilkan berdampingan dengan
{i>tool <i}yang ada jika memungkinkan. Menggunakan flag intent
FLAG_ACTIVITY_LAUNCH_ADJACENT
, yang memberi tahu sistem untuk mencoba membuat
aktivitas baru di jendela sebelah, sehingga kedua aktivitas tersebut berbagi layar. Tujuan
sistem akan berusaha sebaik mungkin untuk
melakukannya, tetapi hal ini tidak dijamin akan terjadi.
Jika perangkat dalam mode bentuk bebas dan Anda meluncurkan aktivitas baru, Anda dapat
menentukan dimensi aktivitas baru dan lokasi layar dengan memanggil
ActivityOptions.setLaunchBounds()
Metode ini tidak berpengaruh jika perangkat
tidak dalam mode multi-aplikasi.
Pada level API 30 dan yang lebih rendah, jika Anda meluncurkan aktivitas dalam tumpukan tugas, aktivitas tersebut akan menggantikan aktivitas pada layar, dengan mewarisi semua aktivitas properti baru. Jika Anda ingin meluncurkan aktivitas baru sebagai jendela terpisah di mode multi-aplikasi, Anda harus meluncurkannya dalam tumpukan tugas baru.
Android 12 (API level 31) memungkinkan aplikasi membagi jendela tugas aplikasi di antara beberapa aktivitas. Anda menentukan cara aplikasi menampilkan aktivitas—layar penuh, berdampingan, atau ditumpuk—dengan membuat XML file konfigurasi 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 menyeret
dan meletakkan data dalam satu aktivitas.) Untuk menambahkan dukungan dengan cepat untuk menerima
menghapus konten akan melihat DropHelper
API. Untuk tarik lalu lepas yang komprehensif
panduan, lihat Mengaktifkan tarik lalu lepas.
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 (level API 31) memungkinkan Anda meluncurkan dua instance aktivitas berdampingan di jendela tugas yang sama.
Jika Anda ingin mengizinkan pengguna untuk memulai instance lain aplikasi Anda dari
peluncur aplikasi atau taskbar, pastikan Aktivitas peluncur Anda
menyetel android:resizeableActivity="true"
dan tidak menggunakan mode peluncuran yang
mencegah beberapa instance. Misalnya, aktivitas singleInstancePerTask
dapat
dibuat instance-nya beberapa kali dalam tugas yang berbeda saat
FLAG_ACTIVITY_MULTIPLE_TASK
atau FLAG_ACTIVITY_NEW_DOCUMENT
telah ditetapkan.
Jangan membedakan multi-instance dengan tata letak multi-panel, seperti 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 posturnya 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 Anda menargetkan API level 24 atau yang lebih tinggi maupun tidak, Anda harus memverifikasi caranya berperilaku dalam mode multi-aplikasi jika pengguna mencoba meluncurkannya dalam multi-aplikasi di perangkat yang menjalankan Android 7.0 atau yang lebih tinggi.
Perangkat pengujian
Perangkat yang menjalankan Android 7.0 (API level 24) atau yang lebih tinggi yang mendukung mode multi-aplikasi.
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 Anda tidak mendeklarasikan orientasi tetap, Anda harus meluncurkan aplikasi pada perangkat yang menjalankan Android 7.0 atau yang lebih tinggi dan mencoba memasukkan aplikasi mode layar terpisah. Verifikasi bahwa pengalaman pengguna bisa diterima bila 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.
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 format bebas:
Luncurkan aplikasi layar penuh, lalu beralih ke mode multi-aplikasi dengan menekan lama tombol Recents (Terbaru). Pastikan bahwa aplikasi beralih dengan benar.
Meluncurkan aplikasi secara langsung dalam mode multi-aplikasi dan memverifikasi bahwa aplikasi diluncurkan dengan benar. Anda dapat meluncurkan aplikasi dalam mode multi-aplikasi dengan menekan tombol Terbaru, lalu tekan lama bilah judul aplikasi dan dan menyeretnya ke salah satu area yang disorot di layar.
Ubah ukuran aplikasi dalam mode layar terpisah dengan menarik pembagi layar. Verifikasi aplikasi dapat mengubah ukuran tanpa error dan elemen UI yang diperlukan terlihat.
Jika Anda telah menetapkan dimensi minimum untuk aplikasi, cobalah untuk mengubah ukuran aplikasi sehingga ukuran jendelanya lebih kecil dari dimensi tersebut. Verifikasi bahwa Anda tidak dapat mengubah ukuran aplikasi agar lebih kecil dari batas minimum yang ditentukan dimensi kustom.
Melalui semua pengujian, pastikan bahwa performa aplikasi dapat diterima. Sebagai pastikan bahwa tidak ada jeda yang terlalu lama untuk mengupdate UI aplikasi diubah ukurannya.
API level 31 atau yang lebih tinggi
Jika aplikasi Anda menargetkan API level 31 atau yang lebih tinggi dan lebar minimum aktivitas utama dan tinggi minimum kurang dari atau sama dengan dimensi masing-masing area tampilan yang tersedia, verifikasi semua perilaku yang tercantum untuk level API 24 sampai 30.
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.
Masuki dan tinggalkan mode multi-jendela.
Beralih dari aplikasi Anda ke aplikasi lain, dan memverifikasi apakah aplikasi berperilaku dengan benar saat terlihat tetapi tidak aktif. Misalnya, jika aplikasi Anda sedang memutar video, pastikan video terus diputar saat pengguna berinteraksi dengan aplikasi lain.
Dalam mode layar terpisah, coba gerakkan pembagi layar agar aplikasi menjadi keduanya lebih besar dan lebih kecil. Coba operasi ini secara berdampingan dan di atas untuk konfigurasi lainnya. Pastikan bahwa aplikasi tidak error, penting terlihat, dan operasi ubah ukuran tidak membutuhkan waktu terlalu lama.
Lakukan beberapa operasi ubah ukuran berturut-turut dalam waktu cepat. Memverifikasi bahwa aplikasi Anda tidak error atau membocorkan memori. Memory Profiler Android Studio menyediakan informasi tentang penggunaan memori aplikasi (lihat Memeriksa memori aplikasi penggunaan dengan Memory Profiler).
Gunakan aplikasi secara normal di sejumlah konfigurasi jendela yang berbeda, dan memverifikasi apakah aplikasi berperilaku dengan benar. Pastikan bahwa teks dapat dibaca dan Elemen UI tidak terlalu kecil untuk interaksi.
Dukungan multi-aplikasi dinonaktifkan
Di level API 24 hingga 30, jika Anda menonaktifkan dukungan multi-aplikasi dengan menyetel
android:resizeableActivity="false"
, Anda harus meluncurkan aplikasi di perangkat
menjalankan Android 7.0 hingga 11 dan mencoba
menempatkan aplikasi dalam layar terpisah dan
mode bentuk bebas. Pastikan bahwa saat Anda melakukannya, aplikasi tetap dalam layar penuh
mode.
Referensi lainnya
Untuk informasi selengkapnya tentang dukungan multi-aplikasi di Android, lihat:
- Contoh MultiWindowPlayground Android
Direkomendasikan untuk Anda * Catatan: teks link ditampilkan saat JavaScript nonaktif * Mode kompatibilitas perangkat * Mendukung kemampuan mengubah ukuran perangkat layar besar * Menangani perubahan konfigurasi