Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Dukungan Multi-Jendela

Android 7.0 menambahkan dukungan untuk menampilkan lebih dari satu aplikasi sekaligus. Pada perangkat genggam, dua aplikasi bisa berjalan berdampingan atau atas-bawah dalam mode layar terbagi. Pada perangkat TV, aplikasi bisa menggunakan mode gambar-dalam-gambar untuk melanjutkan pemutaran video selagi pengguna berinteraksi dengan aplikasi lain.

Bila aplikasi Anda menargetkan Android 7.0 (API level 24) atau yang lebih tinggi, Anda bisa mengonfigurasi cara aplikasi menangani tampilan multi-jendela. Misalnya, Anda bisa menetapkan dimensi minimum yang diizinkan aktivitas Anda. Anda juga bisa menonaktifkan tampilan multi-jendela untuk aplikasi, sehingga memastikan sistem hanya menampilkan aplikasi Anda dalam mode layar penuh.

Ringkasan

Android memungkinkan beberapa aplikasi berbagi layar sekaligus. Misalnya, pengguna bisa membagi layar, melihat halaman web di sisi kiri sambil menulis email di sisi kanan. Pengalaman pengguna bergantung pada versi Android OS dan jenis perangkat:

  • Perangkat genggam yang menjalankan Android 7.0 menawarkan mode layar terbagi. Di mode ini, sistem mengisi layar dengan dua aplikasi, menampilkannya secara berdampingan atau atas-bawah. Pengguna bisa menyeret garis pembagi yang memisahkan keduanya untuk membuat satu aplikasi lebih besar dan yang lainnya lebih kecil.
  • Dimulai dengan Android 8.0, aplikasi bisa menempatkan dirinya sendiri dalam mode gambar-dalam-gambar, sehingga aplikasi bisa terus menampilkan materi sementara pengguna menjelajahi atau berinteraksi dengan aplikasi lain.
  • Produsen perangkat berukuran lebih besar bisa memilih untuk mengaktifkan mode bentuk bebas, di mana pengguna bisa bebas mengubah ukuran setiap aktivitas. Jika produsen mengaktifkan fitur ini, perangkat akan menawarkan mode bentuk bebas selain mode layar terbagi.

Gambar 1. Dua aplikasi berjalan berdampingan dalam mode layar terbagi.

Pengguna bisa beralih ke mode multi-jendela dengan cara berikut:

  • Jika pengguna membuka layar Ringkasan dan menekan lama pada judul aktivitas, mereka bisa menyeret aktivitas itu ke bagian yang disorot pada layar untuk menempatkan aktivitas dalam mode multi-jendela.
  • Jika pengguna menekan lama pada tombol Ringkasan, perangkat akan menempatkan aktivitas saat ini dalam mode multi-jendela, dan membuka layar Ringkasan guna memungkinkan pengguna memilih aktivitas lain untuk berbagi layar.

Pengguna bisa seret dan lepas data dari aktivitas satu ke aktivitas lain sewaktu aktivitas berbagi layar.

Daur Hidup Multi-Jendela

Mode multi-jendela tidak mengubah daur hidup aktivitas.

Dalam mode multi-jendela, hanya aktivitas yang paling sering digunakan pengguna yang akan aktif pada waktu tertentu. Aktivitas ini dianggap teratas, dan merupakan satu-satunya aktivitas dalam status RESUMED. Seluruh aktivitas lain yang terlihat STARTED namun tidak RESUMED. Akan tetapi, sistem memberikan aktivitas, yang berhenti-sementara-namun-terlihat ini, prioritas lebih tinggi daripada aktivitas yang tidak terlihat. Jika pengguna berinteraksi dengan salah satu aktivitas yang terlihat, aktivitas tersebut akan dilanjutkan kembali, dan aktivitas teratas sebelumnya memasuki status STARTED.

Catatan: Dalam mode multi-jendela, aplikasi mungkin tidak dalam status RESUMED walaupun terlihat oleh pengguna. Suatu aplikasi mungkin perlu melanjutkan operasinya saat tidak menjadi yang teratas. Misalnya, aplikasi yang memutar video dalam status ini harus terus menampilkan videonya. Karena alasan ini, kami menyarankan aktivitas yang memutar video tidak menjeda playback video sebagai respons terhadap kejadian daur hidup ON_PAUSE. Sebagai gantinya, aktivitas harus memulai playback sebagai respons terhadap ON_START, dan menjeda playback sebagai respons terhadap ON_STOP. Jika Anda menangani kejadian daur hidup secara langsung dan tidak menggunakan paket Daur hidup, jeda playback video dalam pengendali onStop(), dan lanjutkan playback dalam onStart().

Bila pengguna menempatkan aplikasi ke mode multi-jendela, sistem akan memberi tahu aktivitas perubahan konfigurasi, seperti yang ditetapkan dalam Menangani Perubahan Konfigurasi. Hal ini juga terjadi ketika pengguna mengubah skala aplikasi, atau menempatkan kembali aplikasi ke mode layar penuh. Pada dasarnya, perubahan ini memiliki implikasi daur hidup aktivitas yang sama seperti saat sistem memberi tahu aplikasi bahwa perangkat telah beralih dari mode potret ke mode lanskap, kecuali dimensi perangkat telah berubah sebagai ganti bertukar posisi. Seperti yang dibahas di Menangani Perubahan Konfigurasi, aktivitas Anda bisa menangani perubahan konfigurasi itu sendiri, atau mengizinkan sistem memusnahkan 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 mengeluarkan perubahan waktu proses bila diperlukan. Jika aplikasi tertinggal dibandingkan gambar di area yang baru diekspos, sistem untuk sementara mengisi area tersebut dengan warna yang ditetapkan oleh atribut windowBackground atau dengan atribut gaya windowBackgroundFallback secara default.

Mengonfigurasi Aplikasi Anda untuk Mode Multi-Jendela

Jika aplikasi Anda menargetkan API level 24 atau yang lebih tinggi, Anda bisa mengonfigurasi bagaimana dan apakah aktivitas aplikasi Anda mendukung tampilan multi-jendela. Anda bisa menyetel atribut dalam manifes untuk mengontrol ukuran dan layoutnya. Setelan atribut aktivitas root berlaku pada semua aktivitas dalam tumpukan tugasnya. Misalnya, jika aktivitas root memiliki android:resizeableActivity yang disetel ke true, maka semua aktivitas dalam tumpukan tugas bisa diubah ukurannya.

Catatan: Jika Anda membuat aplikasi multi-orientasi yang menargetkan API level 23 atau yang lebih rendah, dan pengguna menggunakan aplikasi dalam mode multi-jendela, sistem akan mengubah ukuran aplikasi secara paksa. Sistem akan menampilkan kotak dialog yang memperingatkan pengguna bahwa aplikasi mungkin berperilaku tidak terduga. Sistem tidak mengubah ukuran aplikasi yang berorientasi tetap; jika pengguna berusaha membuka aplikasi berorientasi tetap saat mode multi-jendela, aplikasi akan menggunakan seluruh layar.

android:resizeableActivity

Setel atribut ini dalam manifes <activity> Anda atau elemen <application> untuk mengaktifkan atau menonaktifkan tampilan multi-jendela:

android:resizeableActivity=["true" | "false"]

Jika atribut ini disetel ke true, aktivitas bisa dijalankan di mode layar terbagi dan mode bentuk bebas. Jika atribut ini disetel ke false, aktivitas tidak akan mendukung mode multi-jendela. Jika nilai ini false, dan pengguna berusaha memulai aktivitas dalam mode multi-jendela, aktivitas akan menggunakan layar penuh.

Jika aplikasi Anda menargetkan API level 24 atau yang lebih tinggi, namun Anda tidak menetapkan nilai untuk atribut ini, nilai atribut akan kembali ke default true.

android:supportsPictureInPicture

Setel atribut ini dalam simpul <activity> manifes Anda untuk menunjukkan apakah aktivitas mendukung tampilan Gambar-dalam-Gambar. Atribut ini diabaikan jika android:resizeableActivity bernilai false.

android:supportsPictureInPicture=["true" | "false"]

Atribut layout

Dengan Android 7.0, elemen manifes <layout> mendukung beberapa atribut yang memengaruhi cara aktivitas berperilaku dalam mode multi-jendela:

android:defaultWidth
Lebar default aktivitas saat dijalankan dalam mode bentuk bebas.
android:defaultHeight
Tinggi default aktivitas saat dijalankan dalam mode bentuk bebas.
android:gravity
Penempatan awal dari aktivitas saat dibuka dalam mode bentuk bebas. Lihat referensi Gravity untuk mengetahui nilai yang cocok.
android:minHeight, android:minWidth
Tinggi dan lebar minimum untuk aktivitas dalam mode layar terbagi dan mode bentuk bebas. Jika pengguna memindahkan pembagi dalam mode layar terbagi untuk membuat aktivitas lebih kecil dari minimum yang ditetapkan, sistem akan memangkas aktivitas sesuai dengan ukuran yang diminta pengguna.

Misalnya, kode berikut menampilkan cara menetapkan ukuran dan lokasi default aktivitas, dan ukuran minimumnya, bila aktivitas ditampilkan dalam mode bentuk bebas:

<activity android:name=".MyActivity">
    <layout android:defaultHeight="500dp"
          android:defaultWidth="600dp"
          android:gravity="top|end"
          android:minHeight="450dp"
          android:minWidth="300dp" />
</activity>

Menjalankan Aplikasi Anda dalam Mode Multi-Jendela

Mulai dari Android 7.0, sistem menawarkan fungsionalitas untuk mendukung aplikasi yang bisa berjalan dalam mode multi-jendela.

Fitur yang dinonaktifkan dalam mode multi-jendela

Fitur tertentu akan dinonaktifkan atau diabaikan bila perangkat berada dalam mode multi-jendela, karena dianggap tidak logis bagi suatu aktivitas yang mungkin berbagi layar perangkat dengan aktivitas atau aplikasi lainnya. Fitur tersebut meliputi:

  • Beberapa opsi penyesuaian di System UI dinonaktifkan; misalnya, aplikasi tidak bisa menyembunyikan bilah status jika tidak berjalan dalam mode layar penuh.
  • Sistem akan mengabaikan perubahan pada atribut android:screenOrientation.

Pemberitahuan perubahan multi-jendela dan melakukan kueri

Activity menawarkan metode berikut untuk mendukung tampilan multi-jendela.

isInMultiWindowMode()
Panggil untuk mengetahui apakah aktivitas berada dalam mode multi-jendela.
isInPictureInPictureMode()
Panggil untuk mengetahui apakah aktivitas berada dalam mode gambar-dalam-gambar.

Catatan: Mode gambar-dalam-gambar adalah kasus khusus pada mode multi-jendela. Jika myActivity.isInPictureInPictureMode() mengembalikan true, maka myActivity.isInMultiWindowMode() juga mengembalikan true.

onMultiWindowModeChanged()
Sistem akan memanggil metode ini bila aktivitas masuk atau keluar dari mode multi-jendela. Sistem akan meneruskan ke metode sebuah nilai true jika aktivitas tersebut memasuki mode multi-jendela, dan nilai false jika aktivitas tersebut meninggalkan mode multi-jendela.
onPictureInPictureModeChanged()
Sistem akan memanggil metode ini bila aktivitas masuk atau keluar dari mode gambar-dalam-gambar. Sistem akan meneruskan ke metode sebuah nilai true jika aktivitas tersebut memasuki mode gambar-dalam-gambar, dan nilai false jika aktivitas tersebut meninggalkan mode gambar-dalam-gambar.

Class Fragment mengekspos versi dari banyak metode ini, misalnya Fragment.onMultiWindowModeChanged().

Memasuki mode gambar-dalam-gambar

Untuk menempatkan aktivitas dalam mode gambar-dalam-gambar, panggil Activity.enterPictureInPictureMode(). Metode ini tidak berpengaruh jika perangkat tidak mendukung mode gambar-dalam-gambar. Untuk informasi selengkapnya, lihat dokumentasi Gambar-dalam-Gambar.

Meluncurkan Aktivitas Baru dalam Mode Multi-Jendela

Bila meluncurkan aktivitas baru, Anda bisa memberi petunjuk pada sistem bahwa aktivitas baru harus ditampilkan bersebelahan dengan aktivitas yang sedang aktif, jika memungkinkan. Caranya, gunakan flag intent FLAG_ACTIVITY_LAUNCH_ADJACENT. Meneruskan flag ini akan meminta perilaku berikut:

  • Jika perangkat berada dalam mode layar terbagi, sistem akan berupaya membuat aktivitas baru di sebelah aktivitas yang meluncurkannya, sehingga kedua aktivitas tersebut berbagi layar. Tidak ada jaminan sistem mampu melakukannya, namun sistem akan membuat aktivitas bersebelahan jika memungkinkan.
  • Jika perangkat tidak berada dalam mode layar terbagi, flag ini tidak akan berpengaruh.

Jika perangkat dalam mode bentuk bebas dan Anda menjalankan aktivitas baru, Anda bisa menetapkan dimensi aktivitas baru dan lokasi layar dengan memanggil ActivityOptions.setLaunchBounds(). Metode ini tidak berpengaruh jika perangkat tidak berada dalam mode multi-jendela.

Catatan: Jika Anda meluncurkan aktivitas dalam tumpukan tugas, aktivitas tersebut akan menggantikan aktivitas pada layar, dengan mewarisi semua properti multi-jendelanya. Jika Anda ingin meluncurkan aktivitas baru sebagai jendela terpisah dalam mode multi-jendela, Anda harus meluncurkannya dalam tumpukan tugas baru.

Mendukung seret dan lepas

Pengguna bisa menyeret dan melepas data dari satu aktivitas ke aktivitas yang lain selagi kedua aktivitas berbagi layar. (Sebelum Android 7.0, pengguna hanya bisa menyeret dan melepas data dalam aktivitas tunggal.) Karena alasan ini, Anda mungkin perlu menambahkan fungsionalitas seret dan lepas ke aplikasi jika aplikasi saat ini belum mendukungnya.

DragAndDropPermissions
Objek token bertanggung jawab menetapkan izin yang diberikan kepada aplikasi yang menerima pelepasan tersebut.
View.startDragAndDrop()
Alias untuk View.startDrag(). Untuk mengaktifkan seret dan lepas lintas-aktivitas, teruskan flag DRAG_FLAG_GLOBAL. Jika Anda perlu memberikan izin URI ke aktivitas penerima, teruskan flag DRAG_FLAG_GLOBAL_URI_READ atau DRAG_FLAG_GLOBAL_URI_WRITE, sebagaimana mestinya.
View.cancelDragAndDrop()
Membatalkan operasi seret yang sedang berlangsung. Hanya bisa dipanggil oleh aplikasi yang menghasilkan operasi seret.
View.updateDragShadow()
Menggantikan bayangan penyeretan untuk operasi seret yang sedang berlangsung. Hanya bisa dipanggil oleh aplikasi yang menghasilkan operasi seret.
Activity.requestDragAndDropPermissions()
Meminta izin untuk URI materi yang diteruskan dengan ClipData yang terdapat dalam DragEvent.

Menguji Dukungan Multi-Jendela Aplikasi Anda

Apakah Anda menargetkan API level 24 atau yang lebih tinggi atau tidak, Anda harus verifikasi bagaimana perilakunya di mode multi-jendela saat pengguna mencoba untuk menjalankannya dalam mode multi-jendela pada perangkat yang menjalankan Android 7.0 atau yang lebih tinggi.

Mengonfigurasi Perangkat Pengujian

Jika perangkat menjalankan Android 7.0 atau yang lebih tinggi, perangkat tersebut secara otomatis mendukung mode layar terbagi.

Jika aplikasi Anda menargetkan API level 23 atau yang lebih rendah

Jika aplikasi Anda menargetkan API level 23 atau yang lebih rendah dan pengguna berupaya menggunakan aplikasi dalam mode multi-jendela, sistem secara paksa akan mengubah ukuran aplikasi kecuali jika aplikasi mendeklarasikan orientasi tetap.

Jika aplikasi Anda tidak mendeklarasikan orientasi tetap, Anda harus menjalankan aplikasi pada perangkat yang menjalankan Android 7.0 atau yang lebih tinggi dan berupaya menempatkan aplikasi tersebut dalam mode layar terbagi. Verifikasi pengalaman pengguna bisa diterima bila aplikasi secara paksa diubah ukurannya.

Jika aplikasi mendeklarasikan orientasi tetap, Anda harus berupaya menempatkan aplikasi dalam mode multi-jendela. Verifikasi apakah saat Anda melakukannya, aplikasi tetap berada dalam mode layar penuh.

Jika Anda mendukung mode multi-jendela

Jika aplikasi Anda menargetkan API level 24 atau yang lebih tinggi dan tidak menonaktifkan dukungan multi-jendela, verifikasi perilaku di bawah mode layar terbagi dan mode bentuk bebas.

  • Jalankan aplikasi dalam mode layar penuh, kemudian beralih ke mode multi-jendela dengan menekan lama pada tombol Ringkasan. Verifikasi apakah aplikasi beralih dengan benar.
  • Jalankan aplikasi secara langsung dalam mode multi-jendela, dan verifikasi apakah aplikasi dijalankan dengan benar. Anda bisa meluncurkan aplikasi dalam mode multi-jendela dengan menekan tombol Ringkasan, kemudian menekan lama baris judul pada aplikasi Anda dan menyeretnya ke salah satu area yang disorot di layar.
  • Ubah ukuran aplikasi Anda dalam mode layar terbagi dengan menyeret garis pembagi. Verifikasi apakah aplikasi mengubah ukuran tanpa mogok, dan apakah elemen UI yang diperlukan terlihat.
  • Jika Anda telah menetapkan dimensi minimum aplikasi, cobalah untuk mengubah ukuran aplikasi di bawah dimensi tersebut. Verifikasi apakah Anda tidak bisa mengubah ukuran aplikasi menjadi lebih kecil dari minimum yang ditetapkan.
  • Melalui semua pengujian, verifikasi apakah kinerja aplikasi Anda bisa diterima. Misalnya, verifikasi apakah tidak ada jeda yang terlalu lama untuk mengupdate UI setelah aplikasi diubah ukurannya.

Daftar periksa pengujian

Untuk verifikasi kinerja aplikasi Anda dalam mode multi-jendela, cobalah operasi berikut. Anda harus mencoba semua operasi ini dalam mode layar terbagi dan mode multi-jendela, kecuali jika dinyatakan berbeda.

  • Masuki dan tinggalkan mode multi-jendela.
  • Beralih dari aplikasi Anda ke aplikasi lain, dan verifikasi apakah aplikasi berperilaku sebagaimana mestinya saat terlihat namun tidak aktif. Misalnya, jika aplikasi Anda sedang memutar video, verifikasi apakah video terus diputar selagi pengguna berinteraksi dengan aplikasi lain.
  • Dalam mode layar terbagi, cobalah menggeser garis pembagi untuk membuat aplikasi Anda menjadi lebih besar dan lebih kecil. Coba operasi ini dalam konfigurasi berdampingan dan atas-bawah. Verifikasi apakah aplikasi tidak mogok, fungsionalitas penting bisa terlihat, dan operasi mengubah ukuran tidak memakan waktu terlalu lama.
  • Lakukan beberapa operasi ubah ukuran berturut-turut dalam waktu cepat. Verifikasi apakah aplikasi Anda tidak mogok atau mengalami kebocoran memori. Untuk informasi tentang memeriksa penggunaan memori aplikasi Anda, gunakan Memori Profiler Android Studio.
  • Gunakan aplikasi secara normal di sejumlah konfigurasi jendela yang berbeda, dan verifikasi apakah aplikasi berperilaku sebagaimana mestinya. Verifikasi apakah teks terbaca, dan apakah elemen UI tidak terlalu kecil untuk interaksi.

Jika Anda telah menonaktifkan dukungan multi-jendela

Jika Anda menonaktifkan dukungan multi-jendela dengan menyetel android:resizeableActivity="false", Anda harus menjalankan aplikasi pada perangkat yang menjalankan Android 7.0 atau yang lebih tinggi dan berusaha menempatkan aplikasi dalam mode bentuk bebas dan mode layar terbagi. Verifikasi apakah saat Anda melakukannya, aplikasi tetap berada dalam mode layar penuh.

Untuk informasi selengkapnya tentang dukungan multi-jendela di Android, lihat aplikasi contoh Lima Tips untuk Mempersiapkan Multi-Jendela di Android N dan Playground Multi-Jendela.