Kami memberikan ikhtisar tentang arti dukungan multi-jendela yang akan datang di Android N bagi pengembang, dan cara memanfaatkannya sebaik mungkin!
Dukungan multi-jendela adalah fitur menarik yang kami tunggu di Android N, dan yang sudah lama kami ingin tersedia di semua perangkat. Namun, agar pengalaman ini menyenangkan, pengembang mungkin harus membuat beberapa perubahan pada aplikasi mereka untuk mendukungnya dengan benar.
Salah satu sesi Google I/O adalah bagi para pengembang untuk mempelajari tentang API baru dan perubahan perilaku sistem yang dihasilkan oleh dukungan multi-jendela.
Sesi ini dibawakan oleh Wale Ogunwale, Technical Lead Manager untuk Android ActivityManager dan Komponen kerangka WindowManager -- dia dan timnya adalah orang-orang yang bertanggung jawab atas multi-jendela di Android.
Anda dapat menontonnya Sesi mode Multi-Jendela di YouTube, namun kami juga memberikan ikhtisar sesi ini di sini.
- Mode layar terpisah: ini adalah mode yang tersedia secara default. Sesuai dengan namanya, ini memungkinkan Anda membuka dua aplikasi secara berdampingan.
- Mode bentuk bebas: produsen dapat mengaktifkan ini pada perangkat yang lebih besar, yang memungkinkan pengguna dengan bebas mengubah ukuran aktivitas selain mode layar terpisah.
- Mode gambar-dalam-gambar: ditujukan untuk perangkat Android TV, mode ini ditujukan agar pemutar video dapat berjalan di jendela yang disematkan saat pengguna berinteraksi dengan aplikasi lain.
![Mode Layar Terpisah Android N](/f/214e3171c9a12c3c757d89c9aace3194.png)
![Modus Android N PiP](/f/4934cd8a88d7a4d0cb88c5ecaf423e35.png)
![](/f/a506d69b6b3aaf252a0abcf885341b18.png)
android: resizeableActivity
atribut aktivitas dalam manifes Anda. false
. Ini hanya boleh dilakukan jika benar-benar dibenarkan, karena hal ini selalu membuat aplikasi Anda menonjol diluncurkan dalam mode layar penuh meskipun pengguna (atau aplikasi lain) mencoba meluncurkannya dalam multi-jendela mode. Penting untuk diperhatikan bahwa atribut aktivitas root berlaku untuk semua aktivitas dalam tumpukan tugasnya. Dengan kata lain, jika Anda memiliki aktivitas yang dapat dimulai oleh aplikasi lain, pastikan aktivitas tersebut mendukung mode multi-jendela karena Anda tidak dapat menjamin aplikasi lain akan meluncurkan aktivitas Anda dalam tugas baru menggunakan. Intent#FLAG_ACTIVITY_NEW_TASK
Dukungan mode .Picture-in-picture harus dideklarasikan secara eksplisit melalui. android: supportsPictureInPicture
atribut. Perhatikan bahwa atribut ini diabaikan jika. android: resizeableActivity
adalah. false
Atribut .Layout dapat digunakan untuk mengatur dimensi dan penempatan default untuk jendela bentuk bebas, atau untuk menentukan lebar atau tinggi minimal untuk mode bentuk bebas dan layar terpisah: -
android: defaultWidth
/android: defaultHeight
: dimensi default aktivitas (mode bentuk bebas). -
android: gravity
: posisi awal aktivitas (mode bentuk bebas). -
android: minimalWidth
/android: minimalHeight
: dimensi minimal aktivitas (mode bentuk bebas dan layar terpisah)
Memahami siklus hidup Aktivitas
Itu. siklus hidup aktivitas tidak berubah dalam mode multi-jendela:![Siklus Hidup Dasar Aktivitas Android](/f/27b01a66b2b309ec8192d8f1a016416a.png)
Activity#onResume()
Dan. Activity#onPause()
dipanggil saat aplikasi Anda memperoleh atau kehilangan fokus, namun belum tentu saat aplikasi mulai atau berhenti terlihat. (Ingat bahwa hanya satu aplikasi yang mungkin memiliki fokus pada waktu tertentu.) Untuk aplikasi yang memperbarui konten secara terus-menerus (misalnya pemutaran video), pastikan untuk menangani memulai dan menghentikan pembaruan konten. Activity#onStart()
Dan. Activity#onStop()
alih-alih. Tidak melakukannya untuk aplikasi video, misalnya, berarti pemutaran hanya akan terjadi jika aplikasi terfokus, yang menggagalkan tujuan mode multi-jendela. Aplikasi resmi YouTube mengalami masalah serupa saat Pratinjau Pengembang Android N pertama kali diluncurkan. Menangani Perubahan Waktu Proses
Saat aplikasi dialihkan ke mode multi-jendela, beberapa konfigurasi perangkat akan berubah. Anda dapat mengizinkan aktivitas Anda dimulai ulang (dalam hal ini. mempertahankan Fragmen mungkin merupakan ide bagus, jika aktivitas Anda harus melakukan operasi intensif saat permulaan), atau pilihlah. menangani perubahan konfigurasi secara eksplisit alih-alih. Empat konfigurasi perangkat dapat berubah saat memasuki atau di dalam mode multi-jendela:screenSize
, smallestScreenSize
, screenLayout
Dan. orientation
. Mengacu kepada. Dokumentasi Pengembang Android untuk info lebih lanjut tentang setiap atribut, tetapi perhatikan itu. orientation
tidak lagi mengacu pada orientasi perangkat dalam kasus ini. Sebaliknya, ini hanya menunjukkan apakah lebar aktivitas Anda lebih besar dari tingginya (lanskap) atau bukan (potret). Menyatakan bahwa aktivitas Anda akan menangani perubahan ini dapat dilakukan dari manifes: android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
Ingatlah bahwa ini berarti Anda benar-benar harus menangani perubahan ini. Activity#onConfigurationChanged()
, dengan memperbarui tampilan secara manual atau memuat ulang beberapa sumber daya. Fitur yang Dinonaktifkan dalam Mode Multi-Jendela
Beberapa fitur sistem tidak akan terpengaruh oleh aktivitas Anda saat berada dalam mode multi-jendela:- Perubahan bilah status dan bilah navigasi, seperti meredupkan/menyembunyikan bilah sistem atau menggunakan mode imersif, tidak akan berpengaruh. Ini masuk akal karena aktivitas Anda hanya menempati sebagian layar.
- Itu
android: screenOrientation
Atribut aktivitas juga tidak berpengaruh dalam mode multi-jendela: karena aktivitas Anda dapat diubah ukurannya, maka tidak masuk akal lagi jika aktivitas tersebut memiliki orientasi tetap.
-
Activity#onMultiWindowModeChanged(boolean inMultiWindow)
: dipanggil ketika status aktivitas berubah dari layar penuh ke multi-jendela dan sebaliknya. -
Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture)
: dipanggil ketika status aktivitas berubah ke/dari mode PIP. -
Activity#isInMultiWindowMode()
/Activity#isInPictureInPictureMode()
: mengembalikan apakah aktivitas berada dalam mode multi-jendela/gambar-dalam-gambar atau tidak. -
Activity#overlayWithDecorCaption(boolean overlay)
: untuk jendela bentuk bebas, metode ini dapat digunakan untuk membuat keterangan (bilah yang digunakan untuk menyeret jendela) melapisi konten alih-alih menekannya ke bawah.
Activity#overlayWithDecorCaption()
, metode ini juga disediakan oleh. Fragment
kelas. Memulai Aktivitas dalam Mode Multi-Jendela
-
Activity#enterPictureInPictureMode()
dapat digunakan untuk menempatkan aktivitas dalam mode gambar-dalam-gambar. Perhatikan bahwa aktivitas dalam mode PiP tidak mendapat pemberitahuan tentang peristiwa input -- gunakanMediaSession#setMediaButtonReceiver()
jika Anda ingin menangani kejadian seperti itu. Pastikan juga untuk memeriksa situs web Pengembang Android jika Anda tertarik Gambar-dalam-gambar di Android N.
- Jika perangkat berada dalam mode layar terpisah, Anda dapat memberi tahu sistem untuk meluncurkan aktivitas lain di samping aktivitas Anda dengan menggunakan
Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT
bendera. Bendera tidak berpengaruh jika tidak dalam mode layar terpisah. - Jika perangkat berada dalam mode bentuk bebas,
ActivityOptions#setLaunchBounds()
dapat digunakan untuk menentukan dimensi dan lokasi aktivitas baru di layar.
Seret dan Jatuhkan
Meskipun dukungan drag and drop telah ada sejak Honeycomb, sebelumnya hal ini hanya mungkin dilakukan dalam aktivitas yang sama. Bersalju. didukung dalam multi-jendela demikian juga. Tampaknya menerapkan hal ini. sebagian besar sama seperti sebelumnya, dengan beberapa tambahan untuk drag and drop lintas aktivitas:View#startDragAndDrop()
- Alias baru untuk
View#startDrag()
. - Untuk mengaktifkan tarik dan lepas lintas aktivitas, teruskan tanda baru
View#DRAG_FLAG_GLOBAL
. - Jika Anda perlu memberikan izin URI ke aktivitas penerima, teruskan tanda baru
View#DRAG_FLAG_GLOBAL_URI_READ
atauView#DRAG_FLAG_GLOBAL_URI_WRITE
, sewajarnya.
- Alias baru untuk
View#updateDragShadow()
- Menggantikan bayangan drag untuk operasi drag yang sedang berlangsung. Hanya dapat dipanggil oleh aplikasi yang memulai operasi drag.
View#cancelDragAndDrop()
- Membatalkan operasi drag yang sedang berlangsung. Hanya dapat dipanggil oleh aplikasi yang memulai operasi drag.
- Memeriksa apakah perangkat mendukung mode bentuk bebas atau gambar-dalam-gambar dapat dilakukan melalui
PackageManager#hasSystemFeature()
, menggunakanPackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT
DanPackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE
masing-masing.
- Itu
android: windowBackground
atribut dapat digunakan sebagai sumber daya dapat digambar di latar belakang, jika aktivitas diubah ukurannya dan renderingnya lambat. Jikaandroid: windowBackground
tidak disetel,android: windowBackgroundFallback
digunakan sebagai gantinya. Lihat contoh aplikasi Multi-Window Playground untuk contohnya.
- Mode penanganan berubah secara elegan:
- Pertahankan konsistensi UI apa pun orientasinya. Tidak ada elemen yang mengubah posisi untuk memungkinkan transisi yang mulus.
- Memperluas hal di atas, jangan beralih di antara tata letak yang sangat berbeda untuk tata letak ponsel/tablet. Sebaliknya, sesuaikan tata letak tablet untuk ukuran yang lebih kecil agar konsisten.
- Pastikan aktivitas Anda beradaptasi dengan ukuran kecil oleh mengikuti pola Desain Material.
- Menggunakan
FLAG_ACTIVITY_LAUNCH_ADJACENT
ketika masuk akal untuk membuat pengalaman lebih menyenangkan dalam mode layar terpisah. - Hanya nyatakan ketidakcocokan pengubahan ukuran jika dibenarkan. Seperti yang telah kita bahas di atas, hal itu membuat aplikasi Anda menonjol dengan cara yang buruk.
- Dokumentasi Multi-Jendela.
- Pedoman Desain Material untuk mode layar terpisah.
- Contoh aplikasi multi-jendela.