Mendukung mode multi-aplikasi

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 terpisah yang dapat dipindahkan, jendela yang dapat diubah ukurannya (mode jendela desktop).

Gambar 1. Menampilkan dua aplikasi secara berdampingan dalam mode layar terpisah.

Untuk petunjuk pengguna tentang cara mengakses mode layar terpisah di ponsel, buka Melihat dua aplikasi sekaligus di ponsel Pixel.

Fitur multi-aplikasi khusus versi

Pengalaman pengguna multi-aplikasi bergantung pada versi Android dan jenis perangkat:

  • Android 7.0 (API level 24) memperkenalkan mode layar terpisah di perangkat layar kecil dan mode picture-in-picture di perangkat tertentu.

    • Mode layar terpisah mengisi layar dengan dua aplikasi, menampilkannya secara berdampingan atau satu di atas yang lain. Pengguna dapat menarik pembagi yang memisahkan kedua aplikasi untuk membuat tampilan satu aplikasi menjadi 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 windowing desktop, yang memungkinkan pengguna 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 menetapkan resizeabableActivity="false" untuk memastikan sistem selalu menampilkan layar penuh aplikasi.

  • Android 8.0 (API level 26) memperluas mode picture-in-picture ke perangkat layar kecil.

  • Android 12 (API level 31) membuat perilaku standar mode multi-aplikasi.

    • Di perangkat layar besar (class ukuran jendela medium atau diperluas), 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.

    • Di layar kecil (class ukuran jendela kompak), sistem akan memeriksa minWidth dan minHeight aktivitas untuk menentukan apakah aktivitas dapat berjalan dalam mode multi-aplikasi. Jika resizeableActivity="false", aplikasi tidak dapat berjalan dalam mode multi-aplikasi, terlepas dari lebar dan tinggi minimum.

Mode layar terpisah

Pengguna mengaktifkan mode layar terpisah dengan melakukan hal berikut:

  1. Buka layar Terbaru
  2. Geser aplikasi ke tampilan
  3. Tekan ikon aplikasi pada baris judul aplikasi
  4. Pilih opsi menu layar terpisah
  5. Pilih aplikasi lain dari layar Terbaru, atau tutup layar Terbaru dan jalankan aplikasi lain

Pengguna keluar dari mode layar terpisah dengan menarik pembagi jendela ke tepi layar—atas atau bawah, kiri atau kanan.

Meluncurkan di samping

Jika aplikasi Anda perlu mengakses konten melalui intent, Anda dapat menggunakan FLAG_ACTIVITY_LAUNCH_ADJACENT untuk membuka konten di jendela layar terpisah yang berdekatan.

FLAG_ACTIVITY_LAUNCH_ADJACENT diperkenalkan di Android 7.0 (API level 24) untuk memungkinkan aplikasi yang berjalan dalam mode layar terpisah meluncurkan aktivitas di jendela yang berdekatan.

Android 12L (API level 32) dan yang lebih tinggi telah memperluas definisi tanda untuk memungkinkan aplikasi yang berjalan dalam layar penuh mengaktifkan mode layar terpisah, lalu meluncurkan aktivitas di jendela yang berdekatan.

Untuk meluncurkan aktivitas yang berdekatan, gunakan FLAG_ACTIVITY_LAUNCH_ADJACENT 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 bervariasi pada berbagai versi Android.

Multi-resume

Android 10 (API level 29) dan versi yang lebih tinggi mendukung multi-resume—semua aktivitas tetap dalam status RESUMED saat perangkat dalam mode multi-aplikasi. Aktivitas dapat dijeda jika aktivitas transparan berada di atas aktivitas atau aktivitas tidak dapat difokuskan, misalnya, aktivitas berada dalam mode picture-in-picture. Mungkin juga 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 (API level 28). Untuk memilih untuk multi-resume di perangkat Android 9, 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 adalah STARTED, tetapi bukan RESUMED. Namun, sistem memberikan aktivitas yang terlihat namun tidak dilanjutkan ini dengan prioritas lebih tinggi daripada aktivitas yang tidak terlihat. Jika pengguna berinteraksi dengan salah satu aktivitas yang terlihat, aktivitas tersebut akan dilanjutkan, dan aktivitas teratas sebelumnya 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

Jika pengguna mengalihkan aplikasi ke mode multi-aplikasi, sistem akan memberi tahu aktivitas tentang perubahan konfigurasi seperti yang ditentukan dalam Menangani perubahan konfigurasi. 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 saat sistem memberi tahu aplikasi bahwa perangkat telah beralih dari orientasi potret ke lanskap, kecuali bahwa dimensi aplikasi telah diubah, bukan hanya ditukar. Aktivitas Anda dapat menangani perubahan konfigurasi itu sendiri, atau aplikasi Anda 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 oleh atribut gaya windowBackgroundFallback default.

Akses resource eksklusif

Untuk membantu mendukung fitur multi-resume, gunakan callback siklus proses onTopResumedActivityChanged().

Callback dipanggil saat aktivitas memperoleh atau kehilangan posisi aktivitas teratas yang dilanjutkan, yang penting saat aktivitas menggunakan resource 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 kamera eksklusif, 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 yang dilanjutkan paling atas yang baru difokuskan. Aplikasi Anda dapat terus menjalankan kamera jika bukan aplikasi yang dilanjutkan paling atas, tetapi harus menangani kasus pemutusan koneksi 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 callback CameraDevice.StateCallback#onDisconnected(), 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 entity yang meluncurkan aktivitas. Lihat class 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.

Sebaiknya Anda juga 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 aplikasi Anda. 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();

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 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, 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 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.

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.

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 menetapkan 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 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.

Gambar 6. Peluncur Desain Material di ponsel.
Gambar 7. Peluncur Desain Material pada tampilan sekunder.

Metrik jendela aplikasi

Android 11 (level API 30) memperkenalkan metode WindowManager berikut untuk menyediakan batas aplikasi yang berjalan dalam mode multi-aplikasi:

Metode library Jetpack WindowManager computeCurrentWindowMetrics() dan computeMaximumWindowMetrics() masing-masing menawarkan fungsionalitas yang serupa, tetapi dengan kompatibilitas mundur ke API level 14.

Untuk mendapatkan metrik untuk tampilan 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 untuk mendukung metode WindowManager baru.

Android 12 (API level 31) tidak lagi menggunakan metode Display getRealSize() dan getRealMetrics() serta mengubah 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 mode multi-aplikasi. Anda dapat menetapkan 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 dapat berjalan di jendela yang dapat diubah ukurannya meskipun Anda menentukan android:resizeableActivity="false". Jika hal 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. Pada perangkat layar besar (class ukuran jendela sedang atau diperluas), semua aplikasi berjalan dalam mode multi-aplikasi, terlepas dari konfigurasi aplikasi. Pada layar kecil, sistem memeriksa setelan minWidth, minHeight, dan resizeableActivity aktivitas 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 mode 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 mode jendela desktop. Jika atribut 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 mengambilalih layar penuh.

Jika aplikasi Anda 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 (class ukuran jendela sedang atau diluaskan): Semua aplikasi mendukung mode multi-aplikasi. Atribut ini menunjukkan apakah suatu aktivitas dapat diubah ukurannya. Jika resizeableActivity="false", aplikasi akan dimasukkan ke mode kompatibilitas saat diperlukan agar sesuai dengan dimensi tampilan.
  • Layar kecil (class ukuran jendela kompak): Jika resizeableActivity="true" serta lebar minimum dan tinggi minimum aktivitas berada dalam persyaratan multi-aplikasi, aktivitas akan mendukung mode multi-aplikasi. Jika resizeableActivity="false", aktivitas tidak mendukung mode multi-aplikasi, terlepas dari lebar dan tinggi 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"] />

configChanges

Untuk menangani sendiri perubahan konfigurasi multi-aplikasi, seperti saat pengguna mengubah ukuran jendela, tambahkan atribut android:configChanges ke node <activity> manifes aplikasi Anda 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 aktivitas berperilaku dalam mode multi-aplikasi:

  • android:defaultHeight, android:defaultWidth: Tinggi dan lebar default aktivitas saat diluncurkan dalam mode jendela desktop.

  • android:gravity: Penempatan awal aktivitas saat diluncurkan dalam mode jendela desktop. Lihat class Gravity untuk mengetahui nilai yang sesuai.

  • android:minHeight, android:minWidth: Tinggi dan lebar minimum untuk aktivitas dalam mode layar terpisah dan mode jendela desktop. Jika pengguna memindahkan pembagi dalam mode layar terpisah untuk membuat aktivitas lebih kecil dari batas minimum yang ditentukan, 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 jendela desktop:

<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 mode multi-aplikasi:

  • isInMultiWindowMode(): Menunjukkan apakah aktivitas dalam mode multi-aplikasi.

  • isInPictureInPictureMode(): Menunjukkan apakah aktivitas berada dalam mode picture-in-picture.

  • onMultiWindowModeChanged(): Sistem 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, atau nilai false jika aktivitas keluar dari mode multi-aplikasi.

  • onPictureInPictureModeChanged(): Sistem memanggil metode ini setiap kali aktivitas masuk atau keluar dari mode picture-in-picture. Sistem akan meneruskan nilai true (benar) ke metode ini jika aktivitas memasuki mode picture-in-picture atau salah jika aktivitas keluar dari mode picture-in-picture.

Class Fragment menampilkan versi dari berbagai metode ini; misalnya, Fragment.onMultiWindowModeChanged().

Mode picture-in-picture

Untuk mengalihkan aktivitas ke mode picture-in-picture, panggil enterPictureInPictureMode() Metode ini tidak akan berpengaruh jika perangkat tidak mendukung mode picture-in-picture. Untuk mengetahui informasi selengkapnya, lihat Menambahkan video menggunakan picture-in-picture (PiP).

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 akan melakukan upaya terbaik untuk melakukannya, tetapi keberhasilannya tidak dijamin.

Jika perangkat dalam mode jendela desktop dan Anda meluncurkan aktivitas baru, Anda dapat menentukan dimensi dan lokasi layar aktivitas baru dengan memanggil ActivityOptions.setLaunchBounds(). Metode ini tidak berpengaruh jika perangkat tidak 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, lihat DropHelper API. Untuk panduan tarik lalu lepas yang komprehensif, 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 (API level 31) memungkinkan Anda meluncurkan dua instance aktivitas berdampingan di jendela tugas yang sama.

Jika Anda ingin mengizinkan pengguna memulai instance lain aplikasi dari peluncur aplikasi atau taskbar, pastikan Aktivitas peluncur 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 ditetapkan.

Multi-instance bukan tata letak multi-panel, misalnya presentasi daftar-detail yang menggunakan SlidingPaneLayout dan 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 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.

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 tidak mendeklarasikan orientasi tetap, Anda harus meluncurkan aplikasi di perangkat yang menjalankan Android 7.0 atau yang lebih tinggi dan mencoba mengalihkan aplikasi 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.

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 jendela layar terpisah dan desktop:

  • 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 panel judul aplikasi dan menariknya ke salah satu area yang disorot di layar.

  • Ubah ukuran aplikasi dalam mode layar terpisah dengan menarik pembagi layar. Verifikasi apakah aplikasi mengubah ukuran tanpa error dan apakah elemen UI yang diperlukan terlihat.

  • Jika Anda telah menetapkan dimensi minimum untuk aplikasi, coba ubah ukuran aplikasi sehingga ukuran jendelanya lebih kecil dari dimensi tersebut. Verifikasi 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.

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.

Checklist pengujian

Untuk memastikan performa aplikasi dalam mode multi-aplikasi, coba operasi berikut. Anda harus mencoba operasi ini dalam mode layar terpisah dan mode jendela desktop, kecuali jika dinyatakan lain.

  • Masuki dan tinggalkan mode multi-jendela.

  • Beralih dari aplikasi Anda ke aplikasi lain, dan verifikasi apakah aplikasi berperilaku seperti mestinya saat terlihat tetapi tidak aktif. Misalnya, jika aplikasi Anda 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 aplikasi Anda 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 yang berbeda, dan verifikasi apakah aplikasi berperilaku sebagaimana mestinya. Pastikan bahwa teks terbaca dan elemen UI tidak terlalu kecil untuk interaksi.

Dukungan multi-aplikasi dinonaktifkan

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 dalam mode layar terpisah dan mode jendela desktop. Pastikan bahwa saat Anda melakukannya, aplikasi tetap berada dalam mode layar penuh.

Referensi lainnya

Untuk informasi selengkapnya tentang dukungan multi-aplikasi di Android, lihat:

Direkomendasikan untuk Anda * Catatan: teks link ditampilkan saat JavaScript nonaktif * Mode kompatibilitas perangkat * Mendukung kemampuan mengubah ukuran layar besar * Menangani perubahan konfigurasi