Mode multi-jendela bentuk bebas adalah fitur yang kurang dimanfaatkan dan kurang dihargai di Android Nougat. Kami menjelaskan apa itu dan bagaimana pengembang dapat menerapkannya.
Ketika Android 7.0 Nougat pertama kali diumumkan pada awal tahun 2016, ia membawa fitur yang banyak diminta ke platform Android — dukungan multi-jendela. Kebanyakan orang mengetahui dukungan multi-jendela layar terpisah yang diaktifkan secara default di semua ponsel dan tablet Android Nougat. Perangkat Android TV dengan Android Nougat hadir dengan dukungan dukungan multi-jendela gambar-dalam-gambar.
Namun, ada mode multi-jendela ketiga yang ada di Android Nougat yang tidak banyak orang sadari: mode jendela bentuk bebas. Mode ini memungkinkan Android menampilkan aplikasi sebagai jendela mengambang yang dapat dipindahkan dan diubah ukurannya sesuai keinginan pengguna. Ini pada dasarnya adalah implementasi Android dari a menumpuk manajer jendela.
Dalam Dokumentasi Android SDK, dinyatakan bahwa:
Produsen perangkat yang lebih besar dapat memilih untuk mengaktifkan mode bentuk bebas, di mana pengguna dapat dengan bebas mengubah ukuran setiap aktivitas. Jika pabrikan mengaktifkan fitur ini, perangkat menawarkan mode bentuk bebas selain mode layar terpisah.
Dan juga, di Android 7.0 CDD:
Implementasi perangkat dengan ukuran layar xlarge HARUS mendukung mode bentuk bebas.
Hal ini menunjukkan bahwa setiap perangkat Android layar besar baru yang dikirimkan dengan Android 7.0 berpotensi memiliki mode jendela bentuk bebas yang diaktifkan oleh pabrikan.
Namun, ini bukanlah persyaratan yang sulit. Hal ini dimungkinkan untuk memaksa setiap Perangkat Android Nougat (dengan opsi pengembang diaktifkan) untuk mendukung mode jendela bentuk bebas menggunakan salah satu dari dua metode berbeda:
Mengaktifkan mode jendela bentuk bebas di perangkat Android Nougat apa pun
Metode 1 (diperlukan komputer dengan adb)
Pastikan USB Debugging diaktifkan di Opsi Pengembang. Kemudian, sambungkan perangkat Anda ke komputer dengan adb terinstal, dan jalankan perintah berikut:
adb shell settings put global enable_freeform_support 1
Metode 2 (tidak ada persyaratan tambahan)
Aktifkan opsi “Paksa aktivitas agar dapat diubah ukurannya” di bagian bawah Opsi Pengembang.
Kedua metode ini memerlukan UI Sistem untuk dimulai ulang sebelum dapat diterapkan. Cara termudah untuk melakukannya adalah dengan me-reboot perangkat Anda (atau, jika perangkat Anda sudah di-root, Anda cukup mematikannya com.android.systemui
proses)
Oke, jadi mode bentuk bebas diaktifkan… sekarang bagaimana?
Jika Anda mengaktifkan mode bentuk bebas menggunakan Metode 1, maka akan ada tombol baru pada entri aplikasi di menu Ikhtisar untuk meluncurkan aplikasi ke mode jendela bentuk bebas.
Namun, dengan Metode 2, tidak mungkin meluncurkan aplikasi ke mode bentuk bebas melalui Android itu sendiri. Untung, peluncur pihak ketiga mana pun dapat meluncurkan aplikasi ke mode jendela bentuk bebas menggunakan API Android standar yang diselesaikan sebagai bagian dari API level 24.
Kunci untuk meluncurkan aplikasi dalam mode bentuk bebas adalah dengan memanggil ActivityOptions.setLaunchBounds()
metode. Cara ini memerlukan a Rect
sebagai argumen, berisi batas jendela tempat aplikasi akan diluncurkan.
Anda kemudian dapat memulai aplikasi dengan startActivity(Intent, Bundle)
. Jika Anda belum memilikinya ActivityOptions
bundel, Anda dapat membuatnya dengan ActivityOptions.makeBasic()
dan kemudian menelepon setLaunchBounds()
pada bundel yang baru dibuat.
Perhatikan bahwa secara default, jika sudah ada tugas untuk aplikasi yang ada di layar Ikhtisar, maka Android hanya akan mengarahkan Anda ke tugas yang ada (layar penuh) yang sebelumnya diluncurkan oleh pengguna. Anda harus menyelesaikan tugas apa pun untuk aplikasi di Ikhtisar sebelum mencoba meluncurkan aplikasi ke jendela bentuk bebas. (Untuk aplikasi dengan aktivitas yang diluncurkan di standard
atau singleTop
mode, Anda dapat membuka paksa jendela baru dengan menambahkan Intent.FLAG_ACTIVITY_MULTIPLE_TASK
tandai maksudnya sebelum menelepon startActivity()
.)
Bagaimana cara kerja mode bentuk bebas?
Ada artikel yang sangat bagus tertulis yang menjelaskan bagaimana mode multi-jendela, termasuk mode bentuk bebas, diimplementasikan di Android Nougat. (CATATAN: artikel ini ditulis dalam bahasa Mandarin, jadi pastikan untuk menjalankannya melalui Google Terjemahan)
Singkatnya, aplikasi dalam mode bentuk bebas berjalan di tumpukan terpisah dari sistem lainnya (pikirkan: desktop virtual). Oleh karena itu, aplikasi berbentuk bebas tidak mungkin berjalan di atas peluncur atau di atas aplikasi layar penuh lainnya.
Aplikasi yang berjalan dalam mode bentuk bebas (yang tidak memiliki android: windowIsFloating
disetel ke true) memiliki a DecorCaptionView
ditambahkan sebagai anak tingkat atas DecorView
. Tampilan ini berisi a LinearLayout
menentukan bilah keterangan jendela untuk memindahkan, memaksimalkan, dan menutup jendela. Meskipun saya pribadi tidak merekomendasikannya, Anda dapat mengakses dan menyesuaikan tampilan ini dengan mendapatkan DecorView
menggunakan Window.getDecorView()
, melemparkannya ke a ViewGroup
dan kemudian mengakses tampilan anaknya.
Aplikasi apa pun yang dirancang untuk berperilaku baik dalam mode multi-jendela layar terpisah standar Android akan bekerja dalam mode bentuk bebas. isInMultiWindowMode()
akan mengembalikan nilai true untuk aplikasi yang berjalan dalam mode bentuk bebas. Ada beberapa kelas dan metode lain yang tersedia untuk umum yang dapat digunakan aplikasi yang berhubungan khusus dengan mode bentuk bebas:
-
Window.setDecorCaptionShade()
: metode ini dapat digunakan untuk mengganti bayangan kontrol teks (tombol maksimalkan dan tutup) untuk aplikasi dalam mode bentuk bebas. -
Window.setRestrictedCaptionAreaListener()
: ini dapat digunakan untuk mendeteksi ketika jendela dipindahkan dalam mode bentuk bebas. ItuWindow.OnRectrictedCaptionAreaChangedListener
dipanggil setiap kali posisi kontrol teks berubah (saat pengguna menggerakkan jendela), dan menyediakan aRect
dengan batasan baru pada kontrol teks. -
ActivityInfo.WindowLayout
: kelas ini berisi informasi yang dideklarasikan dalam manifes aplikasi mengenai posisi awal jendela bentuk bebas yang dapat diminta oleh aplikasi saat peluncuran. Misalnya, Anda dapat mencantumkan yang berikut ini di tag manifes Anda:
Kemudian, ketika perangkat sudah dalam mode bentuk bebas dan aplikasi diluncurkan, perangkat akan diluncurkan dengan batasan yang ditentukan ini.android: defaultHeight="640dp"
android: defaultWidth="360dp"
android: gravity="center" />
Contoh aksi mode jendela bentuk bebas
Pada musim panas 2016, ketika Android Nougat masih dalam tahap pratinjau pengembang, saya merilis sebuah aplikasi bernama Bilah tugas yang menyediakan menu mulai seperti Windows dan daftar aplikasi terbaru di hamparan sistem. Hal ini memungkinkan pengguna di Nougat untuk meluncurkan aplikasi dalam mode jendela bentuk bebas — dan, karena Taskbar menggunakan overlay, Taskbar dapat tetap berada di layar dalam lingkungan jendela bentuk bebas. Kombinasi Taskbar dan mode bentuk bebas membuat perangkat Android apa pun, terutama tablet, terasa seperti PC.
Kamu bisa unduh Bilah Tugas di Google Play, atau melihat kode sumber diri Anda di GitHub. Selain konsep yang disebutkan dalam artikel ini, saya juga menerapkan beberapa trik untuk menjaga lingkungan mode bentuk bebas tetap aktif bahkan ketika tidak ada jendela bentuk bebas yang ditampilkan di layar. Pengguna juga dapat secara opsional mengatur Taskbar sebagai peluncur default untuk memungkinkan perangkat mereka melakukan booting secara otomatis ke lingkungan mode bentuk bebas.
Karena tidak ada perangkat yang secara resmi dikirimkan dengan dukungan jendela bentuk bebas yang diaktifkan oleh OEM (saat tulisan ini dibuat), saya sarankan menggunakan Taskbar sebagai alat bagi pengembang untuk menguji aplikasi mereka di lingkungan jendela bentuk bebas pada perangkat yang tidak mendukungnya dia.
Selain Taskbar, saya juga memodifikasi kode sumber Launcher3 dari AOSP untuk memungkinkannya meluncurkan aplikasi ke mode bentuk bebas. Ini adalah tiruan langsung dari peluncur stok Android 7.1.1, dengan modifikasi minimal yang diperlukan untuk memungkinkannya meluncurkan aplikasi berbentuk bebas. Saya menyediakan peluncur yang dimodifikasi ini dengan harapan pengembang lain akan menerapkan dukungan untuk meluncurkan jendela bentuk bebas di peluncur khusus mereka. Kamu bisa melihat kode sumber di GitHub, atau unduh contoh APK.
Harapan saya adalah pengembang peluncur khusus dapat memanfaatkan kode ini dan mengaktifkan dukungan untuk peluncuran bentuk bebas aplikasi jendela untuk pengguna yang menginginkan fleksibilitas lebih besar untuk pengelolaan jendela di layar besar mereka perangkat.