Multi-Jendela di Android N: Apa yang Perlu Diketahui Pengembang untuk Memaksimalkannya

click fraud protection

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.

N memperkenalkan tiga mode multi-jendela yang berbeda:
  • 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 NModus Android N PiP
Perlu diperhatikan hal itu. kami telah membahas multi-jendela di N sebelumnya dan memberikan beberapa kritik terhadap sistem saat ini. Oleh karena itu, kami berharap mode bentuk bebas akan sedikit lebih mirip dengan mode gambar-dalam-gambar, karena mode ini akan memiliki aplikasi yang berguna di semua perangkat.
Mengaktifkan dukungan multi-jendela di aplikasi Anda sangatlah mudah: Anda tidak perlu melakukan apa pun jika Anda sudah menargetkan N. Jika Anda memilih untuk menonaktifkan multi-jendela, Anda dapat melakukannya dengan mengatur. 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)
Anda dapat menemukan contoh kode di. Contoh aplikasi Multi-Window Playground Google di GitHub: AndroidManifest.xml.
Dengan diperkenalkannya dukungan multi-jendela, Anda mungkin perlu memeriksa ulang beberapa hal di aplikasi Anda untuk memastikan aplikasi tersebut beroperasi dengan benar.

Memahami siklus hidup Aktivitas

Itu. siklus hidup aktivitas tidak berubah dalam mode multi-jendela: Siklus Hidup Dasar Aktivitas Android Meskipun demikian, beberapa perbedaan halus antara status aktivitas dapat mengakibatkan perilaku tidak diinginkan yang biasanya tidak Anda sadari sebelum N. Penting untuk mengetahui hal itu. 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.
Callback baru telah ditambahkan untuk acara multi-jendela, serta metode untuk menanyakan status saat ini.
  • 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.
PS. Kecuali untuk. 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 -- gunakan MediaSession#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.
Untuk contoh kode, lihat aplikasi contoh Multi-Window Playground: contoh aktivitas yang berdekatan, contoh batas peluncuran.

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 atau View#DRAG_FLAG_GLOBAL_URI_WRITE, sewajarnya.
  • 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(), menggunakan PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT Dan PackageManager#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. Jika android: windowBackground tidak disetel, android: windowBackgroundFallback digunakan sebagai gantinya. Lihat contoh aplikasi Multi-Window Playground untuk contohnya.
Wale menawarkan beberapa praktik terbaik untuk memastikan pengguna Anda mendapatkan pengalaman terbaik:
  • 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.
Wale mengakhiri sesi dengan menawarkan beberapa sumber tambahan yang berguna:
  • Dokumentasi Multi-Jendela.
  • Pedoman Desain Material untuk mode layar terpisah.
  • Contoh aplikasi multi-jendela.