API dan Fitur Android 8.0

Android 8.0 memperkenalkan beragam fitur dan kemampuan baru bagi pengguna dan developer. Dokumen ini menyoroti hal-hal baru untuk developer.

Pastikan memeriksa Perubahan Perilaku Android 8.0 untuk mengetahui tentang bidang apa saja pada aplikasi Anda yang mungkin terpengaruh oleh perubahan platform.

Pengalaman Pengguna

Notifikasi

Di Android 8.0, kami telah mendesain ulang notifikasi untuk memberikan cara yang lebih mudah serta konsisten untuk mengelola perilaku notifikasi dan setelan. Perubahan tersebut meliputi:

    Menu penekanan lama notifikasi di Android 8.0.

    Gambar 1. Pengguna bisa menekan lama pada ikon peluncur aplikasi untuk menampilkan notifikasi di Android 8.0.

  • Saluran notifikasi: Android 8.0 memperkenalkan saluran notifikasi yang memungkinkan Anda untuk membuat saluran yang dapat disesuaikan pengguna untuk setiap jenis notifikasi yang ingin ditampilkan. Antarmuka pengguna mengacu pada saluran notifikasi sebagai kategori notifikasi. Untuk mempelajari cara mengimplementasikan saluran notifikasi, lihat panduan Saluran Notifikasi.
  • Badge notifikasi: Android 8.0 memperkenalkan bantuan untuk menampilkan badge notifikasi pada ikon peluncur aplikasi. Badge notifikasi mencerminkan kehadiran notifikasi yang dikaitkan dengan suatu aplikasi, yang belum ditutup atau ditindaklanjuti oleh pengguna. Badge notifikasi juga dikenal sebagai titik notifikasi. Untuk mengetahui cara menyesuaikan badge notifikasi, lihat panduan Badge Notifikasi.
  • Penundaan: Pengguna bisa menunda notifikasi agar muncul kembali di lain waktu. Notifikasi akan muncul lagi dengan tingkat yang sama pentingnya seperti saat mereka pertama kali muncul. Aplikasi bisa membuang atau memperbarui notifikasi yang ditunda, namun memperbarui notifikasi yang ditunda tidak akan menyebabkannya muncul kembali.
  • Waktu tunggu notifikasi: Sekarang Anda bisa menyetel waktu tunggu saat membuat notifikasi menggunakan setTimeoutAfter(). Anda bisa menggunakan metode ini untuk menetapkan durasi notifikasi sebelum dibatalkan. Jika diperlukan, Anda bisa membatalkan notifikasi sebelum durasi waktu tunggu yang ditetapkan berlalu.
  • Setelan notifikasi: Anda bisa memanggil setSettingsText() untuk menyetel teks agar muncul bila Anda membuat tautan ke pengaturan notifikasi aplikasi dari suatu notifikasi dengan menggunakan intent Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES. Sistem mungkin menyediakan ekstra berikut bersama intent untuk memfilter setelan yang harus ditampilkan oleh aplikasi Anda kepada pengguna: EXTRA_CHANNEL_ID, NOTIFICATION_TAG, dan NOTIFICATION_ID.
  • Menutup notifikasi: Sistem sekarang membedakan apakah notifikasi ditutup oleh pengguna, atau dibuang oleh aplikasi. Untuk memeriksa bagaimana notifikasi ditutup, Anda harus mengimplementasikan metode baru onNotificationRemoved() dari kelas NotificationListenerService.
  • Warna latar belakang: Anda kini bisa menyetel dan mengaktifkan warna latar belakang bagi notifikasi. Anda sebaiknya hanya menggunakan fitur ini dalam notifikasi untuk tugas-tugas yang sedang berjalan yang perlu diketahui pengguna secara sekilas. Misalnya, Anda bisa menyetel warna latar belakang notifikasi terkait dengan arah mengemudi, atau panggilan telepon yang sedang berlangsung. Anda juga bisa menyetel warna latar belakang yang diinginkan menggunakan Notification.Builder.setColor(). Cara tersebut memungkinkan Anda menggunakan Notification.Builder.setColorized() untuk mengaktifkan penggunaan warna latar belakang bagi notifikasi.
  • Gaya perpesanan: Notifikasi yang menggunakan kelas MessagingStyle sekarang menampilkan materi lebih banyak dalam bentuk yang diciutkan. Anda harus menggunakan kelas MessagingStyle untuk notifikasi yang terkait-perpesanan. Anda juga bisa menggunakan metode addHistoricMessage() yang baru untuk menyediakan konteks pada percakapan dengan menambahkan pesan historis untuk notifikasi terkait perpesanan.

Kerangka Kerja Isiotomatis

Pembuatan akun, login, dan transaksi kartu kredit membutuhkan waktu dan rentan terhadap error. Pengguna bisa cepat putus asa dengan aplikasi yang memerlukan tipe tugas berulang ini.

Android 8.0 mempermudah pengisian formulir, seperti proses masuk dan formulir kartu kredit, dengan pengenalan Kerangka Kerja Isiotomatis. Aplikasi baru dan yang sudah ada akan bekerja dengan Kerangka Kerja Isiotomatis setelah pengguna mengaktifkan isiotomatis.

Anda bisa melakukan beberapa langkah untuk mengoptimalkan kinerja aplikasi dengan kerangka kerja. Untuk informasi selengkapnya, lihat Ringkasan Framework IsiOtomatis.

Mode Gambar-dalam-Gambar

Android 8.0 memungkinkan aktivitas diluncurkan dalam mode gambar-dalam-gambar (PIP). PIP adalah tipe khusus mode multi-jendela yang biasanya digunakan untuk pemutaran video. Mode PIP sudah tersedia untuk Android TV; Android 8.0 menjadikan fitur tersebut tersedia pada perangkat Android lainnya.

Bila dalam mode PIP, aktivitas berada dalam keadaan berhenti sementara, namun tetap harus menampilkan materi. Karena alasan inilah, Anda harus memastikan aplikasi tidak menghentikan sementara pemutaran di penangan onPause(). Sebagai gantinya, Anda harus menghentikan sementara video di onStop(), dan melanjutkan pemutaran di onStart(). Untuk informasi selengkapnya, lihat Daur Hidup Multi-Jendela.

Untuk menetapkan agar aktivitas Anda bisa menggunakan mode PIP, setel android:supportsPictureInPicture ke true dalam manifes. (Mulai Android 8.0, Anda tidak perlu menyetel android:resizeableActivity ke true bila mendukung mode PIP, baik pada Android TV maupun perangkat Android lain, Anda hanya perlu menyetel android:resizeableActivity jika aktivitas Anda mendukung mode multi-jendela lain.)

Perubahan API

Android 8.0 memperkenalkan objek baru, PictureInPictureParams, yang Anda teruskan ke metode PIP untuk menetapkan cara perilaku aktivitas bila dalam mode PIP. Objek ini menetapkan properti seperti rasio aspek yang disukai aktivitas.

Metode PIP yang dijelaskan dalam Menambahkan Picture-in-picture sekarang bisa digunakan pada semua perangkat Android, tidak hanya Android TV. Selain itu, Android 8.0 menyediakan metode berikut untuk mendukung mode PIP:

  • Activity.enterPictureInPictureMode(PictureInPictureParams args): Menempatkan aktivitas dalam mode gambar-dalam-gambar. Rasio aspek aktivitas dan setelan konfigurasi lainnya ditetapkan oleh args. Jika ada bidang dalam args yang kosong, sistem ini akan menggunakan nilai yang disetel terakhir kali saat Anda memanggil Activity.setPictureInPictureParams().

    Aktivitas yang ditetapkan akan ditempatkan di sudut layar; sisa layar akan diisi dengan aktivitas sebelumnya yang sudah ada di layar. Aktivitas yang memasuki mode PIP beralih ke keadaan berhenti sementara, namun tetap dimulai. Jika pengguna menge-tap aktivitas PIP, sistem akan menampilkan menu interaksi bagi pengguna; tidak ada kejadian sentuh yang mencapai aktivitas ketika berada dalam keadaan PIP.

  • Activity.setPictureInPictureParams(): Meng-update setelan konfigurasi PIP aktivitas. Bila aktivitas saat ini dalam mode PIP, setelan akan di-update; ini berguna jika terjadi perubahan rasio aspek aktivitas. Bila aktivitas tersebut tidak berada dalam mode PIP, setelan konfigurasi akan digunakan tanpa menghiraukan metode enterPictureInPictureMode() yang Anda panggil.

Font yang Bisa Diunduh

Android 8.0 dan Koleksi Dukungan Android 26 memungkinkan Anda meminta font dari aplikasi penyedia sebagai ganti membundel font ke dalam APK atau membiarkan APK mendownload font. Fitur ini mengurangi ukuran APK Anda, menambah tingkat keberhasilan penginstalan aplikasi, dan memungkinkan beberapa aplikasi berbagi font yang sama.

Untuk informasi selengkapnya tentang mendownload font, lihat Font Yang Bisa Didownload.

Font Dalam XML

Android 8.0 memperkenalkan fitur baru, Font dalam XML, yang memungkinkan Anda menggunakan font sebagai sumber daya. Ini berarti, Anda tidak perlu membundel font sebagai aset. Font dikompilasi dalam file R dan secara otomatis tersedia dalam sistem sebagai sumber daya. Anda selanjutnya bisa mengakses font ini dengan bantuan tipe sumber daya baru, font.

Koleksi Dukungan 26 menyediakan dukungan penuh terhadap fitur ini pada perangkat yang menjalankan API versi 14 dan yang lebih tinggi.

Untuk informasi selengkapnya tentang menggunakan font sebagai sumber daya dan mengambil font sistem, lihat Font dalam XML.

Pengubahan Ukuran Otomatis TextView

Android 8.0 memungkinkan Anda menyetel ukuran teks agar mengembang atau mengerut secara otomatis berdasarkan ukuran TextView tersebut. Ini berarti, mengoptimalkan ukuran teks pada layar yang berbeda atau dengan konten dinamis akan jauh lebih mudah. Untuk informasi selengkapnya tentang pengubahan ukuran otomatis TextView di Android 8.0, lihat Pengubahan Ukuran Otomatis TextView.

Ikon adaptif

Android 8.0 memperkenalkan ikon peluncur adaptif. Ikon adaptif mendukung efek visual, dan bisa menampilkan berbagai bentuk pada semua model perangkat. Untuk mempelajari cara membuat ikon adaptif, lihat panduan fitur pratinjau Ikon Adaptif.

Manajemen warna

Sekarang developer aplikasi pencitraan di Android bisa memanfaatkan perangkat baru yang memiliki kemampuan tampilan warna gamut-lebar. Untuk menampilkan gambar gamut lebar, aplikasi perlu mengaktifkan flag di manifesnya (per aktivitas) dan memuat bitmap dengan profil warna lebar tersemat (AdobeRGB, Pro Photo RGB, DCI-P3, dll.).

WebView API

Android 8.0 menyediakan sejumlah API untuk membantu Anda mengelola objek WebView yang menampilkan konten web dalam aplikasi. API ini, yang meningkatkan stabilitas dan keamanan aplikasi Anda, antara lain sebagai berikut:

  • Version API
  • Google SafeBrowsing API
  • Termination Handle API
  • Renderer Importance API

Untuk mempelajari lebih lanjut tentang cara menggunakan API ini, lihat Mengelola WebView.

Penyematan pintasan dan widget

Android 8.0 memperkenalkan penyematan pintasan dan widget dalam aplikasi. Dalam aplikasi, Anda bisa membuat pintasan tersemat dan widget untuk peluncur yang didukung, tunduk pada izin pengguna.

Untuk informasi selengkapnya, lihat panduan fitur pratinjau Penyematan Pintasan dan Widget.

Rasio aspek layar maksimum

Aplikasi yang menargetkan Android 7.1 (API level 25) atau yang lebih rendah, memiliki rasio aspek layar maksimum default sebesar 1,86. Aplikasi yang menargetkan Android 8.0 atau yang lebih tinggi tidak memiliki rasio aspek maksimum default. Jika aplikasi Anda perlu menyetel rasio aspek maksimum, gunakan atribut maxAspectRatio dalam file manifes yang mendefinisikan Aktivitas Anda.

Dukungan multi-tampilan

Dimulai dengan Android 8.0, platform ini menawarkan dukungan yang disempurnakan untuk multitampilan. Jika suatu aktivitas mendukung mode multi-jendela dan berjalan pada perangkat dengan multi-tampilan, pengguna bisa memindahkan aktivitas dari satu tampilan ke tampilan yang lain. Saat meluncurkan sebuah aktivitas, aplikasi bisa menetapkan di tampilan mana aktivitas itu harus dijalankan.

Catatan: Jika suatu aktivitas mendukung mode multi-jendela, Android 8.0 secara otomatis akan mengaktifkan dukungan multi-tampilan untuk aktivitas tersebut. Anda harus menguji aplikasi untuk memastikan itu bekerja secara memadai dalam lingkungan multi-tampilan.

Hanya satu aktivitas pada satu waktu yang bisa berada dalam keadaan dilanjutkan, bahkan jika aplikasi memiliki beberapa tampilan. Aktivitas berfokus berada dalam keadaan dilanjutkan kembali; seluruh aktivitas lain yang terlihat akan dihentikan sementara, namun tidak dihentikan. Untuk informasi selengkapnya mengenai daur hidup aktivitas bila sejumlah aktivitas terlihat, lihat Daur Hidup Multi-Jendela.

Ketika pengguna memindahkan aktivitas dari satu tampilan ke tampilan yang lain, sistem akan mengubah ukuran aktivitas dan menerbitkan perubahan waktu proses bila diperlukan. Aktivitas Anda bisa menangani perubahan konfigurasinya sendiri, atau mengizinkan sistem untuk menghapus proses yang berisi aktivitas dan menciptakannya kembali dengan dimensi yang baru. Untuk informasi selengkapnya, lihat Menangani Perubahan Konfigurasi.

ActivityOptions menyediakan dua metode baru untuk mendukung multitampilan:

setLaunchDisplayId()
Menetapkan pada tampilan mana aktivitas harus ditunjukkan pada saat diluncurkan.
getLaunchDisplayId()
Mengembalikan tampilan peluncuran aktivitas saat ini.

Shell adb diperluas untuk mendukung multitampilan. Perintah shell start sekarang bisa digunakan untuk menjalankan aktivitas, dan menetapkan tampilan target aktivitas:

adb shell start <activity_name> --display <display_id>

Margin layout gabungan dan pengisi

Android 8.0 lebih memudahkan Anda untuk menetapkan dalam situasi mana sisi yang berlawanan dari sebuah elemen View menggunakan margin atau pengisi yang sama. Secara khusus, Anda kini bisa menggunakan atribut berikut dalam file XML layout:

Catatan: Jika Anda menyesuaikan logika aplikasi untuk mendukung bahasa dan budaya yang berbeda, termasuk arah teks, ingatlah bahwa atribut ini tidak memengaruhi nilai layout_marginStart, layout_marginEnd, paddingStart, atau paddingEnd. Anda bisa menyetel nilai ini sendiri, selain atribut layout vertikal dan horizontal yang baru, untuk menciptakan perilaku layout yang bergantung pada arah teks.

Pengambilan pointer

Beberapa aplikasi, seperti game, desktop jauh, dan klien virtualisasi, sangat diuntungkan karena bisa dikontrol melalui pointer mouse. Perekaman pointer adalah fitur baru di Android 8.0 yang menyediakan kontrol dengan mengirim semua kejadian mouse ke tampilan terfokus dalam aplikasi Anda.

Mulai Android 8.0, View di aplikasi Anda bisa meminta rekaman pointer dan mendefinisikan listener untuk memproses kejadian pointer yang terekam. Pointer mouse disembunyikan saat berada dalam mode ini. Tampilan ini bisa membuang rekaman pointer saat informasi mouse tidak dibutuhkan lagi. Sistem juga bisa merilis rekaman pointer saat tampilan kehilangan fokus, misalnya saat pengguna membuka aplikasi lain.

Untuk informasi mengenai cara menggunakan fitur ini dalam aplikasi Anda, lihat Rekaman pointer.

Kategori aplikasi

Android 8.0 memungkinkan setiap aplikasi untuk mendeklarasikan kategori yang sesuai dengannya, bila relevan. Kategori ini digunakan untuk mengelompokkan aplikasi dengan kegunaan atau fungsi yang sama saat menampilkannya kepada pengguna, seperti Penggunaan Data, Penggunaan Baterai, atau Penggunaan Storage. Anda bisa mendefinisikan kategori untuk aplikasi dengan menyetel atribut android:appCategory di tag manifes <application>.

Peluncur Android TV

Android 8.0 menyertakan pengalaman layar utama Android TV konten-sentris baru, yang tersedia pada emulator Android TV dan citra perangkat Nexus Player untuk Android 8.0. Layar beranda baru mengatur konten video dalam bentuk baris sesuai dengan saluran, yang masing-masing diisi dengan program oleh aplikasi pada sistem. Aplikasi bisa mempublikasikan beberapa saluran, dan pengguna bisa mengonfigurasi saluran mana yang ingin mereka lihat di layar utama. Layar utama Android TV juga menyertakan baris Watch Next, yang diisi dengan program dari aplikasi, berdasarkan kebiasaan pengguna menampilkan. Aplikasi juga bisa menyediakan pratinjau video, yang akan diputar secara otomatis bila pengguna memfokus pada sebuah program. API untuk mengisi saluran dan program merupakan bagian dari API TvProvider, yang didistribusikan sebagai modul Koleksi Dukungan Android bersama Android 8.0.

AnimatorSet

Mulai Android 8.0, AnimatorSet API sekarang mendukung pencarian dan pemutaran secara terbalik. Pencarian memungkinkan Anda menyetel posisi animasi yang disetel ke titik waktu tertentu. Pemutaran secara terbalik berguna jika aplikasi Anda menyertakan animasi untuk tindakan yang bisa dibatalkan. Sebagai ganti mendefinisikan dua set animasi terpisah, Anda bisa memutar animasi yang sama secara terbalik.

Masukan dan navigasi

Kluster navigasi keyboard

Jika suatu aktivitas dalam aplikasi Anda menggunakan hierarki tampilan yang kompleks, seperti terlihat dalam Gambar 2, pertimbangkan untuk mengatur kelompok elemen UI ke dalam kluster guna memudahkan navigasi keyboard di antara mereka. Pengguna bisa menekan Meta+Tab, atau Search+Tab pada perangkat Chromebook, untuk menuju dari satu kluster ke kluster lain. Contoh kluster yang baik meliputi: panel samping, menu navigasi, area konten utama, dan elemen yang dapat menampung banyak elemen anak.

Contoh aktivitas yang menyertakan lima kluster navigasi yang bisa dipilih pengguna dengan menggunakan pintasan kluster navigasi keyboard. Kluster muncul dalam susunan berikut: panel atas, panel samping kiri, area konten utama, panel bawah, dan tombol aksi mengambang.
Gambar 2. Aktivitas yang berisi 5 kluster navigasi

Untuk membuat sebuah elemen View atau ViewGroup menjadi kluster, setel atribut android:keyboardNavigationCluster ke true dalam file XML layout elemen, atau teruskan true ke setKeyboardNavigationCluster() dalam logika UI aplikasi Anda.

Catatan: Kluster tidak bisa disarangkan, meskipun kluster yang tidak bersarang bisa muncul pada tingkat hierarki berbeda. Jika Anda mencoba menyarangkan kluster, framework hanya memperlakukan elemen ViewGroup teratas sebagai sebuah kluster.

Pada perangkat yang memiliki layar sentuh, Anda bisa menyetel elemen android:touchscreenBlocksFocus objek ViewGroup yang ditetapkan kluster ke true untuk mengizinkan navigasi khusus kluster masuk dan keluar kluster itu. Jika Anda menerapkan konfigurasi ini ke sebuah kluster, pengguna tidak bisa menggunakan tombol Tab atau tombol panah untuk membuka atau menutup kluster; mereka harus menekan kombinasi keyboard navigasi kluster.

Fokus default tampilan

Di Android 8.0, Anda bisa menetapkan View yang harus menerima fokus setelah aktivitas yang dibuat (ulang) dilanjutkan dan pengguna menekan tombol navigasi keyboard, seperti tombol tab. Untuk menerapkan setelan "fokus secara default" ini, setel atribut android:focusedByDefault elemen View ke true dalam file XML layout yang berisi elemen UI, atau teruskan true ke setFocusedByDefault() dalam logika UI aplikasi Anda.

Sistem

Detektor StrictMode baru

Android 8.0 menambahkan tiga detektor StrictMode baru untuk membantu mengidentifikasi potensi bug dalam aplikasi Anda:

  • detectUnbufferedIo() akan mendeteksi bila aplikasi Anda membaca atau menulis data tanpa penyanggaan, yang secara drastis bisa berdampak pada kinerja.
  • detectContentUriWithoutPermission() akan mendeteksi bila aplikasi Anda secara tidak sengaja lupa untuk memberikan izin bagi aplikasi lain ketika memulai Aktivitas di luar aplikasi.
  • detectUntaggedSockets() akan mendeteksi kapan aplikasi Anda menjalankan traffic jaringan tanpa menggunakan setThreadStatsTag(int) untuk menandai traffic guna keperluan proses debug.

Data yang di-cache

Android 8.0 memberikan panduan dan perilaku yang lebih baik mengenai data yang di-cache. Setiap aplikasi sekarang diberikan kuota ruang disk untuk data yang di-cache, seperti yang dikembalikan oleh getCacheQuotaBytes(UUID).

Bila sistem perlu mengosongkan ruang disk, sistem akan mulai dengan menghapus file cache dari aplikasi yang menggunakan alokasi kuota paling banyak. Sehingga, bila Anda menjaga data yang di-cache di bawah kuota yang dialokasikan, file yang di-cache Anda adalah yang paling terakhir dibersihkan sistem saat diperlukan. Ketika sistem memutuskan file yang di-cache mana yang dihapus dalam aplikasi Anda, sistem akan mempertimbangkan file terlama terlebih dahulu (sebagaimana ditentukan oleh waktu dimodifikasi).

Ada juga dua perilaku baru yang bisa Anda aktifkan dengan basis per-direktori untuk mengontrol cara sistem mengosongkan data yang di-cache:

  • StorageManager.setCacheBehaviorAtomic() bisa digunakan untuk menunjukkan bahwa sebuah direktori dan semua kontennya harus dihapus sebagai unit atomis tunggal.
  • setCacheBehaviorTombstone(File, boolean) bisa digunakan untuk menunjukkan bahwa sebagai ganti menghapus file dalam direktori, file harus dipangkas dengan panjang 0 byte, membiarkan file kosong tetap utuh.

Yang terakhir, ketika Anda harus mengalokasikan ruang disk untuk file besar, pertimbangkan untuk menggunakan allocateBytes(FileDescriptor, long) API baru, yang akan secara otomatis menghapus file cache milik aplikasi lain (bila diperlukan) untuk memenuhi permintaan Anda. Saat memutuskan apakah perangkat memiliki cukup ruang disk untuk menyimpan data baru, panggil getAllocatableBytes(UUID) sebagai ganti menggunakan getUsableSpace(), karena yang pertama akan mempertimbangkan data yang di-cache yang bersedia dihapus sistem untuk kepentingan Anda.

Paging penyedia konten

Kami telah meng-update penyedia konten agar menyertakan dukungan untuk memuat kumpulan data besar pada satu laman sekaligus. Misalnya, aplikasi foto dengan ribuan gambar bisa melakukan kueri untuk subset data agar ditampilkan di laman. Setiap laman hasil yang dikembalikan oleh penyedia materi direpresentasikan oleh objek Kursor tunggal. Baik klien maupun penyedia harus sama-sama mengimplementasikan paging untuk memanfaatkan fitur ini.

Untuk informasi detail tentang perubahan pada penyedia konten, lihat ContentProvider dan ContentProviderClient.

Permintaan pemuatan ulang konten

Sekarang kelas ContentProvider dan ContentResolver masing-masing menyertakan metode refresh(), sehingga memudahkan klien untuk mengetahui apakah informasi yang mereka minta adalah yang terbaru.

Anda bisa menambahkan logika yang memperbarui konten khusus dengan memperluas ContentProvider. Pastikan Anda mengganti metode refresh() untuk mengembalikan true, yang memberi tahu klien penyedia bahwa Anda telah berupaya memperbarui data sendiri.

Aplikasi klien Anda bisa secara eksplisit meminta konten diperbarui dengan memanggil metode lain, yang juga disebut refresh(). Saat memanggil metode ini, teruskan URI data yang akan diperbarui.

Catatan: Karena Anda mungkin meminta data melalui jaringan, Anda harus memanggil refresh() dari sisi klien saja bila ada indikasi kuat bahwa konten tersebut kedaluwarsa. Alasan paling umum untuk melakukan tipe pembaruan konten ini adalah sebagai respons terhadap gestur geser untuk perbarui, yang secara eksplisit meminta UI saat ini untuk menampilkan konten terbaru.

Peningkatan JobScheduler

Android 8.0 menambahkan beberapa peningkatan pada JobScheduler. Peningkatan ini memudahkan aplikasi Anda mematuhi batas eksekusi latar belakang baru, karena Anda secara umum bisa menggunakan tugas terjadwal untuk mengganti layanan latar belakang atau penerima siaran implisit yang sekarang terbatas.

Update untuk JobScheduler meliputi:

  • Sekarang Anda bisa menghubungkan antrean pekerjaan dengan tugas terjadwal. Untuk menambahkan item pekerjaan ke antrean tugas, panggil JobScheduler.enqueue(). Saat sedang berjalan, tugas bisa mengambil pekerjaan yang tertunda dari antrean dan memprosesnya. Fungsionalitas ini menangani banyak kasus penggunaan yang sebelumnya sudah dipanggil untuk memulai layanan latar belakang, khususnya layanan yang mengimplementasikan IntentService.
  • Sekarang Anda bisa memanggil JobInfo.Builder.setClipData() untuk menghubungkan sebuah ClipData dengan sebuah tugas. Opsi ini memungkinkan Anda menghubungkan pemberian izin URI dengan sebuah tugas, mirip dengan cara perluasan izin ini ke Context.startService(). Anda juga bisa menggunakan pemberian izin URI dengan intent pada antrean pekerjaan.
  • Tugas terjadwal sekarang mendukung sejumlah batasan baru:
    JobInfo.isRequireStorageNotLow()
    Tugas tidak bisa dijalankan jika penyimpanan perangkat yang tersedia sedikit.
    JobInfo.isRequireBatteryNotLow()
    Tugas tidak bisa dijalankan jika tingkat daya baterai berada pada atau di bawah ambang batas kritis; yaitu ketika perangkat menampilkan dialog sistem Peringatan baterai lemah.
    NETWORK_TYPE_METERED
    Tugas memerlukan koneksi jaringan berkuota, seperti kebanyakan paket kuota internet.

Penyimpanan data khusus

Android 8.0 memungkinkan Anda untuk menyediakan penyimpanan data khusus sesuai preferensi Anda, yang bisa berguna jika aplikasi Anda menyimpan preferensi tersebut di cloud atau database lokal, atau jika preferensi tersebut khusus-perangkat. Untuk informasi selengkapnya tentang mengimplementasikan penyimpanan data, lihat Penyimpanan Data Khusus.

Perubahan tanda tangan findViewById()

Semua instance metode findViewById() sekarang menampilkan <T extends View> T sebagai ganti View. Perubahan ini memiliki implikasi berikut:

  • Ini bisa menyebabkan kode yang ada memiliki tipe kembalian yang rancu, misalnya jika ada someMethod(View) dan someMethod(TextView) yang mengambil hasil dari panggilan ke findViewById().
  • Saat menggunakan bahasa sumber Java 8, diperlukan cast eksplisit ke View bila tipe kembalian tidak dibatasi (misalnya, assertNotNull(findViewById(...)).someViewMethod()).
  • Penggantian metode findViewById() non-final (misalnya, Activity.findViewById()) mengharuskan tipe kembaliannya di-update.

Penyempurnaan media

VolumeShaper

Terdapat kelas VolumeShaper baru. Anda bisa menggunakannya untuk melakukan transisi volume otomatis singkat seperti fade-in, fade-out, dan cross fade.

Penyempurnaan Fokus Audio

Aplikasi audio berbagi keluaran audio pada perangkat dengan meminta dan mengabaikan fokus audio. Aplikasi menangani perubahan di fokus dengan memulai atau menghentikan pemutaran, atau menurunkan volumenya. Terdapat kelas AudioFocusRequest baru. Dengan kelas ini, aplikasi memiliki kemampuan baru saat menangani perubahan dalam fokus audio: penurunan otomatis dan gain fokus tertunda.

Metrik media

Sebuah metode getMetrics() baru mengembalikan objek PersistableBundle yang berisi informasi konfigurasi dan kinerja, dinyatakan sebagai peta atribut dan nilai. Metode getMetrics() didefinisikan untuk kelas-kelas media ini:

Metrik dikumpulkan secara terpisah untuk setiap instance dan bertahan selama masa pakai instance. Jika tidak tersedia metrik, metode mengembalikan null. Metrik sebenarnya yang dikembalikan bergantung pada kelas.

MediaPlayer

Android 8.0 menambahkan sejumlah metode baru ke kelas MediaPlayer. Metode ini bisa meningkatkan penanganan pemutaran media di aplikasi Anda dengan sejumlah cara:

MediaPlayer sekarang mendukung enkripsi tingkat-sampel.

MediaRecorder

  • MediaRecorder sekarang mendukung format MPEG2_TS yang berguna untuk streaming:
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);

    lihat MediaRecorder.OutputFormat

  • MediaMuxer sekarang bisa menangani sejumlah aliran video dan audio. Anda tidak lagi terbatas pada satu trek audio dan/atau satu trek video. Gunakan addTrack() untuk mencampur sebanyak mungkin trek yang Anda suka.
  • MediaMuxer juga bisa menambahkan satu atau beberapa trek metadata berisikan informasi per-bingkai yang didefinisikan oleh pengguna. Format metadata didefinisikan oleh aplikasi Anda. Trek metadata hanya didukung untuk kontainer MP4.

Metadata bisa digunakan untuk pemrosesan offline. Misalnya, sinyal gyro dari sensor bisa digunakan untuk menjalankan stabilisasi video.

Saat menambahkan trek metadata, format mime trek harus dimulai dengan prefiks "application/". Menulis metadata ini sama seperti menulis data video/audio, namun datanya tidak berasal dari MediaCodec. Sebagai gantinya, aplikasi meneruskan ByteBuffer dengan stempel waktu yang berkaitan dengan metode writeSampleData(). Stempel waktu harus dalam basis waktu yang sama dengan trek video dan audio.

File MP4 yang dihasilkan menggunakan TextMetaDataSampleEntry didefinisikan dalam bagian 12.3.3.2 ISOBMFF untuk memberi sinyal format mime metadata. Saat menggunakan MediaExtractor untuk mengekstrak file dengan trek metadata, format MIME metadata akan diekstrak ke dalam MediaFormat.

Kontrol pemutaran audio

Android 8.0 memungkinkan Anda membuat kueri dan meminta cara perangkat menghasilkan sound. Aspek kontrol terhadap pemutaran audio berikut ini memudahkan layanan Anda untuk menghasilkan sound hanya pada kondisi perangkat yang menguntungkan.

Tipe penggunaan audio baru untuk Asisten Google

Kelas AudioAttributes berisi tipe sound baru, USAGE_ASSISTANT, sesuai dengan jawaban yang diucapkan Asisten Google pada sebuah perangkat.

Perubahan pada pemutaran audio perangkat

Jika ingin layanan Anda mulai menghasilkan sound hanya bila konfigurasi perangkat tertentu aktif, Anda bisa menggunakan kelas AudioManager untuk mendaftarkan instance AudioManager.AudioPlaybackCallback, yang metode onPlaybackConfigChanged() nya membantu Anda mengidentifikasi rangkaian atribut audio yang aktif saat ini.

Permintaan eksplisit untuk fokus audio

Layanan Anda bisa mengirimkan permintaan yang lebih detail untuk menerima fokus audio tingkat-perangkat dengan menggunakan metode requestAudioFocus(). Teruskan sebuah objek AudioFocusRequest, yang Anda buat menggunakan AudioFocusRequest.Builder. Dalam kelas builder ini, Anda bisa menetapkan opsi berikut:

  • Tipe fokus yang ingin Anda dapatkan, seperti AUDIOFOCUS_GAIN_TRANSIENT atau AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK.
  • Apakah layanan Anda akan melanjutkan lebih pelan atau berhenti sepenuhnya saat layanan audio lain mengambil alih fokus perangkat.
  • Apakah layanan Anda bisa menunggu untuk memperoleh fokus hingga perangkat siap.

Catatan: Saat membangun instance AudioFocusRequest, jika Anda menunjukkan bahwa layanan Anda bisa menunggu untuk menghasilkan sound dengan memanggil setAcceptsDelayedFocusGain(), Anda juga harus memanggil setOnAudioFocusChangeListener() sehingga layanan Anda tahu kapan bisa mulai menghasilkan sound.

Akses file media yang ditingkatkan

Storage Access Framework (SAF) memungkinkan aplikasi mengekspos DocumentsProvider khusus, yang bisa menyediakan akses ke berbagai file dalam sumber data ke aplikasi lain. Bahkan, penyedia dokumen bisa memberikan akses ke file yang berada pada penyimpanan jaringan atau yang menggunakan protokol seperti Media Transfer Protocol (MTP).

Akan tetapi, mengakses file media besar dari sumber data jauh memunculkan beberapa tantangan:

  • Pemutar media memerlukan akses yang bisa dicari ke file dari penyedia dokumen. Dalam kejadian saat file media besar berada pada sumber data jarak jauh, penyedia dokumen harus mengambil semua data terlebih dahulu dan membuat deskriptor file cuplikan. Pemutar media tidak bisa memutar file tanpa deskriptor file, sehingga pemutaran tidak bisa dimulai hingga penyedia dokumen selesai mendownload file tersebut.
  • Pengelola koleksi media, seperti aplikasi foto, harus melewati serangkaian akses URI untuk mencapai media yang tersimpan di kartu SD eksternal melalui folder cakupan. Pola akses ini membuat operasi massal di media—seperti memindahkan, menyalin, dan menghapus—menjadi lambat.
  • Pengelola koleksi media tidak bisa menentukan lokasi dokumen berdasarkan URI yang diberikan. Hal tersebut menyulitkan tipe aplikasi ini untuk memungkinkan pengguna memilih tempat menyimpan file media.

Android 8.0 mengatasi masing-masing tantangan ini dengan memperbaiki Storage Access Framework.

Penyedia dokumen khusus

Mulai Android 8.0, Storage Access Framework memungkinkan penyedia dokumen khusus membuat deskriptor file yang bisa dicari untuk file yang terletak di sumber data jauh. SAF bisa membuka file untuk mendapatkan deskriptor file bisa dicari native. SAF kemudian akan mengirim permintaan byte terpisah ke penyedia dokumen. Fitur ini memungkinkan penyedia dokumen untuk mengembalikan kisaran byte akurat yang telah diminta aplikasi pemutar media, sebagai ganti melakukan cache seluruh file terlebih dulu.

Untuk menggunakan fitur ini, Anda perlu memanggil metode StorageManager.openProxyFileDescriptor() yang baru. Metode openProxyFileDescriptor() menerima objek ProxyFileDescriptorCallback sebagai callback. SAF memanggil callback setiap kali aplikasi klien menjalankan operasi file pada deskriptor file yang dikembalikan dari penyedia dokumen.

Akses dokumen langsung

Mulai Android 8.0, Anda bisa menggunakan metode getDocumentUri() untuk mendapatkan URI yang mereferensikan dokumen yang sama seperti mediaUri yang diberikan. Akan tetapi, karena URI yang dikembalikan didukung oleh DocumentsProvider, pengelola koleksi media bisa mengakses dokumen secara langsung, tanpa harus menyusuri pohon direktori cakupan. Hasilnya, pengelola media bisa melakukan operasi file pada dokumen jauh lebih cepat.

Perhatian: Metode getDocumentUri() hanya mencari file media; dan tidak memberikan izin kepada aplikasi untuk mengakses file tersebut. Untuk mempelajari lebih lanjut tentang cara memperoleh izin akses ke file media, lihat dokumentasi referensi.

Lokasi menuju dokumen

Saat menggunakan Storage Access Framework di Android 8.0, Anda bisa menggunakan metode findDocumentPath(), yang tersedia dalam kelas DocumentsContract maupun DocumentsProvider, untuk menentukan lokasi dari akar sistem file ID dokumen yang diberikan. Metode ini mengembalikan lokasi tersebut dalam objek DocumentsContract.Path. Dalam hal suatu sistem file memiliki beberapa lokasi yang didefinisikan ke dokumen yang sama, metode ini mengembalikan lokasi yang paling sering digunakan untuk menuju dokumen dengan ID tersebut.

Fungsionalitas ini sangat berguna dalam skenario berikut:

  • Aplikasi Anda menggunakan sebuah dialog "save as" yang menampilkan lokasi dokumen tertentu.
  • Aplikasi Anda menampilkan folder dalam tampilan hasil penelusuran dan harus memuat dokumen anak yang berada dalam folder tertentu jika pengguna memilih folder tersebut.

Catatan: Jika aplikasi Anda memiliki izin hanya untuk mengakses beberapa dokumen saja di lokasi itu, maka nilai kembalian findDocumentPath() hanya meliputi folder dan dokumen yang bisa diakses oleh aplikasi Anda.

Konektivitas

Wi-Fi Aware

Android 8.0 menambahkan dukungan untuk Wi-Fi Aware, berdasarkan spesifikasi Neighbor Awareness Networking (NAN). Pada perangkat dengan perangkat keras Wi-Fi Aware yang sesuai, aplikasi dan perangkat di dekatnya bisa menemukan dan berkomunikasi melalui Wi-Fi tanpa jalur akses Internet. Kami bekerja sama dengan mitra perangkat keras untuk membawa teknologi Wi-Fi Aware ke perangkat secepatnya. Untuk informasi mengenai cara mengintegrasikan Wi-Fi Aware ke dalam aplikasi Anda, lihat Wi-Fi Aware.

Bluetooth

Android 8.0 memperkaya dukungan Bluetooth platform dengan menambahkan fitur-fitur berikut:

  • Dukungan untuk standar AVRCP 1.4, yang memungkinkan penjelajahan koleksi-lagu.
  • Dukungan untuk standar Bluetooth Low-Energy (BLE) 5.0.
  • Integrasi codec Sony LDAC ke dalam tumpukan Bluetooth.

Penyandingan perangkat pendamping

Android 8.0 menyediakan API yang memungkinkan Anda untuk menyesuaikan dialog permintaan penyambungan saat mencoba menyambungkan perangkat pendamping melalui Bluetooth, BLE, dan Wi-Fi. Untuk informasi selengkapnya, lihat Penyandingan Perangkat Pendamping.

Untuk informasi selengkapnya tentang menggunakan Bluetooth pada Android, lihat panduan Bluetooth. Untuk perubahan Bluetooth yang khusus pada Android 8.0, lihat bagian Bluetooth dari laman Perubahan Perilaku Android 8.0.

Berbagi

Berbagi secara cerdas

Android 8.0 mempelajari preferensi berbagi pengguna yang dipersonalisasi dan lebih memahami setiap tipe konten yang tepat untuk dibagikan oleh aplikasi. Misalnya, jika pengguna mengambil foto tanda terima, Android 8.0 bisa menyarankan aplikasi pelacakan biaya; jika pengguna membuat selfie, aplikasi media sosial bisa menangani gambar dengan lebih baik. Android 8.0 secara otomatis mempelajari semua pola ini sesuai dengan preferensi pengguna yang dipersonalisasi.

Berbagi secara cerdas bekerja untuk beberapa tipe konten selain image, seperti audio, video, text, URL, dll.

Untuk mengaktifkan Berbagi secara cerdas, tambahkan sebuah ArrayList hingga tiga anotasi string ke intent yang berbagi konten. Anotasi ini harus menjelaskan komponen atau topik utama dalam konten. Contoh kode berikut menampilkan cara menambahkan anotasi ke intent:

ArrayList<String> annotations = new ArrayList<>();

annotations.add("topic1");
annotations.add("topic2");
annotations.add("topic3");

intent.putStringArrayListExtra(
    Intent.EXTRA_CONTENT_ANNOTATIONS,
    annotations
);

Untuk informasi detail tentang anotasi Berbagi secara cerdas, lihat EXTRA_CONTENT_ANNOTATIONS.

Pemilihan teks cerdas

Pada perangkat yang kompatibel, Android 8.0 memungkinkan aplikasi membantu pengguna berinteraksi dengan teks dengan cara yang lebih mudah dipahami. Bila pengguna menekan-lama pada sebuah kata dalam entitas—format yang dikenali seperti alamat atau nama restoran, misalnya—maka sistem akan memilih seluruh entitas. Pengguna akan melihat toolbar mengambang yang mungkin meliputi aplikasi yang bisa menangani entitas teks yang dipilih. Misalnya, jika mengenali sebuah alamat, sistem bisa mengarahkan pengguna ke aplikasi Maps.

Pemilihan entitas yang dikenali oleh sistem meliputi alamat, URL, nomor telepon, dan alamat email. Untuk informasi selengkapnya, lihat TextClassifier.

Aksesibilitas

Android 8.0 mendukung fitur aksesibilitas berikut untuk developer yang membuat layanan aksesibilitas mereka sendiri: Untuk mempelajari lebih lanjut tentang cara membuat aplikasi Anda lebih mudah diakses, lihat Aksesibilitas.

Tombol aksesibilitas

Layanan aksesibilitas Anda sekarang bisa meminta agar tombol aksesibilitas ditampilkan dalam area navigasi sistem, yang memberi pengguna cara cepat mengaktifkan fungsionalitas layanan dari mana saja di perangkat mereka. Untuk melakukannya, tambahkan flag FLAG_REQUEST_ACCESSIBILITY_BUTTON di AccessibilityServiceInfo atribut android:accessibilityFlags objek. Kemudian Anda bisa mendaftarkan callback menggunakan registerAccessibilityButtonCallback().

Catatan: Fitur ini hanya tersedia pada perangkat yang menyediakan area navigasi yang dirender perangkat lunak. Gunakan selalu isAccessibilityButtonAvailable(), dan respons perubahan berdasarkan ketersediaan tombol aksesibilitas dengan mengimplementasikan onAvailabilityChanged(). Dengan demikian, pengguna selalu bisa mengakses fungsionalitas layanan Anda, meskipun tombol aksesibilitas tidak didukung atau menjadi tidak tersedia.

Penyesuaian volume independen

Android 8.0 memperkenalkan kategori volume STREAM_ACCESSIBILITY, yang memungkinkan Anda mengontrol volume dari keluaran audio layanan aksesibilitas secara independen dari sound lain pada perangkat.

Untuk menggunakan jenis streaming baru ini guna mengontrol volume aksesibilitas, setel opsi FLAG_ENABLE_ACCESSIBILITY_VOLUME dalam layanan aksesibilitas Anda. Kemudian Anda bisa mengubah volume audio aksesibilitas perangkat menggunakan adjustStreamVolume().

Gestur sidik jari

Layanan aksesibilitas Anda juga bisa merespons mekanisme masukan alternatif, gesek terarah (atas, bawah, kiri, dan kanan) bersama sensor sidik jari perangkat. Untuk menerima callback tentang interaksi ini, lakukan urutan langkah berikut:

  1. Deklarasikan izin USE_FINGERPRINT dan kemampuan CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES.
  2. Setel flag FLAG_REQUEST_FINGERPRINT_GESTURES dalam atribut android:accessibilityFlags.
  3. Daftarkan callback menggunakan registerFingerprintGestureCallback().

Ingatlah bahwa tidak semua perangkat menyertakan sensor sidik jari. Anda bisa menggunakan metode isHardwareDetected() untuk mengidentifikasi apakah sebuah perangkat mendukung sensor. Bahkan pada perangkat yang menyertakan sensor sidik jari, layanan Anda hanya bisa menggunakan sensor ketika tidak digunakan untuk autentikasi. Untuk mengidentifikasi saat sensor tersedia, panggil metode isGestureDetectionAvailable() dan implementasikan callback onGestureDetectionAvailabilityChanged().

Penyorotan tingkat-kata

Untuk menentukan lokasi karakter yang terlihat dalam objek TextView, Anda bisa meneruskan EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY sebagai argumen pertama ke refreshWithExtraData(). Objek Bundle, yang Anda berikan sebagai argumen kedua ke refreshWithExtraData(), kemudian diperbarui agar menyertakan larik objek Rect. Setiap objek Rect merepresentasikan kotak pembatas karakter tertentu.

Jika layanan Anda menggunakan objek TextToSpeech untuk mendikte konten yang muncul di layar, Anda bisa memperoleh informasi pengaturan waktu yang lebih akurat tentang kapan mesin teks-ke-ucapan mulai mengucapkan kata-kata sintesis individual, asalkan mesin teks-ke-ucapan menyediakan informasi ini. Bila mesin menunggu untuk mulai memainkan audio bagi kisaran teks tertentu, API teks-ke-ucapan memberi tahu layanan bahwa kemampuan berbicara untuk kisaran teks akan dimulai menggunakan metode onRangeStart().

Jika Anda membuat implementasi TextToSpeechService sendiri, Anda bisa mendukung fungsionalitas baru ini dengan menggunakan metode rangeStart().

Nilai kisaran satu-sisi terstandar

Beberapa instance AccessibilityNodeInfo menggunakan sebuah instance AccessibilityNodeInfo.RangeInfo untuk menunjukkan bahwa elemen UI bisa menggunakan satu kisaran nilai. Saat membuat kisaran menggunakan RangeInfo.obtain(), atau saat mengambil nilai ekstrem dari kisaran tersebut menggunakan getMin() dan getMax(), ingatlah bahwa Android 8.0 memiliki definisi standar untuk kisaran satu sisi:

Teks petunjuk

Android 8.0 menyertakan sejumlah metode untuk berinteraksi dengan teks petunjuk objek yang bisa diedit:

  • Metode isShowingHintText() dan setShowingHintText() menunjukkan dan menyetel, masing-masing, apakah konten teks node saat ini merepresentasikan teks petunjuk node. Jika tidak berisi teks yang bisa diedit, node tidak boleh berisi teks petunjuk.
  • Untuk mengakses teks petunjuk sendiri, gunakan getHintText(). Meskipun suatu objek saat ini tidak menampilkan teks petunjuk, panggilan ke getHintText() akan berhasil.

Penugasan gestur kontinu

Layanan Anda kini bisa menetapkan urutan gerakan yang dimiliki oleh gestur terprogram yang sama dengan menggunakan argumen akhir, willContinue, dalam konstruktor GestureDescription.StrokeDescription.

Keamanan & Privasi

Izin

Android 8.0 memperkenalkan sejumlah izin baru berkaitan dengan telepon:

  • Izin ANSWER_PHONE_CALLS memungkinkan aplikasi Anda menjawab panggilan telepon masuk lewat program. Untuk menangani panggilan telepon masuk di aplikasi, Anda bisa menggunakan metode acceptRingingCall().
  • Izin READ_PHONE_NUMBERS memberi akses kepada aplikasi Anda untuk membaca nomor telepon yang tersimpan pada sebuah perangkat.

Semua izin ini tergolong berbahaya dan merupakan bagian dari grup izin PHONE.

Akses akun baru dan API penemuan

Android 8.0 memperkenalkan sejumlah peningkatan pada cara aplikasi mendapatkan akses ke akun pengguna. Pada akun yang dikelolanya, autentikator bisa menggunakan kebijakan mereka sendiri untuk memutuskan apakah menyembunyikan akun dari, atau memberitahukan akun ke, sebuah aplikasi. Sistem Android melacak aplikasi yang bisa mengakses akun tertentu.

Dalam Android versi sebelumnya, aplikasi yang ingin melacak daftar akun pengguna harus mendapatkan pembaruan semua akun, termasuk akun dengan tipe yang tidak terkait. Android 8.0 menambahkan metode addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]), yang memungkinkan aplikasi menentukan daftar tipe akun untuk perubahan akun yang harus diterima.

Perubahan API

AccountManager menyediakan enam metode baru untuk membantu autentikator mengelola aplikasi yang bisa melihat akun:

Android 8.0 memperkenalkan dua nilai Nama Paket khusus untuk menetapkan tingkat visibilitas aplikasi yang tidak disetel menggunakan metode setAccountVisibility(android.accounts.Account, java.lang.String, int). Nilai visibilitas PACKAGE_NAME_KEY_LEGACY_VISIBLE diberlakukan untuk aplikasi yang memiliki izin GET_ACCOUNTS, dan menargetkan versi Android di bawah Android 8.0, atau yang tanda tangannya sesuai dengan autentikator yang menargetkan versi Android tertentu. PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE memberikan nilai visibilitas default untuk aplikasi yang tidak disetel sebelumnya dan saat PACKAGE_NAME_KEY_LEGACY_VISIBLE tidak berlaku.

Untuk informasi selengkapnya tentang akses akun baru dan API penemuan, lihat referensi untuk AccountManager dan OnAccountsUpdateListener.

Google Safe Browsing API

Kelas WebView kini menyertakan Safe Browsing API untuk menyempurnakan keamanan penjelajahan web. Untuk informasi selengkapnya, lihat API Google Safe Browsing.

Pengujian

Pengujian instrumentasi

Android 8.0 menyediakan beberapa dukungan tambahan berikut untuk pengujian instrumentasi aplikasi Anda.

Jalankan pada proses aplikasi non-default

Sekarang Anda bisa menetapkan bahwa pengujian instrumentasi tertentu harus dijalankan pada proses di luar proses default aplikasi. Konfigurasi ini berguna jika aplikasi Anda berisi aktivitas yang berjalan dalam beberapa proses berbeda.

Untuk mendefinisikan instrumentasi proses non-default, arahkan ke file manifes Anda, kemudian ke elemen <instrumentation> yang diinginkan. Tambahkan atribut android:targetProcess, dan setel dengan salah satu nilai berikut:

  • Nama proses tertentu.
  • Daftar nama proses yang dipisah koma
  • Karakter pengganti ("*"), yang memungkinkan instrumentasi untuk berjalan pada proses apa pun yang diluncurkan dan mengeksekusi kode dalam paket yang ditetapkan dalam atribut android:targetPackage.

Sementara mengeksekusi pengujian instrumentasi, Anda bisa memeriksa proses mana yang diujinya dengan memanggil getProcessName().

Laporkan hasil selama pengujian

Sekarang Anda bisa melaporkan hasil selagi pengujian instrumentasi sedang dieksekusi, bukan sesudahnya, dengan memanggil addResults().

Intent rekaan untuk pengujian

Agar lebih mudah dalam membuat pengujian UI yang independen dan terisolasi untuk aktivitas aplikasi Anda, Android 8.0 memperkenalkan metode onStartActivity(). Anda mengganti metode ini dalam subkelas khusus dari kelas Instrumentation.ActivityMonitor untuk menangani intent tertentu yang dipanggil oleh kelas pengujian Anda.

Bila kelas pengujian Anda memanggil intent itu, metode tersebut akan mengembalikan sebuah objek Instrumentation.ActivityResult stub sebagai ganti mengeksekusi intent itu sendiri. Dengan menggunakan logika intent rekaan ini dalam pengujian, Anda bisa berfokus pada bagaimana aktivitas Anda mempersiapkan dan menangani intent yang Anda teruskan pada aktivitas yang berbeda atau aplikasi yang benar-benar berbeda.

Waktu Proses & Fitur

Optimalisasi platform

Android 8.0 membawa waktu proses dan optimalisasi lainnya ke platform yang menghasilkan sejumlah peningkatan kinerja. Optimalisasi ini meliputi pengumpulan sampah sekaligus pemadatan, penggunaan memori yang lebih efisien, dan lokalitas kode.

Optimalisasi ini menghasilkan waktu booting yang lebih cepat, serta kinerja yang lebih baik dalam OS dan aplikasi.

Dukungan Java yang diperbarui

Android 8.0 menambahkan dukungan untuk sejumlah OpenJDK Java API tambahan:

Untuk mempelajari lebih lanjut tentang kelas dan metode di dalam paket yang baru ditambahkan ini, lihat dokumentasi referensi API.

Jika Anda ingin menggunakan fitur bahasa Java 8 dalam Android Studio, Anda harus mendownload versi pratinjau terbaru.

ICU4J Android Framework API yang diperbarui

Android 8.0 memperluas ICU4J Android Framework API—yang merupakan subset ICU4J API—bagi developer aplikasi untuk digunakan pada paket android.icu. Semua API ini menggunakan data pelokalan yang ada pada perangkat, sehingga Anda bisa mengurangi footprint APK dengan tidak mengompilasi koleksi ICU4J di APK Anda.

Tabel 1. Versi ICU, CLDR, dan Unicode yang digunakan di Android.

Level Android API Versi ICU Versi CLDR Versi Unicode
Android 7.0 (API level 24), Android 7.1 (API level 25) 56 28 8.0
Android 8.0 58.2 30.0.3 9.0
Untuk mempelajari lebih lanjut tentang update pada ICU4J API yang didukung, baca catatan rilis.

Android enterprise

Fitur dan API enterprise baru telah diperkenalkan untuk perangkat yang menjalankan Android 8.0. Pokok-pokoknya meliputi hal-hal berikut:

  • Profil kerja pada perangkat yang dikelola sepenuhnya memungkinkan perusahaan memisahkan data pekerjaan dan data pribadi, sekaligus mengelola keduanya.
  • Delegasi API memungkinkan pemilik perangkat dan pemilik profil untuk menugaskan pengelolaan aplikasi ke aplikasi lain.
  • Peningkatan pengalaman pengguna dalam alur penyediaan (termasuk opsi penyesuaian baru) mengurangi waktu persiapan.
  • Kontrol baru atas Bluetooth, Wi-Fi, backup, dan keamanan memungkinkan perusahaan mengelola lebih banyak perangkat. Pencatatan log aktivitas jaringan membantu perusahaan melacak masalah.

Untuk mempelajari lebih lanjut tentang hal ini serta fitur dan API enterprise Android baru, lihat Android di Enterprise.