Dukungan multi-aplikasi

Android 7.0 menambahkan dukungan untuk menampilkan lebih dari satu aplikasi sekaligus. Pada perangkat genggam, dua aplikasi dapat berjalan berdampingan atau atas-bawah dalam mode layar terpisah. Pada perangkat TV, aplikasi dapat menggunakan mode picture-in-picture untuk melanjutkan pemutaran video saat pengguna berinteraksi dengan aplikasi lain.

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

Ringkasan

Android memungkinkan beberapa aplikasi berbagi layar sekaligus. Misalnya, pengguna dapat 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 terpisah. Dalam mode ini, sistem mengisi layar dengan dua aplikasi yang ditampilkan secara berdampingan atau atas-bawah. Pengguna dapat menarik garis pembagi yang memisahkan keduanya untuk membuat satu aplikasi lebih besar dan yang lainnya lebih kecil.
  • Mulai dari Android 8.0, aplikasi dapat dengan sendirinya beralih ke mode picture-in-picture, sehingga dapat terus menampilkan konten sementara pengguna menjelajahi atau berinteraksi dengan aplikasi lain.
  • Produsen perangkat berukuran lebih besar dapat memilih untuk mengaktifkan mode format bebas, yang memungkinkan pengguna bebas mengubah ukuran setiap aktivitas. Jika produsen mengaktifkan fitur ini, perangkat akan menawarkan mode format bebas selain mode layar terpisah.

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

Pengguna dapat beralih ke mode multi-aplikasi dengan cara berikut:

  • Jika membuka layar Ringkasan dan menekan lama judul aktivitas, pengguna dapat menarik aktivitas tersebut ke bagian yang disorot pada layar untuk mengalihkan aktivitas ke mode multi-aplikasi.
  • Jika pengguna menekan lama tombol Ringkasan, perangkat akan mengalihkan aktivitas saat ini ke mode multi-aplikasi, dan membuka layar Ringkasan sehingga pengguna dapat memilih aktivitas lain yang akan berbagi layar.

Pengguna dapat menarik lalu melepas data dari satu aktivitas ke yang lainnya saat aktivitas berbagi layar.

Siklus proses multi-aplikasi

Mode multi-aplikasi tidak mengubah siklus proses aktivitas.

Dalam mode multi-aplikasi, 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 memiliki status STARTED, tetapi tidak memiliki status RESUMED. Namun, bagi sistem aktivitas yang terlihat tetapi tidak dilanjutkan ini memiliki prioritas lebih tinggi daripada aktivitas yang tidak terlihat. Jika pengguna berinteraksi dengan salah satu aktivitas yang terlihat, aktivitas tersebut akan dilanjutkan, dan aktivitas utama sebelumnya akan memasuki status STARTED.

Catatan: Dalam mode multi-aplikasi, aplikasi mungkin tidak dalam status RESUMED meskipun terlihat oleh pengguna. Suatu aplikasi mungkin harus melanjutkan operasinya saat tidak menjadi yang utama. Misalnya, aplikasi yang memutar video dalam status ini harus terus menampilkan videonya. Karena alasan ini, kami menyarankan aktivitas yang memutar video tidak menjeda pemutaran video sebagai respons terhadap peristiwa siklus proses ON_PAUSE. Sebagai gantinya, aktivitas akan memulai pemutaran sebagai respons terhadap ON_START, dan menjeda pemutaran sebagai respons terhadap ON_STOP. Jika Anda menangani peristiwa siklus proses secara langsung dan bukan menggunakan paket Siklus proses, jeda pemutaran video di pengendali onStop(), lalu lanjutkan pemutaran di onStart().

Bila pengguna mengalihkan aplikasi ke mode multi-aplikasi, sistem akan memberi tahu aktivitas tentang perubahan konfigurasi, sebagaimana disebutkan dalam Menangani Perubahan Konfigurasi. Hal ini juga terjadi bila pengguna mengubah ukuran aplikasi, atau mengalihkan aplikasi kembali 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 mode potret ke mode lanskap, kecuali dimensi perangkat telah berubah, bukan hanya ditukar. Sebagaimana dibahas dalam Menangani Perubahan Konfigurasi, aktivitas dapat menangani perubahan konfigurasi itu sendiri, atau 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 atribut gaya windowBackgroundFallback default.

Saat aplikasi berada dalam mode multi-aplikasi, status yang dilanjutkan akan bergantung pada versi perangkat Android.

  • Di Android 9 (API level 28) dan lebih rendah, hanya aktivitas dengan fokus yang berada dalam status RESUMED; yang lainnya adalah PAUSED. Jika ada beberapa aktivitas dalam satu proses aplikasi, aktivitas dengan urutan Z tertinggi memiliki status RESUMED dan yang lainnya memiliki status PAUSED.
  • Di Android 10 (API level 29) dan yang lebih tinggi, semua Aktivitas yang terlihat dan dapat difokuskan teratas memiliki status RESUMED.

dokumentasi multi-resume untuk mendapatkan informasi selengkapnya.

Multi-aplikasi

Mampu menjalankan beberapa aplikasi adalah salah satu keuntungan dari layar besar. Di masa lalu, memiliki dua aplikasi berdampingan adalah hal biasa di beberapa perangkat. Sekarang, teknologi ini telah jauh berkembang dan mampu menjalankan tiga aplikasi atau lebih di layar secara bersamaan, serta dapat saling berbagi konten di antara aplikasi tersebut:

Jika suatu aplikasi tidak mendukung mode multi-aplikasi dengan baik, aplikasi tersebut dapat menyetel resizeableActivity=false. Untuk informasi selengkapnya, baca Panduan Multi-Aplikasi.

Karena mode multi-aplikasi kini semakin umum digunakan, pertimbangkan untuk mendukung fitur tarik lalu lepas di aplikasi Anda.

Multi-resume

Saat berjalan di Android 9.0 dan yang lebih lama, hanya aplikasi yang mendapatkan fokus yang akan berada dalam status dilanjutkan . Aktivitas lain yang terlihat akan dijeda. Hal ini dapat menyebabkan masalah jika aplikasi menutup resource atau berhenti memutar konten ketika aplikasi dijeda.

Dalam Android 10, perilaku ini berubah sehingga semua Aktivitas tetap dalam status dilanjutkan bila perangkat dalam mode multi-aplikasi. Fitur ini disebut multi-resume. Perhatikan bahwa suatu aktivitas dapat dijeda jika ada aktivitas transparan di atas, atau Aktivitas yang tidak dapat difokuskan (mis. mode picture-in-picture ). Mungkin juga bahwa tidak ada aktivitas yang memiliki fokus pada waktu tertentu, misalnya, jika panel samping Notifikasi terbuka. OnStop tetap berfungsi seperti biasa Dan akan dipanggil kapan pun aktivitas dihapus dari layar.

Multi-resume juga tersedia di perangkat tertentu yang menjalankan Android 9.0. Untuk mengikutsertakan multi-resume di perangkat tersebut, Anda dapat menambahkan 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.

Akses resource eksklusif

Untuk membantu mendukung fitur multi-resume, terdapat callback siklus proses yang baru, Activity#onTopResumedActivityChanged().

Metode ini dipanggil ketika suatu aktivitas memperoleh atau kehilangan posisi teratas Aktivitas yang dilanjutkan. Ini penting untuk diketahui saat suatu aktivitas menggunakan resource pengguna tunggal yang dipakai bersama, seperti mikrofon atau kamera.

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
    }
}

Perhatikan bahwa aplikasi dapat kehilangan resource karena beberapa alasan lain, seperti pelepasan hardware yang digunakan bersama.

Dalam kasus apa pun, aplikasi harus dapat menangani peristiwa kehilangan resource dan perubahan status yang memengaruhi resource yang tersedia dengan baik.

Untuk aplikasi yang menggunakan kamera, direkomendasikan untuk menggunakan metode CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged() sebagai petunjuk bahwa ini mungkin saat yang tepat untuk mencoba mendapatkan akses ke kamera. Metode ini tersedia di Android 10 (API level 29) dan yang lebih baru.

Ingat bahwa resizeableActivity=false tidak menjamin akses eksklusif ke kamera, karena aplikasi lain yang menggunakan kamera dapat dibuka di tampilan lain.

Kamera dalam mode multi-aplikasi.

Aplikasi Anda tidak perlu merilis kamera saat kehilangan fokus. Misalnya, Anda mungkin ingin melanjutkan pratinjau kamera saat pengguna berinteraksi dengan aplikasi teratas yang dilanjutkan yang baru difokuskan. Aplikasi Anda tetap dapat menjalankan kamera saat tidak menjadi aplikasi teratas yang dilanjutkan, tetapi aplikasi harus menangani kasus pemutusan hubungan dengan benar. Ketika aplikasi teratas yang dilanjutkan ingin menggunakan kamera, aplikasi tersebut dapat membukanya, dan aplikasi Anda akan kehilangan akses. Aplikasi Anda dapat kembali membuka kamera saat mendapatkan fokus.

Setelah aplikasi menerima callback, CameraDevice.StateCallback#onDisconnected() panggilan selanjutnya pada perangkat kamera akan menampilkan CameraAccessException.

Multi-tampilan

Di masa mendatang, Anda mungkin akan melihat ponsel foldable yang mendukung lebih dari satu layar atau tampilan secara bersamaan. Penanganan konfigurasi ini mirip dengan cara kerja developer pada layar yang diproyeksikan saat ini di Chrome OS.

Android 10 (API level 29) dan yang lebih baru 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 berdependensi pada mode peluncuran aktivitas yang ditentukan dalam file manifes, dan dalam flag intent serta opsi yang disetel oleh entitas yang meluncurkan aktivitas. Lihat ActivityOptions untuk detail selengkapnya.

Seperti halnya transisi lipat, saat berpindah ke tampilan sekunder, aktivitas dapat melalui update konteks, perubahan ukuran jendela, serta konfigurasi dan perubahan resource. Jika aktivitas menangani perubahan konfigurasi, hal ini akan diberitahukan dalam onConfigurationChanged(). Jika tidak, aplikasi akan diluncurkan kembali.

Suatu aktivitas harus memeriksa tampilan saat ini di onCreate dan onConfigurationChanged jika ditangani. Pastikan untuk memperbarui resource dan tata letak saat tampilan berubah.

Jika mode peluncuran yang dipilih untuk suatu aktivitas memungkinkan beberapa instance, ingat bahwa peluncuran pada layar sekunder dapat membuat instance aktivitas baru. Kedua aktivitas akan dilanjutkan secara bersamaan.

Beberapa instance Aktivitas di beberapa tampilan.

Anda mungkin juga ingin membaca tentang API multi-tampilan yang ada, yang diperkenalkan di Android 8.0.

Potongan layar

Perangkat foldable mungkin memiliki geometri potongan yang berbeda saat dilipat dan dibentangkan. Untuk menghindari masalah potongan, baca Praktik terbaik untuk potongan layar.

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 konteks aktivitas tersebut muncul. Hal ini memungkinkan Anda mendapatkan informasi yang benar tentang kepadatan atau metrik jendela yang saat ini dimiliki 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 (seperti Toast).

Konfigurasi jendela aktivitas dan tampilan induk menentukan resource dan konteks. Untuk mendapatkan tampilan saat ini, gunakan:

val activityDisplay = activity.display

Untuk mendapatkan metrik jendela aktivitas saat ini, gunakan:

val windowMetrics = activity.windowManager.getCurrentWindowMetrics()

Untuk mendapatkan metrik jendela maksimum untuk konfigurasi sistem saat ini, gunakan:

val maximumWindowMetrics = activity.windowManager.getMaximumWindowMetrics()

Metrik jendela maksimum adalah informasi yang tepat untuk membuat perhitungan atau pilihan tata letak, atau untuk menentukan ukuran resource yang akan diambil sebelumnya. Dengan tersedianya metrik ini dalam onCreate(), Anda dapat membuat keputusan tersebut sebelum tata letak pertama diteruskan. Ini tidak boleh digunakan untuk menempatkan elemen tata letak tertentu dan harus menggunakan informasi dari objek Configuration.

Menggunakan layar sekunder

Anda bisa mendapatkan tampilan yang tersedia dari layanan sistem DisplayManager :

val dm = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
val displays = dm.displays

Gunakan class Display untuk mendapatkan informasi tentang tampilan tertentu, seperti memeriksa tanda untuk melihat apakah tampilan aman.

Namun, jangan anggap bahwa ukuran tampilan akan menjadi ukuran konstan untuk menempatkan aplikasi Anda. Ingatlah bahwa dalam mode multi-aplikasi, aplikasi Anda akan berada di subset tampilan.

Untuk menentukan apakah suatu aktivitas dapat diluncurkan pada tampilan:

activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent)

Dan untuk meluncurkan aktivitas di tampilan:

val options = ActivityOptions.makeBasic()
options.launchDisplayId = targetDisplay.displayId
startActivity(intent, options.toBundle())

Dukungan multi-tampilan

Android sudah mendukung keyboard Software, Wallpaper, dan Peluncur.

Keyboard virtual

Keyboard dapat ditampilkan di layar sekunder jika tampilan dikonfigurasi untuk mendukung dekorasi sistem. Editor metode input akan muncul otomatis jika kolom teks meminta input pada tampilan tersebut.

Keyboard pada tampilan sekunder.

Wallpaper

Dalam Android 10 (API level 29) dan yang lebih baru, 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 menyetel android:supportsMultipleDisplays="true".

Wallpaper di ponsel dan tampilan sekunder.

Peluncur

Ada kategori filter intent baru SECONDARY_HOME untuk menyediakan aktivitas khusus bagi layar sekunder. Instance aktivitas ini digunakan pada semua layar yang mendukung dekorasi sistem, satu instance untuk setiap layar.

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

Sebagai contoh, implementasi AOSP dari Launcher3 mendukung aktivitas SECONDARY_HOME.

Peluncur Desain Material di ponsel.

Peluncur Desain Material pada tampilan sekunder.

Mengonfigurasi aplikasi untuk Mode multi-aplikasi

Jika aplikasi Anda menargetkan API level 24 atau yang lebih tinggi, Anda dapat mengonfigurasi cara dan apakah aktivitas aplikasi mendukung tampilan 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 yang ditetapkan ke true, maka semua aktivitas dalam stack tugas dapat diubah ukurannya.

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

Pada beberapa perangkat yang lebih besar, seperti Chromebook, aplikasi mungkin berjalan di jendela yang dapat diubah ukurannya meskipun Anda menentukan android:resizeableActivity=”false”. Jika hal ini akan merusak aplikasi, Anda dapat menggunakan filter untuk membatasi ketersediaan aplikasi di perangkat tersebut.

android:resizeableActivity

Tetapkan atribut ini dalam elemen <activity> atau <application> manifes untuk mengaktifkan atau menonaktifkan tampilan multi-aplikasi:

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

Jika atribut ini ditetapkan ke true, aktivitas dapat diluncurkan dalam mode layar terpisah dan format bebas. Jika atribut ini ditetapkan ke false, aktivitas tidak akan mendukung mode multi-aplikasi. Jika nilainya adalah false dan pengguna mencoba meluncurkan aktivitas dalam mode multi-aplikasi, maka aktivitas tersebut akan mengambil alih layar penuh.

Jika aplikasi menargetkan API level 24, tetapi Anda tidak menetapkan nilai untuk atribut ini, nilai atribut secara default akan disetel ke benar (true).

android:supportsPictureInPicture

Tetapkan atribut ini ke node <activity> manifes untuk menunjukkan apakah aktivitas mendukung tampilan Picture-in-Picture. Atribut ini diabaikan jika android:resizeableActivity bernilai false.

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

Atribut tata letak

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

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

Misalnya, kode berikut menunjukkan cara menetapkan ukuran dan lokasi default aktivitas, serta ukuran minimumnya, saat 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>

Menangani perubahan konfigurasi dengan benar

Jika Anda menangani sendiri perubahan konfigurasi multi-aplikasi, seperti yang terjadi saat pengguna mengubah ukuran jendela, tambahkan atribut android:configChanges ke manifes dengan nilai yang setidaknya seperti berikut:

<activity
  android:name=".MyActivity"
  android:configChanges="screenSize|smallestScreenSize
      |screenLayout|orientation"
/>

Setelah menambahkan android:configChanges, Activity dan Fragments 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.

Menjalankan aplikasi dalam mode multi-aplikasi

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

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

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

Notifikasi perubahan dan pengajuan kueri terkait multi-aplikasi

Activity menawarkan metode berikut ini untuk mendukung tampilan multi-aplikasi.

isInMultiWindowMode()
Panggil untuk mengetahui apakah aktivitas sedang dalam mode multi-aplikasi.
isInPictureInPictureMode()
Panggil untuk mengetahui apakah aktivitas sedang dalam mode picture-in-picture.

Catatan: Mode picture-in-picture adalah kasus khusus mode multi-aplikasi. Jika myActivity.isInPictureInPictureMode() menampilkan true, maka myActivity.isInMultiWindowMode() juga akan menampilkan true.

onMultiWindowModeChanged()
Sistem akan 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, dan nilai false jika aktivitas keluar dari mode multi-aplikasi.
onPictureInPictureModeChanged()
Sistem akan memanggil metode ini setiap kali aktivitas masuk atau keluar dari mode picture-in-picture. Sistem akan meneruskan nilai true ke metode ini jika aktivitas memasuki mode picture-in-picture, dan nilai false jika aktivitas keluar dari mode picture-in-picture.

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

Memasuki mode picture-in-picture

Untuk mengalihkan aktivitas ke mode picture-in-picture, panggil Activity.enterPictureInPictureMode(). Metode ini tidak berpengaruh jika perangkat tidak mendukung mode picture-in-picture. Untuk informasi selengkapnya, lihat dokumentasi Picture-in-Picture.

Meluncurkan 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. Untuk melakukannya, gunakan tanda intent FLAG_ACTIVITY_LAUNCH_ADJACENT. Tanda ini memberi tahu sistem untuk mencoba membuat aktivitas baru di sebelah aktivitas yang meluncurkannya, sehingga kedua aktivitas tersebut berbagi layar. Sistem melakukan upaya terbaik untuk melakukannya, tetapi keberhasilannya tidak dijamin.

Jika perangkat sedang dalam mode format bebas dan Anda meluncurkan aktivitas baru, dimensi dan lokasi layarnya dapat ditetapkan dengan memanggil ActivityOptions.setLaunchBounds(). Metode ini tidak berpengaruh jika perangkat tidak sedang dalam mode multi-aplikasi.

Catatan: 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.

Mendukung 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 di widget TextView yang dapat diedit, lihat OnReceiveContentListener di Jetpack. Untuk dukungan tarik lalu lepas yang komprehensif, seperti memungkinkan penarikan konten dari aplikasi Anda, lihat topik menarik lalu melepas.

DragAndDropPermissions
Objek token bertanggung jawab menetapkan izin yang diberikan untuk aplikasi yang menerima pelepasan.
View.startDragAndDrop()
Alias untuk View.startDrag(). Untuk mengaktifkan tarik lalu lepas lintas aktivitas, teruskan tanda DRAG_FLAG_GLOBAL. Jika Anda perlu memberikan izin URI untuk aktivitas penerima, teruskan tanda DRAG_FLAG_GLOBAL_URI_READ atau DRAG_FLAG_GLOBAL_URI_WRITE, sebagaimana mestinya.
View.cancelDragAndDrop()
Membatalkan operasi tarik yang sedang berlangsung. Hanya dapat dipanggil oleh aplikasi yang menghasilkan operasi tarik.
View.updateDragShadow()
Menggantikan bayangan tarik untuk operasi tarik yang sedang berlangsung. Hanya dapat dipanggil oleh aplikasi yang menghasilkan operasi tarik.
Activity.requestDragAndDropPermissions()
Meminta izin untuk URI konten yang diteruskan dengan ClipData yang terdapat dalam DragEvent.
DragAndDropPermissions.release()
Merilis izin yang diperlukan untuk mengakses data di URI konten yang diberikan dalam ClipData. Jika metode ini tidak dipanggil, izin akan dirilis secara otomatis saat aktivitas yang memuatnya dihancurkan.

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

Multi-instance bukan tata letak multi-panel, yaitu tata letak daftar/detail yang menggunakan SlidingPaneLayout. Multi-instance 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 posenya 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.

Menguji dukungan multi-aplikasi di aplikasi Anda

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.

Mengonfigurasi perangkat pengujian

Jika menjalankan Android 7.0 atau yang lebih tinggi, perangkat otomatis mendukung mode layar terpisah.

Jika aplikasi Anda menargetkan API level 23 atau yang lebih rendah

Jika aplikasi Anda menargetkan API level 23 atau yang lebih rendah dan pengguna mencoba menggunakan aplikasi dalam mode multi-aplikasi, sistem akan secara paksa mengubah ukuran aplikasi, 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 tersebut ke mode layar terpisah. Pastikan pengalaman pengguna dapat diterima bila 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.

Jika Anda mendukung mode multi-aplikasi

Jika aplikasi Anda menargetkan API level 24 atau yang lebih tinggi dan tidak menonaktifkan dukungan multi-aplikasi, pastikan perilaku berikut dalam mode layar terpisah dan mode bentuk bebas.

  • Luncurkan aplikasi dalam mode layar penuh, lalu alihkan ke mode multi-aplikasi dengan menekan lama tombol Ringkasan. Pastikan apakah 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 Ringkasan, lalu menekan lama panel judul aplikasi dan menariknya ke salah satu area yang disorot pada layar.
  • Ubah ukuran aplikasi dalam mode layar terpisah dengan menarik garis pembagi. Pastikan apakah aplikasi mengubah ukuran tanpa error dan elemen UI yang diperlukan terlihat.
  • Jika Anda telah menetapkan dimensi minimum untuk aplikasi, coba ubah ukuran aplikasi di bawah dimensi tersebut. Pastikan bahwa Anda tidak dapat mengubah ukuran aplikasi menjadi lebih kecil dari batas 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.

Daftar periksa pengujian

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

  • Masuki dan keluar dari mode multi-aplikasi.
  • Alihkan dari aplikasi Anda ke aplikasi lain, dan pastikan bahwa aplikasi berperilaku sebagaimana mestinya saat terlihat tetapi tidak aktif. Misalnya, jika aplikasi Anda sedang memutar video, pastikan bahwa video terus diputar saat pengguna berinteraksi dengan aplikasi lain.
  • Dalam mode layar terpisah, coba geser garis pembagi untuk membuat aplikasi menjadi 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 bahwa aplikasi tidak error atau mengalami kebocoran memori. Untuk informasi tentang cara memeriksa penggunaan memori aplikasi, gunakan Memory Profiler di Android Studio.
  • Gunakan aplikasi secara normal di sejumlah konfigurasi jendela berbeda, dan pastikan bahwa aplikasi berperilaku sebagaimana mestinya. Pastikan bahwa teks terbaca, dan elemen UI tidak terlalu kecil untuk interaksi.

Jika Anda telah menonaktifkan dukungan multi-aplikasi

Jika Anda menonaktifkan dukungan multi-aplikasi dengan menetapkan android:resizeableActivity="false", Anda harus meluncurkan aplikasi di perangkat yang menjalankan Android 7.0 atau yang lebih tinggi dan mencoba mengalihkan aplikasi ke mode format bebas dan mode layar terpisah. Pastikan bahwa saat Anda melakukannya, aplikasi tetap dalam mode layar penuh.

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