Fitur dan API Android 8.0

Android 8.0 (API level 26) memperkenalkan berbagai fitur dan kemampuan baru bagi pengguna dan developer. Dokumen ini merangkum apa saja yang baru untuk developer.

Pastikan Anda juga melihat Perubahan Perilaku Android 8.0 untuk mempelajari area mana saja pada aplikasi Anda yang dapat terpengaruh oleh perubahan platform.

Pengalaman Pengguna

Mode Gambar-dalam-Gambar

Picture-in-picture di Android 8.0.

Android 8.0 (API level 26) memungkinkan peluncuran aktivitas dalam mode picture-in-picture (PIP). PIP adalah jenis khusus mode multi-aplikasi yang sebagian besar digunakan untuk pemutaran video. Mode PIP awalnya hanya tersedia untuk Android TV; Android 8.0 menyediakan fitur ini di perangkat Android lainnya.

Saat dalam mode PIP, aktivitas berada dalam status dijeda, tetapi harus terus menampilkan konten. Oleh karena itu, Anda harus memastikan aplikasi tidak menjeda pemutaran di pengendali onPause(). Sebagai gantinya, Anda harus menjeda video di onStop(), dan melanjutkan pemutaran di onStart(). Untuk informasi selengkapnya, lihat Siklus Proses Multi-Aplikasi.

Untuk menentukan agar aktivitas Anda dapat menggunakan mode PIP, setel android:supportsPictureInPicture ke true dalam manifes. (Mulai Android 8.0, PIP tidak memerlukan atribut manifes android:resizeableActivity. Namun, Anda harus menyetel android:resizeableActivity ke `true` jika aktivitas mendukung mode multi-aplikasi lainnya.)

Android 8.0 (API level 26) memperkenalkan objek baru, PictureInPictureParams, yang Anda teruskan ke metode PIP untuk menentukan perilaku aktivitas saat berada dalam mode PIP. Objek ini menentukan properti seperti rasio aspek pilihan aktivitas.

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

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

    Aktivitas yang ditetapkan ditempatkan di sudut layar; sisa layar akan diisi dengan aktivitas sebelumnya yang ada di layar. Aktivitas yang memasuki mode PIP beralih ke status dijeda, tetapi akan tetap dimulai. Jika pengguna mengetuk aktivitas PIP, sistem akan menampilkan menu untuk berinteraksi dengan pengguna; tidak ada peristiwa sentuh yang mencapai aktivitas saat dalam status PIP.

  • Activity.setPictureInPictureParams(): Memperbarui setelan konfigurasi PIP aktivitas. Jika aktivitas saat ini berada dalam mode PIP, setelan akan diperbarui; ini berguna jika rasio aspek aktivitas berubah. Jika aktivitas tersebut tidak dalam mode PIP, setelan konfigurasi ini akan digunakan terlepas dari metode enterPictureInPictureMode() yang Anda panggil.

Notifikasi

Di Android 8.0 (API level 26), kami telah mendesain ulang notifikasi untuk memberikan cara yang lebih mudah dan konsisten untuk mengelola perilaku notifikasi dan setelan. Perubahan ini mencakup:

    Menu penekanan lama notifikasi di Android 8.0 (API level 26).

    Pengguna dapat menekan lama ikon peluncur aplikasi untuk melihat notifikasi di Android 8.0.

  • Saluran notifikasi: Android 8.0 memperkenalkan saluran notifikasi yang memungkinkan Anda membuat saluran yang dapat disesuaikan pengguna untuk setiap jenis notifikasi yang ingin ditampilkan. Antarmuka pengguna merujuk ke saluran notifikasi sebagai kategori notifikasi. Untuk mempelajari cara mengimplementasikan saluran notifikasi, lihat Mengelola saluran notifikasi.
  • Titik notifikasi: Android 8.0 memperkenalkan dukungan untuk menampilkan titik, atau badge, pada ikon peluncur aplikasi. Titik notifikasi mencerminkan kehadiran notifikasi yang belum ditutup atau ditindaklanjuti oleh pengguna. Untuk mempelajari cara menangani titik notifikasi, lihat Badge notifikasi.
  • Menunda: Pengguna dapat menunda notifikasi, yang menyebabkan notifikasi menghilang selama jangka waktu tertentu sebelum muncul kembali. Notifikasi akan muncul kembali dengan tingkat kepentingan yang sama seperti yang muncul pertama kali. Aplikasi dapat menghapus atau memperbarui notifikasi yang ditunda, tetapi memperbarui notifikasi yang ditunda tidak akan menyebabkannya muncul kembali.
  • Waktu tunggu notifikasi: Anda dapat menyetel waktu tunggu saat membuat notifikasi menggunakan setTimeoutAfter(). Anda dapat menggunakan metode ini untuk menentukan durasi sebelum notifikasi harus dibatalkan. Jika diperlukan, Anda dapat membatalkan notifikasi sebelum durasi waktu tunggu yang ditetapkan berlalu.
  • Setelan notifikasi: Anda dapat memanggil setSettingsText() untuk menetapkan teks yang muncul saat Anda membuat link ke setelan notifikasi aplikasi dari notifikasi menggunakan intent Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES. Sistem dapat menyediakan tambahan berikut dengan intent untuk memfilter setelan yang harus ditampilkan aplikasi Anda kepada pengguna: EXTRA_CHANNEL_ID, NOTIFICATION_TAG, dan NOTIFICATION_ID.
  • Penutupan notifikasi: Pengguna dapat menutup notifikasi itu sendiri, dan aplikasi dapat menghapusnya secara terprogram. Anda dapat mengetahui kapan notifikasi ditutup dan alasan notifikasi ditutup dengan mengimplementasikan metode onNotificationRemoved() dari class NotificationListenerService.
  • Warna latar belakang: Anda dapat menyetel dan mengaktifkan warna latar belakang untuk notifikasi. Anda sebaiknya hanya menggunakan fitur ini dalam notifikasi untuk tugas yang sedang berlangsung dan penting untuk dilihat secara sekilas oleh pengguna. Misalnya, Anda dapat menyetel warna latar belakang untuk notifikasi yang terkait dengan rute mobil, atau panggilan telepon yang sedang berlangsung. Anda juga dapat menetapkan warna latar belakang yang diinginkan menggunakan setColor(). Hal itu memungkinkan Anda menggunakan setColorized() untuk mengaktifkan penggunaan warna latar belakang untuk notifikasi.
  • Gaya pesan: Di Android 8.0, notifikasi yang menggunakan class MessagingStyle menampilkan lebih banyak konten dalam bentuk yang diciutkan. Anda harus menggunakan class MessagingStyle untuk notifikasi yang berkaitan dengan pesan. Anda juga dapat menggunakan metode addHistoricMessage() untuk memberikan konteks pada percakapan dengan menambahkan pesan historis ke notifikasi terkait pesan.

Framework isi otomatis

Pembuatan akun, login, dan transaksi kartu kredit membutuhkan waktu dan rentan terhadap error. Pengguna dapat mudah merasa kesal dengan aplikasi yang memerlukan jenis tugas berulang ini.

Android 8.0 (API level 26) mempermudah pengisian formulir, seperti login dan formulir kartu kredit, dengan diperkenalkannya Framework Isi Otomatis. Aplikasi yang sudah ada dan yang baru berfungsi dengan Framework Isi Otomatis setelah pengguna memilih untuk mengisi otomatis.

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

Font yang dapat didownload

Android 8.0 (API level 26) dan Android Support Library 26 memungkinkan Anda meminta font dari aplikasi penyedia, bukan memaketkan font ke dalam APK atau membiarkan APK mendownload font. Fitur ini mengurangi ukuran APK Anda, meningkatkan tingkat keberhasilan penginstalan aplikasi, dan memungkinkan beberapa aplikasi berbagi font yang sama.

Untuk mengetahui informasi selengkapnya tentang cara mendownload font, lihat Font yang Dapat Didownload.

Font dalam XML

Android 8.0 (API level 26) memperkenalkan fitur baru, yaitu Font dalam XML, yang memungkinkan Anda menggunakan font sebagai resource. Artinya, Anda tidak perlu memaketkan font sebagai aset. Font dikompilasi dalam file R dan tersedia secara otomatis dalam sistem sebagai resource. Anda kemudian dapat mengakses font ini dengan bantuan jenis resource baru, font.

Support Library 26 memberikan dukungan penuh ke fitur ini pada perangkat yang menjalankan API versi 14 dan yang lebih baru.

Untuk mengetahui informasi selengkapnya, tentang cara menggunakan font sebagai resource dan mengambil font sistem, lihat Font dalam XML.

Pengubahan Ukuran Otomatis TextView

Android 8.0 (API level 26) memungkinkan Anda menyetel ukuran teks agar diluaskan atau dikontrak secara otomatis berdasarkan ukuran TextView. Artinya, akan jauh lebih mudah untuk mengoptimalkan ukuran teks pada layar yang berbeda atau dengan konten dinamis. Untuk informasi selengkapnya, tentang pengubahan ukuran otomatis TextView di Android 8.0, lihat Pengubahan Ukuran Otomatis TextView.

Ikon adaptif

Android 8.0 (API level 26) memperkenalkan ikon peluncur adaptif. Ikon adaptif mendukung efek visual, dan dapat menampilkan beragam bentuk di berbagai model perangkat. Untuk mempelajari cara membuat ikon adaptif, lihat panduan Ikon Adaptif.

Manajemen warna

Developer Android untuk aplikasi pencitraan kini dapat memanfaatkan perangkat baru yang memiliki layar berkemampuan warna gamut luas. Untuk menampilkan gambar wide gamut, aplikasi harus mengaktifkan tanda dalam manifesnya (per aktivitas) dan memuat bitmap dengan profil warna lebar yang disematkan (AdobeRGB, Pro Photo RGB, DCI-P3, dll.).

WebView API

Android 8.0 menyediakan beberapa API untuk membantu Anda mengelola objek WebView yang menampilkan konten web di aplikasi Anda. API ini, yang meningkatkan stabilitas dan keamanan aplikasi, meliputi hal berikut:

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

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

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

Penyematan pintasan dan widget

Android 8.0 (API level 26) memperkenalkan penyematan dalam aplikasi untuk pintasan dan widget. Di aplikasi, Anda dapat membuat widget dan pintasan tersemat untuk peluncur yang didukung, sesuai dengan izin pengguna.

Untuk mengetahui informasi selengkapnya, baca panduan fitur Menyematkan Pintasan dan Widget.

Rasio aspek layar maksimum

Android 8.0 (API level 26) menghadirkan perubahan pada cara mengonfigurasi rasio aspek maksimum aplikasi.

Pertama, Android 8.0 memperkenalkan atribut maxAspectRatio, yang dapat digunakan untuk menyetel rasio aspek maksimum aplikasi Anda. Selain itu, di Android 8.0 dan yang lebih tinggi, rasio aspek maksimum default aplikasi adalah rasio aspek native dari perangkat tempat aplikasi berjalan.

Untuk mengetahui informasi selengkapnya tentang mendeklarasikan rasio aspek maksimum, lihat Mendukung Beberapa Layar.

Dukungan multi-tampilan

Mulai Android 8.0 (API level 26), platform ini menawarkan dukungan yang ditingkatkan untuk beberapa tampilan. Jika suatu aktivitas mendukung mode multi-aplikasi dan berjalan pada perangkat dengan beberapa tampilan, pengguna dapat memindahkan aktivitas dari satu tampilan ke tampilan lainnya. Saat meluncurkan aktivitas, aplikasi dapat menentukan di tampilan mana aktivitas harus dijalankan.

Catatan: Jika suatu aktivitas mendukung mode multi-aplikasi, Android 8.0 secara otomatis akan mengaktifkan dukungan multi-tampilan untuk aktivitas tersebut. Anda harus menguji aplikasi untuk memastikannya berfungsi secara memadai di lingkungan multi-tampilan.

Hanya satu aktivitas pada satu waktu yang bisa berada dalam status dilanjutkan, meskipun aplikasi memiliki beberapa tampilan. Aktivitas dengan fokus berada dalam status dilanjutkan; semua aktivitas lain yang terlihat akan dijeda, tetapi tidak dihentikan. Untuk informasi selengkapnya tentang siklus proses aktivitas ketika beberapa aktivitas terlihat, lihat Siklus Proses Multi-Aplikasi.

Saat pengguna memindahkan aktivitas dari satu tampilan ke tampilan lainnya, sistem akan mengubah ukuran aktivitas dan mengeluarkan perubahan runtime sesuai kebutuhan. Aktivitas Anda dapat menangani perubahan konfigurasinya sendiri, atau dapat mengizinkan sistem menghancurkan proses yang berisi aktivitas Anda dan membuatnya kembali dengan dimensi baru. Untuk mengetahui informasi selengkapnya, lihat Menangani Perubahan Konfigurasi.

ActivityOptions menyediakan dua metode baru untuk mendukung beberapa tampilan:

setLaunchDisplayId()
Menentukan tampilan aktivitas yang harus ditampilkan pada saat diluncurkan.
getLaunchDisplayId()
Menampilkan tampilan peluncuran aktivitas saat ini.

Shell adb diperluas untuk mendukung multitampilan. Perintah shell start sekarang dapat digunakan untuk meluncurkan aktivitas dan menentukan tampilan target aktivitas:

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

Margin layout gabungan dan pengisi

Android 8.0 (API level 26) memudahkan Anda menentukan situasi saat sisi yang berlawanan dari elemen View menggunakan margin atau padding yang sama. Secara khusus, sekarang Anda dapat menggunakan atribut berikut dalam file XML tata letak:

Catatan: Jika Anda menyesuaikan logika aplikasi untuk mendukung berbagai bahasa dan budaya, termasuk arah teks, perlu diingat bahwa atribut ini tidak memengaruhi nilai layout_marginStart, layout_marginEnd, paddingStart, atau paddingEnd. Anda dapat menetapkan nilai ini sendiri, selain atribut tata letak vertikal dan horizontal yang baru, untuk membuat perilaku tata letak yang bergantung pada arah teks.

Rekaman pointer

Beberapa aplikasi, seperti game, desktop jarak jauh, dan klien virtualisasi, sangat diuntungkan dengan kontrol kursor mouse. Rekaman pointer adalah fitur baru di Android 8.0 (API level 26) yang menyediakan kontrol tersebut dengan mengirimkan semua peristiwa mouse ke tampilan yang difokuskan di aplikasi Anda.

Mulai dari Android 8.0, View di aplikasi Anda dapat meminta rekaman pointer dan menentukan pemroses untuk memproses peristiwa pointer yang direkam. Pointer mouse disembunyikan saat berada dalam mode ini. Tampilan ini dapat merilis rekaman pointer saat tidak memerlukan informasi mouse lagi. Sistem juga dapat merilis tangkapan pointer saat tampilan kehilangan fokus, misalnya, saat pengguna membuka aplikasi lain.

Untuk mengetahui informasi tentang cara menggunakan fitur ini di aplikasi Anda, baca Rekaman pointer.

Kategori aplikasi

Android 8.0 (API level 26) memungkinkan setiap aplikasi untuk mendeklarasikan kategori yang cocok dengannya, jika relevan. Kategori ini digunakan untuk mengelompokkan aplikasi dengan tujuan atau fungsi yang serupa saat menampilkannya kepada pengguna, seperti dalam Penggunaan Data, Penggunaan Baterai, atau Penggunaan Penyimpanan. Anda dapat menentukan kategori aplikasi dengan menetapkan atribut android:appCategory dalam tag manifes <application>.

Peluncur Android TV

Android 8.0 (API level 26) menyertakan pengalaman layar utama Android TV yang berorientasi konten baru, yang tersedia dengan emulator Android TV dan image perangkat Nexus Player untuk Android 8.0. Layar utama baru mengatur konten video dalam baris yang sesuai dengan saluran, yang masing-masing diisi dengan program oleh aplikasi pada sistem. Aplikasi dapat memublikasikan beberapa saluran, dan pengguna dapat mengonfigurasi saluran mana yang ingin mereka lihat di layar utama. Layar utama Android TV juga menyertakan baris Tonton Berikutnya, yang diisi dengan program dari aplikasi, berdasarkan kebiasaan menonton pengguna. Aplikasi juga dapat menyediakan pratinjau video, yang otomatis diputar saat pengguna berfokus pada suatu program. API untuk mengisi saluran dan program merupakan bagian dari TvProvider API, yang didistribusikan sebagai modul Support Library Android dengan Android 8.0.

AnimatorSet

Mulai Android 8.0 (API level 26), AnimatorSet API kini mendukung pencarian dan pemutaran secara terbalik. Pencarian memungkinkan Anda menyetel posisi animasi yang disetel ke titik waktu tertentu. Memutar secara terbalik berguna jika aplikasi Anda menyertakan animasi untuk tindakan yang dapat diurungkan. Daripada menentukan dua set animasi terpisah, Anda dapat memutar animasi yang sama secara terbalik.

Masukan dan navigasi

Kluster navigasi keyboard

Jika suatu aktivitas di aplikasi Anda menggunakan hierarki tampilan yang kompleks, seperti yang ada di Gambar 2, pertimbangkan untuk mengatur grup elemen UI ke dalam cluster untuk memudahkan navigasi keyboard di antara elemen tersebut. Pengguna dapat menekan Meta+Tab, atau Search+Tab di perangkat Chromebook, untuk bernavigasi dari satu cluster ke cluster lain. Contoh cluster yang baik meliputi: panel samping, menu navigasi, area konten utama, dan elemen yang dapat berisi banyak elemen turunan.

Contoh aktivitas yang menyertakan lima cluster navigasi yang dapat dinavigasi oleh
  pengguna menggunakan pintasan cluster navigasi keyboard. Cluster
  muncul dalam susunan berikut: panel atas, panel samping kiri, area konten
  utama, panel bawah, dan tombol tindakan mengambang.
Gambar 2. Aktivitas yang berisi 5 cluster navigasi

Untuk membuat elemen View atau ViewGroup sebagai cluster, tetapkan atribut android:keyboardNavigationCluster ke true dalam file XML tata letak elemen, atau teruskan true ke setKeyboardNavigationCluster() dalam logika UI aplikasi Anda.

Catatan: Cluster tidak dapat disusun bertingkat, meskipun cluster yang tidak bertingkat dapat muncul pada level hierarki yang berbeda. Jika Anda mencoba menyusun bertingkat cluster, framework hanya akan memperlakukan elemen ViewGroup teratas sebagai cluster.

Pada perangkat yang memiliki layar sentuh, Anda dapat menyetel elemen android:touchscreenBlocksFocus objek ViewGroup yang ditetapkan cluster ke true untuk mengizinkan navigasi khusus cluster ke dalam dan ke luar cluster tersebut. Jika Anda menerapkan konfigurasi ini ke cluster, pengguna tidak dapat menggunakan tombol Tab atau tombol panah untuk membuka atau keluar dari cluster. Mereka harus menekan kombinasi keyboard navigasi cluster.

Fokus default tampilan

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

Output ucapan

Aktivitas dan layanan dapat menggunakan instance TextToSpeech untuk mendikte dan mengucapkan konten. Mulai Android 8.0 (API level 26), aplikasi Anda dapat memperoleh informasi pengaturan waktu yang lebih tepat tentang kapan mesin text-to-speech mulai mengucapkan kata yang disintesis satu per satu, selama mesin menyediakan informasi ini. Anda dapat menggunakan fungsi ini untuk menarik perhatian pada kata tertentu saat mesin text-to-speech mengucapkannya.

Untuk menggunakan peningkatan mesin text-to-speech ini di aplikasi Anda, daftarkan instance UtteranceProgressListener. Sebagai bagian dari proses pendaftaran, sertakan pengendali untuk metode onRangeStart().

Mesin text-to-speech memanggil rangeStart() untuk merekam titik waktu saat diharapkan pemutaran audio dari rentang teks tertentu akan dimulai. Saat audio untuk rentang teks tersebut memulai pemutaran, metode onRangeStart() aplikasi Anda akan dieksekusi. Aplikasi Anda kemudian dapat merespons callback ini, misalnya dengan menandai rentang teks yang terkait dengan ucapan tersebut.

Untuk mengetahui informasi selengkapnya tentang pelacakan progres pemutaran mesin text-to-speech, lihat referensi class UtteranceProgressListener.

Sistem

Detektor StrictMode baru

Android 8.0 (API level 26) menambahkan tiga detektor StrictMode baru untuk membantu mengidentifikasi potensi bug dalam aplikasi Anda:

  • detectUnbufferedIo() akan mendeteksi saat aplikasi Anda membaca atau menulis data tanpa buffering, yang dapat berdampak signifikan pada performa.
  • detectContentUriWithoutPermission() akan mendeteksi saat aplikasi Anda tidak sengaja lupa untuk memberikan izin ke aplikasi lain saat memulai Aktivitas di luar aplikasi Anda.
  • detectUntaggedSockets() akan mendeteksi saat aplikasi Anda menjalankan traffic jaringan tanpa menggunakan setThreadStatsTag(int) untuk memberi tag pada traffic untuk tujuan proses debug.

Data dalam cache

Android 8.0 (API level 26) memberikan panduan dan perilaku yang lebih baik seputar data yang di-cache. Setiap aplikasi kini diberi kuota ruang disk untuk data yang di-cache, seperti yang ditampilkan oleh getCacheQuotaBytes(UUID).

Jika perlu mengosongkan ruang disk, sistem akan memulai dengan menghapus file yang di-cache dari aplikasi yang memiliki penggunaan melebihi kuota yang dialokasikan. Jadi, jika Anda menyimpan data yang di-cache di bawah kuota yang dialokasikan, file yang di-cache Anda akan menjadi file terakhir yang dihapus di sistem jika diperlukan. Saat menentukan file yang di-cache yang akan dihapus dalam aplikasi, sistem akan mempertimbangkan file terlama terlebih dahulu (sebagaimana ditentukan oleh waktu yang diubah).

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

  • StorageManager.setCacheBehaviorAtomic() dapat digunakan untuk menunjukkan bahwa direktori dan semua kontennya harus dihapus sebagai unit atom tunggal.
  • setCacheBehaviorTombstone(File, boolean) dapat digunakan untuk menunjukkan bahwa alih-alih menghapus file di dalam direktori, file tersebut harus dipotong dengan panjang 0 byte, membiarkan file kosong tetap utuh.

Terakhir, saat Anda perlu mengalokasikan ruang disk untuk file besar, pertimbangkan untuk menggunakan allocateBytes(FileDescriptor, long) API baru, yang akan otomatis menghapus file cache milik aplikasi lain (jika diperlukan) guna memenuhi permintaan Anda. Saat menentukan apakah perangkat memiliki ruang disk yang cukup untuk menyimpan data baru, panggil getAllocatableBytes(UUID), bukan menggunakan getUsableSpace(), karena yang pertama akan mempertimbangkan data yang di-cache yang ingin dihapus oleh sistem untuk Anda.

Paging penyedia konten

Kami telah memperbarui penyedia konten agar menyertakan dukungan untuk memuat set data besar, satu halaman dalam satu waktu. Misalnya, aplikasi foto dengan ribuan gambar dapat membuat kueri untuk subkumpulan data agar ditampilkan di halaman. Setiap halaman hasil yang ditampilkan oleh penyedia konten direpresentasikan oleh satu objek Cursor. Klien dan penyedia harus mengimplementasikan paging untuk memanfaatkan fitur ini.

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

Permintaan pemuatan ulang konten

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

Anda dapat menambahkan logika pemuatan ulang konten kustom dengan memperluas ContentProvider. Pastikan Anda mengganti metode refresh() untuk menampilkan true, yang menunjukkan kepada klien penyedia bahwa Anda telah mencoba memuat ulang data sendiri.

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

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

Peningkatan JobScheduler

Android 8.0 (API level 26) memperkenalkan sejumlah peningkatan pada JobScheduler. Peningkatan ini mempermudah aplikasi Anda untuk mematuhi batas eksekusi latar belakang yang baru, karena umumnya Anda dapat menggunakan tugas terjadwal untuk menggantikan layanan latar belakang atau penerima siaran implisit yang kini dibatasi.

Update untuk JobScheduler mencakup:

  • Sekarang Anda bisa menghubungkan antrean pekerjaan dengan tugas terjadwal. Untuk menambahkan item tugas ke antrean tugas, panggil JobScheduler.enqueue(). Saat sedang berjalan, tugas bisa mengambil pekerjaan yang tertunda dari antrean dan memprosesnya. Fungsi ini menangani banyak kasus penggunaan yang sebelumnya harus dipanggil untuk memulai layanan latar belakang, khususnya layanan yang menerapkan IntentService.
  • Android Support Library 26.0.0 memperkenalkan class JobIntentService baru, yang menyediakan fungsi yang sama seperti IntentService tetapi menggunakan tugas, bukan layanan saat berjalan di Android 8.0 (API level 26) atau yang lebih baru.
  • Sekarang Anda dapat memanggil JobInfo.Builder.setClipData() untuk mengaitkan ClipData dengan tugas. Opsi ini memungkinkan Anda mengaitkan pemberian izin URI dengan tugas, serupa dengan cara izin ini dapat disebarkan ke Context.startService(). Anda juga dapat menggunakan pemberian izin URI dengan intent pada antrean pekerjaan.
  • Tugas terjadwal kini mendukung beberapa batasan baru:
    JobInfo.isRequireStorageNotLow()
    Tugas tidak berjalan jika penyimpanan yang tersedia di perangkat hampir penuh.
    JobInfo.isRequireBatteryNotLow()
    Tugas tidak berjalan jika level baterai berada pada atau di bawah batas kritis; ini adalah level saat perangkat menampilkan dialog sistem Peringatan baterai rendah.
    NETWORK_TYPE_METERED
    Tugas memerlukan koneksi jaringan berkuota, seperti kebanyakan paket data seluler.

Penyimpanan data khusus

Android 8.0 (API level 26) memungkinkan Anda menyediakan penyimpanan data kustom sesuai preferensi, yang dapat berguna jika aplikasi Anda menyimpan preferensi di cloud atau database lokal, atau jika preferensi tersebut khusus perangkat. Untuk informasi selengkapnya tentang menerapkan penyimpanan data, lihat Penyimpanan Data Khusus.

Penyempurnaan media

VolumeShaper

Ada class VolumeShaper baru. Gunakan fitur ini untuk melakukan transisi volume otomatis singkat seperti fade-in, fade-out, dan cross fade. Lihat Mengontrol Amplitudo dengan VolumeShaper untuk mempelajari lebih lanjut.

Peningkatan 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. Ada class AudioFocusRequest baru. Dengan menggunakan class ini sebagai parameter requestAudioFocus(), aplikasi memiliki kemampuan baru saat menangani perubahan dalam fokus audio: pengecilan volume otomatis dan penambahan fokus tertunda.

Metrik media

Metode getMetrics() baru menampilkan objek PersistableBundle yang berisi informasi konfigurasi dan performa, yang dinyatakan sebagai peta atribut dan nilai. Metode getMetrics() ditentukan untuk class media berikut:

Metrik dikumpulkan secara terpisah untuk setiap instance dan bertahan selama masa aktif instance. Jika tidak ada metrik yang tersedia, metode akan menampilkan null. Metrik sebenarnya yang ditampilkan bergantung pada class-nya.

MediaPlayer

Mulai Android 8.0 (API level 26), MediaPlayer dapat memutar materi yang dilindungi DRM dan media terenkripsi level sampel HLS.

Android 8.0 memperkenalkan perintah baru seekTo() yang kelebihan beban yang memberikan kontrol terperinci saat melakukan pencarian ke frame. Cuplikan ini menyertakan parameter kedua yang menentukan mode pencarian:

  • SEEK_PREVIOUS_SYNC memindahkan posisi media ke frame sinkronisasi (atau kunci) yang terkait dengan sumber data yang terletak tepat sebelum atau pada waktu tertentu.
  • SEEK_NEXT_SYNC memindahkan posisi media ke frame sinkronisasi (atau kunci) yang terkait dengan sumber data yang terletak tepat setelah atau pada waktu tertentu.
  • SEEK_CLOSEST_SYNC memindahkan posisi media ke frame sinkronisasi (atau kunci) yang terkait dengan sumber data yang terletak terdekat dengan atau pada waktu tertentu.
  • SEEK_CLOSEST memindahkan posisi media ke frame (tidak harus sinkronisasi atau frame kunci) yang terkait dengan sumber data yang terletak terdekat dengan atau pada waktu tertentu.

Saat mencari secara terus-menerus, aplikasi harus menggunakan salah satu mode SEEK_, bukan SEEK_CLOSEST, yang berjalan relatif lebih lambat tetapi bisa lebih akurat.

MediaRecorder

  • MediaRecorder kini mendukung format MPEG2_TS yang berguna untuk streaming:

    Kotlin

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)
    

    Java

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
    

    lihat MediaRecorder.OutputFormat

  • MediaMuxer kini dapat menangani sejumlah streaming audio dan video. Anda tidak lagi dibatasi pada satu trek audio dan/atau satu trek video. Gunakan addTrack() untuk mencampur sebanyak mungkin lagu yang Anda inginkan.
  • MediaMuxer juga dapat menambahkan satu atau beberapa trek metadata yang berisi informasi per frame yang ditentukan pengguna. Format metadata didefinisikan oleh aplikasi Anda. Jalur metadata hanya didukung untuk penampung MP4.

Metadata dapat berguna untuk pemrosesan secara offline. Misalnya, sinyal giroskop dari sensor dapat digunakan untuk melakukan stabilisasi video.

Saat menambahkan trek metadata, format mime trek harus diawali dengan awalan "application/". Menulis metadata sama seperti menulis data video/audio, tetapi data tersebut tidak berasal dari MediaCodec. Sebagai gantinya, aplikasi akan meneruskan ByteBuffer dengan stempel waktu terkait ke metode writeSampleData(). Stempel waktu harus berada dalam basis waktu yang sama dengan trek video dan audio.

File MP4 yang dihasilkan menggunakan TextMetaDataSampleEntry yang ditentukan 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 MediaFormat.

Akses file media yang ditingkatkan

Storage Access Framework (SAF) memungkinkan aplikasi mengekspos DocumentsProvider kustom, yang dapat memberikan akses ke file dalam sumber data untuk aplikasi lain. Bahkan, penyedia dokumen bahkan dapat memberikan akses ke file yang berada di penyimpanan jaringan atau yang menggunakan protokol seperti Media Transfer Protocol (MTP).

Namun, mengakses file media besar dari sumber data jarak jauh memunculkan beberapa tantangan:

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

Android 8.0 mengatasi setiap tantangan ini dengan meningkatkan Storage Access Framework.

Penyedia dokumen khusus

Mulai Android 8.0, Storage Access Framework memungkinkan penyedia dokumen kustom membuat deskriptor file yang dapat dicari untuk file yang berada dalam sumber data jarak jauh. SAF dapat membuka file untuk mendapatkan deskriptor file yang dapat dicari native. SAF kemudian akan mengirimkan permintaan byte terpisah ke penyedia dokumen. Fitur ini memungkinkan penyedia dokumen menampilkan rentang byte yang tepat yang telah diminta aplikasi pemutar media, bukan menyimpan seluruh file dalam cache terlebih dahulu.

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

Akses dokumen langsung

Mulai dari Android 8.0 (API level 26), Anda dapat menggunakan metode getDocumentUri() untuk mendapatkan URI yang mereferensikan dokumen yang sama seperti mediaUri yang diberikan. Namun, karena URI yang ditampilkan didukung oleh DocumentsProvider, pengelola koleksi media dapat mengakses dokumen secara langsung, tanpa harus melintasi hierarki direktori cakupan. Akibatnya, pengelola media dapat menjalankan operasi file pada dokumen dengan jauh lebih cepat.

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

Lokasi menuju dokumen

Saat menggunakan Storage Access Framework di Android 8.0 (API level 26), Anda dapat menggunakan metode findDocumentPath(), yang tersedia di class DocumentsContract dan DocumentsProvider, untuk menentukan jalur dari root sistem file yang diberi ID dokumen. Metode ini akan menampilkan jalur ini dalam objek DocumentsContract.Path. Jika sistem file memiliki beberapa jalur yang ditentukan ke dokumen yang sama, metode akan menampilkan jalur yang paling sering digunakan untuk menjangkau dokumen dengan ID yang diberikan.

Fungsionalitas ini sangat berguna dalam skenario berikut:

  • Aplikasi Anda menggunakan dialog "simpan sebagai" yang menampilkan lokasi dokumen tertentu.
  • Aplikasi Anda menampilkan folder dalam tampilan hasil penelusuran dan harus memuat dokumen turunan yang berada dalam folder tertentu jika pengguna memilih folder tersebut.

Catatan: Jika aplikasi Anda hanya memiliki izin untuk mengakses beberapa dokumen dalam jalur, nilai yang ditampilkan findDocumentPath() hanya menyertakan folder dan dokumen yang dapat diakses oleh aplikasi Anda.

Memantau pemutaran audio

Layanan sistem AudioManager mempertahankan daftar objek AudioPlaybackConfiguration aktif, yang masing-masing berisi informasi tentang sesi pemutaran audio tertentu. Aplikasi Anda dapat mengambil kumpulan konfigurasi aktif saat ini dengan memanggil getActivePlaybackConfigurations().

Mulai dari Android 8.0 (API level 26), Anda dapat mendaftarkan callback yang memberi tahu aplikasi saat satu atau beberapa objek AudioPlaybackConfiguration telah berubah. Untuk melakukannya, panggil registerAudioPlaybackCallback() dengan meneruskan instance AudioManager.AudioPlaybackCallback. Class AudioManager.AudioPlaybackCallback berisi metode onPlaybackConfigChanged(), yang dipanggil sistem saat konfigurasi pemutaran audio berubah.

Konektivitas

Wi-Fi Aware

Android 8.0 (API level 26) menambahkan dukungan untuk Wi-Fi Aware, yang didasarkan pada spesifikasi Neighbor Awareness Networking (NAN). Pada perangkat dengan hardware Wi-Fi Aware yang sesuai, aplikasi dan perangkat di sekitar dapat menemukan dan berkomunikasi melalui Wi-Fi tanpa titik akses Internet. Kami bekerja sama dengan mitra perangkat keras untuk menghadirkan teknologi Wi-Fi Aware ke perangkat sesegera mungkin. Untuk mengetahui informasi cara mengintegrasikan Wi-Fi Aware ke dalam aplikasi, lihat Wi-Fi Aware.

Bluetooth

Android 8.0 (API level 26) memperkaya dukungan Bluetooth platform dengan menambahkan 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.

Penyambungan perangkat pendamping

Android 8.0 (API level 26) menyediakan API yang memungkinkan Anda menyesuaikan dialog permintaan penyambungan saat mencoba menyambungkan dengan perangkat pendamping melalui Bluetooth, BLE, dan Wi-Fi. Untuk informasi selengkapnya, lihat Penyambungan Perangkat Pendamping.

Untuk informasi selengkapnya tentang menggunakan Bluetooth di Android, lihat panduan Bluetooth. Untuk perubahan Bluetooth yang khusus bagi Android 8.0 (API level 26), lihat bagian Bluetooth di halaman Perubahan Perilaku Android 8.0.

Berbagi

Berbagi secara cerdas

Android 8.0 (API level 26) mempelajari preferensi berbagi yang dipersonalisasi milik pengguna dan lebih memahami setiap jenis konten yang merupakan aplikasi yang tepat untuk berbagi. Misalnya, jika pengguna mengambil foto tanda terima, Android 8.0 dapat menyarankan aplikasi pelacakan biaya; jika pengguna mengambil foto selfie, aplikasi media sosial dapat menangani gambar tersebut dengan lebih baik. Android 8.0 secara otomatis mempelajari semua pola ini sesuai dengan preferensi personalisasi pengguna.

Berbagi secara cerdas berfungsi untuk jenis konten selain image, seperti audio, video, text, URL, dll.

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

Kotlin

val annotations: ArrayList<String> = arrayListOf(
        "topic1",
        "topic2",
        "topic3"
)

intent.putStringArrayListExtra(
        Intent.EXTRA_CONTENT_ANNOTATIONS,
        annotations
)

Java

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

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

intent.putStringArrayListExtra(
    Intent.EXTRA_CONTENT_ANNOTATIONS,
    annotations
);

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

Pengklasifikasi teks

Pada perangkat yang kompatibel, aplikasi dapat menggunakan Pengklasifikasi Teks baru untuk memeriksa apakah string cocok dengan jenis entity pengklasifikasi yang dikenal dan mendapatkan alternatif pemilihan yang disarankan. Entitas yang dikenali oleh sistem mencakup alamat, URL, nomor telepon, dan alamat email. Untuk mengetahui informasi selengkapnya, lihat TextClassifier.

Aksesibilitas

Android 8.0 (API level 26) mendukung beberapa fitur aksesibilitas baru untuk developer yang membuat layanan aksesibilitas mereka sendiri:

Untuk mempelajari lebih lanjut cara membuat aplikasi Anda lebih mudah diakses, lihat Aksesibilitas.

Keamanan & Privasi

Izin

Android 8.0 (API level 26) memperkenalkan beberapa izin baru yang berkaitan dengan telepon:

  • Izin ANSWER_PHONE_CALLS memungkinkan aplikasi Anda menjawab panggilan telepon masuk secara terprogram. Untuk menangani panggilan telepon masuk di aplikasi, Anda dapat menggunakan metode acceptRingingCall().
  • Izin READ_PHONE_NUMBERS memberi aplikasi Anda akses baca ke nomor telepon yang tersimpan di sebuah perangkat.

Izin ini diklasifikasikan sebagai berbahaya dan merupakan bagian dari grup izin PHONE.

Akses akun baru dan API penemuan

Android 8.0 (API level 26) memperkenalkan beberapa peningkatan pada cara aplikasi mendapatkan akses ke akun pengguna. Untuk akun yang dikelolanya, pengautentikasi dapat menggunakan kebijakannya sendiri untuk menentukan apakah menyembunyikan akun dari, atau membuka akun ke, aplikasi. Sistem Android melacak aplikasi yang dapat mengakses akun tertentu.

Pada versi Android sebelumnya, aplikasi yang ingin melacak daftar akun pengguna harus mendapatkan update semua akun, termasuk akun dengan jenis yang tidak terkait. Android 8.0 menambahkan metode addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]), yang memungkinkan aplikasi menentukan daftar jenis akun yang akan menerima perubahan akun.

Perubahan API

AccountManager menyediakan enam metode baru untuk membantu pengautentikasi mengelola aplikasi mana yang dapat melihat akun:

Android 8.0 (API level 26) memperkenalkan dua nilai Nama Paket khusus untuk menentukan tingkat visibilitas aplikasi yang tidak ditetapkan menggunakan metode setAccountVisibility(android.accounts.Account, java.lang.String, int). Nilai visibilitas PACKAGE_NAME_KEY_LEGACY_VISIBLE diterapkan ke aplikasi yang memiliki izin GET_ACCOUNTS, dan versi target Android di bawah Android 8.0, atau yang tanda tangannya cocok dengan pengautentikasi yang menargetkan versi Android apa pun. PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE memberikan nilai visibilitas default untuk aplikasi yang tidak ditetapkan sebelumnya dan yang PACKAGE_NAME_KEY_LEGACY_VISIBLE tidak berlaku.

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

Pengujian

Pengujian instrumentasi

Android 8.0 (API level 26) menyediakan dukungan tambahan berikut untuk uji instrumentasi aplikasi Anda.

Jalankan pada proses aplikasi non-default

Kini Anda dapat menentukan bahwa uji instrumentasi tertentu harus dijalankan pada proses di luar proses default aplikasi. Konfigurasi ini berguna jika aplikasi Anda berisi beberapa aktivitas yang berjalan dalam proses berbeda.

Untuk menentukan instrumentasi proses non-default, buka file manifes Anda, lalu ke elemen <instrumentation> yang diinginkan. Tambahkan atribut android:targetProcess, dan tetapkan nilainya ke salah satu berikut ini:

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

Saat uji instrumentasi dijalankan, Anda dapat memeriksa proses mana yang diujinya dengan memanggil getProcessName().

Laporkan hasil selama pengujian

Kini Anda dapat melaporkan hasil saat uji instrumentasi sedang dijalankan, bukan setelahnya, dengan memanggil addResults().

Intent rekaan untuk pengujian

Untuk mempermudah pembuatan pengujian UI yang terpisah dan independen untuk aktivitas aplikasi Anda, Android 8.0 (API level 26) memperkenalkan metode onStartActivity(). Anda mengganti metode ini dalam subclass kustom dari class Instrumentation.ActivityMonitor untuk menangani intent tertentu yang dipanggil oleh class pengujian Anda.

Saat class pengujian Anda memanggil intent, metode ini akan menampilkan objek Instrumentation.ActivityResult stub, bukan mengeksekusi intent itu sendiri. Dengan menggunakan logika intent tiruan ini dalam pengujian, Anda dapat berfokus pada cara aktivitas mempersiapkan dan menangani intent yang diteruskan ke aktivitas berbeda atau ke aplikasi yang sama sekali berbeda.

Runtime & Alat

Optimalisasi platform

Android 8.0 (API level 26) menghadirkan runtime dan pengoptimalan lainnya ke platform yang menghasilkan sejumlah peningkatan performa. Pengoptimalan ini mencakup pembersihan sampah memori serentak, penggunaan memori yang lebih efisien, dan lokalitas kode.

Pengoptimalan ini menghasilkan waktu booting yang lebih cepat, serta performa yang lebih baik di OS dan aplikasi.

Dukungan bahasa Java yang diperbarui

Android 8.0 (API level 26) menambahkan dukungan untuk beberapa API OpenJDK Java tambahan:

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

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

ICU4J Android Framework API yang diupdate

Android 8.0 (API level 26) memperluas ICU4J Android Framework API—yang merupakan subset ICU4J API—untuk digunakan developer aplikasi dalam paket android.icu. API ini menggunakan data pelokalan yang ada di perangkat, sehingga Anda dapat mengurangi jejak APK dengan tidak mengompilasi library 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 (API level 26) 58.2 30.0.3 9.0

Untuk informasi selengkapnya tentang internasionalisasi di Android, termasuk dukungan ICU4J, lihat Internasionalisasi di Android.

Android enterprise

Fitur dan API perusahaan baru telah diperkenalkan untuk perangkat yang menjalankan Android 8.0 (API level 26). Sorotan mencakup hal berikut:

  • Profil kerja di perangkat terkelola sepenuhnya memungkinkan perusahaan memisahkan data pekerjaan dari 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 penyiapan.
  • Kontrol baru atas Bluetooth, Wi-Fi, pencadangan, dan keamanan memungkinkan perusahaan mengelola lebih banyak perangkat. Logging aktivitas jaringan membantu perusahaan melacak masalah.

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