Level API: 17
Android 4.2 (JELLY_BEAN_MR1
)
adalah pembaruan untuk rilis Jelly Bean yang menawarkan fitur baru untuk pengguna dan aplikasi
developer. Dokumen ini memberikan pengantar tentang hal-hal yang paling penting dan
API baru yang berguna bagi developer.
Sebagai pengembang aplikasi, Anda harus mengunduh citra sistem dan platform SDK Android 4.2 dari SDK Manager sesegera mungkin. Jika Anda tidak memiliki perangkat yang menjalankan Android 4.2 untuk menguji aplikasi Anda, gunakan sistem Android 4.2 untuk menguji aplikasi Anda di Android Emulator. Kemudian, bangun aplikasi Anda pada platform Android 4.2 untuk mulai menggunakan API terbaru.
Untuk lebih mengoptimalkan aplikasi Anda pada perangkat yang menjalankan Android 4.2,
Anda harus menetapkan targetSdkVersion
ke
"17"
, instal pada image sistem Android 4.2,
mengujinya, lalu mempublikasikan
pembaruan dengan perubahan ini.
Anda
dapat menggunakan API di Android 4.2 sekaligus mendukung versi yang lebih lama dengan menambahkan
kondisi pada kode yang memeriksa level API sistem sebelum mengeksekusi
API yang tidak didukung oleh minSdkVersion
Anda.
Untuk mempelajari lebih lanjut tentang
mempertahankan kompatibilitas mundur, baca Membuat Kompatibel dengan Mundur
UI.
Informasi selengkapnya tentang cara kerja level API tersedia di Apa itu API Tingkat?
Perubahan Perilaku yang Penting
Jika Anda sebelumnya telah memublikasikan aplikasi untuk Android, perhatikan hal-hal berikut perubahan yang mungkin memengaruhi perilaku aplikasi Anda:
- Penyedia konten tidak lagi diekspor secara default. Artinya, nilai {i>default<i}
untuk atribut
android:exported
sekarang menjadi“false"
. Jika penting agar aplikasi lain dapat mengakses penyedia konten, Anda kini harus menetapkanandroid:exported="true"
secara eksplisit.Perubahan ini hanya berlaku jika Anda menetapkan
android:targetSdkVersion
atauandroid:minSdkVersion
ke versi 17 atau lebih tinggi. Jika tidak, nilai defaultnya tetap“true"
bahkan saat menjalankan Android 4.2 dan yang lebih tinggi. - Dibandingkan dengan versi Android sebelumnya, hasil lokasi pengguna mungkin kurang akurat
jika aplikasi Anda meminta izin
ACCESS_COARSE_LOCATION
tetapi tidak meminta izinACCESS_FINE_LOCATION
.Untuk memenuhi ekspektasi privasi pengguna saat aplikasi Anda meminta izin untuk lokasi sementara (dan bukan lokasi akurat), sistem tidak akan memberikan perkiraan lokasi pengguna yang lebih akurat daripada sebuah blok kota.
- Beberapa setelan perangkat yang ditentukan oleh
Settings.System
kini hanya-baca. Jika aplikasi Anda mencoba menulis perubahan pada setelan yang ditentukan diSettings.System
yang telah dipindahkan keSettings.Global
, operasi tulis akan gagal secara diam-diam saat berjalan di Android 4.2 dan yang lebih tinggi.Meskipun nilai Anda untuk
android:targetSdkVersion
danandroid:minSdkVersion
lebih rendah dari 17, aplikasi Anda tidak dapat mengubah setelan yang memiliki dipindahkan keSettings.Global
saat berjalan pada Android 4.2 dan versi yang lebih tinggi. - Jika aplikasi Anda menggunakan
WebView
, Android 4.2 akan menambahkan lapisan keamanan sehingga Anda dapat mengikat JavaScript ke Kode Android. Jika Anda menetapkantargetSdkVersion
ke versi 17 atau yang lebih baru, Anda kini harus menambahkan anotasi@JavascriptInterface
ke metode apa pun yang ingin disediakan untuk JavaScript Anda (metode tersebut juga harus bersifat publik). Jika Anda tidak memberikan , metode ini tidak dapat diakses oleh halaman web diWebView
Anda saat berjalan di Android 4.2 atau yang lebih tinggi. Jika Anda menyeteltargetSdkVersion
ke 16 atau lebih rendah, anotasi tidak diperlukan, tetapi sebaiknya Anda mengupdate versi target dan tambahkan anotasi untuk keamanan tambahan.Baca selengkapnya tentang binding kode JavaScript ke kode Android.
Daydream
Daydream adalah mode screensaver interaktif baru untuk perangkat Android. Aktif otomatis saat perangkat dimasukkan ke dok atau saat perangkat dibiarkan tidak ada aktivitas saat dicolokkan ke pengisi daya (bukan mematikan layar). Lamunan menampilkan satu mimpi pada satu waktu, yang mungkin berupa tampilan pasif yang sepenuhnya visual yang mengabaikan sentuhan, atau mungkin interaktif dan responsif ke rangkaian lengkap peristiwa input. Mimpi Anda berjalan dalam proses aplikasi dan memiliki akses penuh ke toolkit UI Android, termasuk tampilan, tata letak, dan animasi, sehingga lebih fleksibel dan lebih canggih daripada wallpaper animasi atau widget aplikasi.
Anda dapat mewujudkan impian untuk Daydream dengan menerapkan subclass DreamService
. DreamService
API
dirancang agar serupa dengan Activity
. Untuk menentukan UI bagi
impian, teruskan ID resource tata letak atau View
ke setContentView()
kapan saja setelah
jendela, seperti dari onAttachedToWindow()
,
.
Class DreamService
memberikan callback siklus proses penting lainnya
selain Service
API dasar, seperti onDreamingStarted()
, onDreamingStopped()
, dan onDetachedFromWindow()
.
Anda tidak dapat memulai DreamService
dari
aplikasi—diluncurkan secara otomatis oleh sistem.
Jika impian Anda bersifat interaktif, Anda dapat memulai aktivitas dari mimpi untuk mengirim pengguna
UI lengkap aplikasi Anda untuk detail atau kontrol lebih lanjut. Anda dapat menggunakan finish()
untuk mengakhiri mimpi sehingga pengguna dapat melihat
Aktivitas baru.
Agar daydream Anda tersedia untuk sistem, deklarasikan DreamService
dengan elemen <service>
dalam file manifes. Anda kemudian harus menyertakan filter intent dengan tindakan "android.service.dreams.DreamService"
. Contoh:
<service android:name=".MyDream" android:exported="true" android:icon="@drawable/dream_icon" android:label="@string/dream_label" > <intent-filter> <action android:name="android.service.dreams.DreamService" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service>
Ada beberapa metode berguna lainnya di DreamService
yang harus diperhatikan:
setInteractive(boolean)
mengontrol apakah mimpi itu menerima kejadian input atau keluar segera setelah pengguna dimasukkan. Jika mimpinya interaktif, pengguna dapat menggunakan tombol Kembali atau Beranda untuk keluar dari mimpi atau Anda dapat memanggilfinish()
untuk menghentikan mimpi.- Jika menginginkan tampilan yang sepenuhnya imersif, Anda dapat memanggil
setFullscreen()
untuk menyembunyikan status bar. - Sebelum Daydream dimulai, layar akan meredup untuk memberi tahu pengguna bahwa waktu tunggu tidak ada aktivitas
yang akan datang. Memanggil
setScreenBright(true)
memungkinkan Anda untuk menyetel layar pada kecerahannya yang biasa.
Untuk mengetahui informasi selengkapnya, lihat dokumentasi DreamService
.
Layar Sekunder
Android kini memungkinkan aplikasi Anda menampilkan konten unik pada layar tambahan yang terhubung
ke perangkat pengguna melalui
koneksi kabel atau Wi-Fi.
Untuk membuat konten unik bagi tampilan sekunder, perluas Presentation
dan menerapkan callback onCreate()
. Di dalam
onCreate()
, menentukan UI untuk tampilan sekunder
dengan memanggil setContentView()
.
Sebagai ekstensi class Dialog
, class Presentation
menyediakan region tempat aplikasi Anda dapat menampilkan UI unik di
tampilan sekunder.
Untuk mendeteksi layar sekunder tempat Anda dapat menampilkan Presentation
,
gunakan DisplayManager
atau MediaRouter
Google Cloud Platform. Meskipun API DisplayManager
memungkinkan Anda menghitung
beberapa layar yang dapat terhubung sekaligus, Anda biasanya harus menggunakan MediaRouter
untuk mengakses tampilan default sistem dengan cepat
presentasi.
Untuk mendapatkan tampilan default presentasi Anda, panggil MediaRouter.getSelectedRoute()
dan teruskan
ROUTE_TYPE_LIVE_VIDEO
. Tindakan ini akan menampilkan objek MediaRouter.RouteInfo
yang mendeskripsikan rute yang dipilih sistem saat ini
untuk presentasi video. Jika MediaRouter.RouteInfo
bukan null, panggil
getPresentationDisplay()
untuk mendapatkan Display
yang mewakili tampilan yang terhubung.
Anda kemudian dapat menampilkan presentasi dengan meneruskan objek Display
ke konstruktor untuk class Presentation
Anda. Presentasi Anda sekarang akan
akan muncul pada tampilan sekunder.
Untuk mendeteksi saat runtime ketika layar baru telah terhubung, buat instance MediaRouter.SimpleCallback
tempat Anda mengimplementasikan metode callback onRoutePresentationDisplayChanged()
, yang akan dipanggil sistem saat
tampilan presentasi terhubung. Lalu, daftarkan MediaRouter.SimpleCallback
dengan meneruskannya ke MediaRouter.addCallback()
bersama dengan jenis rute ROUTE_TYPE_LIVE_VIDEO
. Saat Anda menerima panggilan ke
onRoutePresentationDisplayChanged()
, cukup panggil MediaRouter.getSelectedRoute()
seperti yang disebutkan di atas.
Untuk lebih mengoptimalkan UI di Presentation
untuk
layar sekunder, Anda
dapat menerapkan
tema yang berbeda dengan menentukan atribut android:presentationTheme
di <style>
yang telah Anda
yang diterapkan pada aplikasi atau aktivitas Anda.
Ingatlah bahwa layar yang terhubung ke perangkat pengguna
sering kali memiliki ukuran layar yang lebih besar dan
cenderung memiliki kepadatan
layar yang berbeda. Karena karakteristik layar mungkin
berbeda, Anda harus
menyediakan sumber daya yang dioptimalkan secara khusus
untuk tampilan yang lebih besar. Jika Anda memerlukan
untuk meminta resource tambahan dari Presentation
, panggil getContext()
.getResources()
untuk mendapatkan objek Resources
yang sesuai dengan tampilan. Hal ini memberikan
resource yang sesuai dari aplikasi Anda yang paling sesuai untuk
ukuran dan kepadatan layar tampilan sekundernya.
Untuk informasi lebih lanjut dan beberapa contoh kode, lihat Presentation
dokumentasi kelas.
Widget Layar Kunci
Android kini memungkinkan pengguna menambahkan widget aplikasi ke layar kunci. Agar Widget Aplikasi tersedia untuk digunakan di
layar kunci, tambahkan atribut android:widgetCategory
ke file XML yang menentukan AppWidgetProviderInfo
. Atribut ini mendukung dua nilai: home_screen
dan keyguard
. Secara default, atribut ini ditetapkan ke home_screen
sehingga pengguna dapat menambahkan
ke Layar utama. Jika Anda ingin widget aplikasi Anda juga tersedia di kunci
tambahkan nilai keyguard
:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" ... android:widgetCategory="keyguard|home_screen"> </appwidget-provider>
Anda juga harus menentukan tata letak awal untuk widget aplikasi saat berada di layar kunci dengan
atribut android:initialKeyguardLayout
. Cara ini berfungsi dengan cara yang sama seperti android:initialLayout
, karena menyediakan
tata letak yang dapat segera muncul hingga widget aplikasi Anda diinisialisasi dan dapat memperbarui
tata letak.
Untuk informasi selengkapnya tentang membuat widget aplikasi untuk layar kunci, termasuk menyesuaikan ukuran widget aplikasi Anda saat berada di layar kunci, lihat panduan Widget Aplikasi.
Beberapa Pengguna
Android kini memungkinkan beberapa ruang pengguna di perangkat yang dapat digunakan bersama, seperti tablet. Setiap pengguna di memiliki kumpulan akun, aplikasi, setelan sistem, file mereka sendiri, dan data yang terkait dengan pengguna.
Sebagai developer aplikasi, tidak ada hal yang perlu Anda lakukan agar aplikasi dapat berfungsi secara benar dengan beberapa pengguna pada satu perangkat. Berapa pun jumlah pengguna yang ada di perangkat, data yang disimpan aplikasi Anda untuk pengguna tertentu tetap terpisah dari data yang disimpan aplikasi Anda bagi pengguna lain. Sistem melacak data pengguna mana yang termasuk dalam proses pengguna di mana aplikasi Anda berjalan dan memberi aplikasi Anda akses hanya ke data pengguna tersebut dan tidak mengizinkan akses ke data pengguna lainnya.
Menyimpan data di lingkungan multi-pengguna
Setiap kali aplikasi Anda menyimpan preferensi pengguna, membuat database, atau menulis file ke preferensi pengguna ruang penyimpanan internal atau eksternal, data itu hanya dapat diakses saat dijalankan sebagai pengguna.
Untuk memastikan bahwa aplikasi Anda berperilaku dengan benar dalam lingkungan multi-pengguna, jangan merujuk direktori aplikasi internal atau lokasi penyimpanan eksternal yang menggunakan jalur hard code dan sebagai gantinya selalu menggunakan API yang sesuai:
- Untuk akses ke penyimpanan internal, gunakan
getFilesDir()
,getCacheDir()
, atauopenFileOutput()
. - Untuk akses ke penyimpanan eksternal, gunakan
getExternalFilesDir()
ataugetExternalStoragePublicDirectory()
.
Apa pun API yang Anda gunakan untuk menyimpan data bagi pengguna tertentu, data tersebut tidak akan dapat diakses saat berjalan sebagai pengguna yang berbeda. Dari sudut pandang aplikasi Anda, setiap pengguna menjalankan di perangkat yang benar-benar terpisah.
Mengidentifikasi pengguna dalam lingkungan multi-pengguna
Jika aplikasi Anda ingin mengidentifikasi pengguna unik, misalnya untuk mengumpulkan analisis atau membuat akun lain
asosiasi, Anda harus mengikuti praktik
yang disarankan untuk mengidentifikasi
penginstalan unik. Dengan membuat UUID
baru saat aplikasi Anda dimulai untuk
pertama kali, Anda pasti mendapatkan ID unik untuk melacak setiap pengguna,
pengguna menginstal aplikasi Anda di satu perangkat. Atau, Anda dapat menyimpan token lokal yang diambil dari
server atau gunakan ID pendaftaran yang diberikan oleh Google Cloud Messaging.
Berhati-hatilah karena jika aplikasi Anda meminta salah satu ID perangkat hardware (seperti MAC WiFi
alamat atau nomor SERIAL
), keduanya akan memberikan nilai yang sama untuk masing-masing
pengguna karena pengenal ini terikat dengan
perangkat keras, bukan dengan pengguna. Belum lagi yang lainnya
masalah yang diperkenalkan oleh pengenal ini seperti yang dibahas dalam
Penginstalan Aplikasi.
Setelan Global Baru
Setelan sistem telah diperbarui untuk mendukung beberapa pengguna dengan tambahan Settings.Global
. Kumpulan setelan ini mirip dengan setelan Settings.Secure
karena bersifat hanya baca, tetapi berlaku secara global di
semua ruang pengguna di perangkat.
Beberapa setelan yang ada dipindahkan ke sini dari Settings.System
atau Settings.Secure
. Jika aplikasi Anda
saat ini melakukan perubahan pada setelan yang sebelumnya ditentukan di Settings.System
(seperti AIRPLANE_MODE_ON
), Anda akan mendapati bahwa
tindakan ini tidak akan berfungsi lagi pada perangkat yang menjalankan Android 4.2 atau lebih tinggi jika setelan tersebut
dipindahkan ke Settings.Global
. Anda dapat terus membaca setelan yang ada di
Settings.Global
, tetapi karena setelan tersebut tidak lagi dianggap aman
agar aplikasi berubah, mencoba melakukannya akan gagal tanpa ada peringatan dan sistem akan menulis peringatan
log sistem saat menjalankan aplikasi
Anda pada Android 4.2 atau yang lebih tinggi.
Dukungan Tata Letak RTL
Android kini menawarkan beberapa API yang memungkinkan Anda membangun antarmuka pengguna yang mengubah orientasi tata letak untuk mendukung bahasa yang menggunakan UI dan pembacaan kanan-ke-kiri (RTL) bahasa, seperti bahasa Arab dan Ibrani.
Untuk mulai mendukung tata letak RTL di aplikasi, tetapkan atribut android:supportsRtl
ke elemen <application>
dalam file manifes Anda
dan menyetelnya ke “true"
. Setelah Anda mengaktifkan ini, sistem akan mengaktifkan berbagai API RTL untuk
menampilkan aplikasi Anda dengan tata letak RTL. Misalnya, bilah tindakan akan menampilkan ikon dan judul
di sisi kanan dan tombol tindakan di sebelah kiri, dan tata letak yang telah Anda buat dengan
Class View
yang disediakan framework juga akan dibatalkan.
Jika Anda perlu lebih mengoptimalkan tampilan aplikasi saat ditampilkan dengan tata letak RTL, ada dua tingkat dasar pengoptimalan:
- Mengonversi properti tata letak berorientasi kiri dan kanan menjadi tata letak berorientasi awal dan akhir
properti baru.
Misalnya, gunakan
android:layout_marginStart
menggantikanandroid:layout_marginLeft
danandroid:layout_marginEnd
sebagai penggantiandroid:layout_marginRight
.Class
RelativeLayout
juga menyediakan tata letak yang sesuai untuk mengganti posisi kiri/kanan, sepertiandroid:layout_alignParentStart
menjadi gantiandroid:layout_alignParentLeft
danandroid:layout_toStartOf
, bukanandroid:layout_toLeftOf
. - Atau untuk menyediakan pengoptimalan lengkap bagi tata letak RTL, Anda dapat menyediakan
file tata letak menggunakan penentu resource
ldrtl
(ldrtl
adalah singkatan dari arah tata letak-kanan-ke-kiri}). Misalnya, Anda dapat menyimpan file tata letak default dires/layout/
dan tata letak RTL Anda yang dioptimalkan dires/layout-ldrtl/
.Penentu
ldrtl
sangat bagus untuk resource drawable sehingga Anda dapat menyediakan grafik yang berorientasi ke arah yang sesuai dengan arah pembacaan.
Berbagai API lain tersedia di seluruh framework untuk mendukung tata letak RTL, seperti di
class View
sehingga Anda dapat menerapkan perilaku yang tepat untuk
dan di Configuration
untuk mengkueri arah tata letak saat ini.
Catatan: Jika Anda menggunakan SQlite dan memiliki nama tabel atau kolom yang
“hanya angka", membuat
hati-hati: penggunaan String.format(String, Object...)
dapat menyebabkan error, yaitu angka
telah dikonversi ke dalam bahasa Arab jika perangkat Anda disetel ke lokalitas bahasa Arab.
Anda harus menggunakan String.format(Locale,String,Object...)
untuk memastikan angka
dipertahankan sebagai ASCII. Gunakan juga String.format("%d", int)
, bukan menggunakan
String.valueOf(int)
untuk
memformat angka.
Fragmen Bertingkat
Anda kini dapat menyematkan fragmen di dalam fragmen. Hal ini berguna untuk berbagai situasi di
di mana Anda ingin menempatkan komponen UI yang dinamis dan dapat digunakan kembali ke dalam komponen UI itu sendiri
dinamis dan dapat digunakan kembali. Misalnya, jika Anda menggunakan ViewPager
untuk
membuat fragmen yang menggeser ke kiri dan ke kanan dan menghabiskan sebagian besar ruang layar, Anda dapat
sekarang masukkan fragmen ke dalam setiap halaman fragmen.
Untuk menyusun bertingkat fragmen, cukup panggil getChildFragmentManager()
di
Fragment
tempat Anda ingin menambahkan fragmen. Tindakan ini akan menampilkan FragmentManager
yang dapat Anda gunakan seperti biasa dari aktivitas level teratas
untuk membuat transaksi fragmen. Misalnya, berikut adalah beberapa kode yang menambahkan fragmen dari dalam
class Fragment
yang sudah ada:
Kotlin
val videoFragment = VideoPlayerFragment() childFragmentManager.beginTransaction().apply { add(R.id.video_fragment, videoFragment) commit() }
Java
Fragment videoFragment = new VideoPlayerFragment(); FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); transaction.add(R.id.video_fragment, videoFragment).commit();
Dari dalam fragmen bertingkat, Anda bisa mendapatkan referensi ke fragmen induk dengan memanggil
getParentFragment()
.
Android Support Library kini juga mendukung fragmen bertingkat, sehingga Anda dapat mengimplementasikan desain fragmen di Android 1.6 dan yang lebih tinggi.
Catatan: Anda tidak dapat meng-inflate tata letak menjadi fragmen saat tata letak tersebut
menyertakan <fragment>
. Fragmen bertingkat hanya didukung bila ditambahkan ke
fragmen secara dinamis.
Renderscript
Fungsi komputasi Renderscript telah ditingkatkan dengan fitur berikut:
- Intrinsik skrip
Anda dapat menggunakan intrinsik skrip bawaan Renderscript yang menerapkan operasi umum, seperti:
Blends
Blur
Color matrix
3x3 convolve
5x5 convolve
Per-channel lookup table
Converting an Android YUV buffer to RGB
Untuk menggunakan intrinsik skrip, panggil metode
create()
statis dari setiap intrinsik untuk membuat instance skrip. Anda kemudian meneleponset()
yang tersedia dari setiap skrip secara intrinsik untuk menetapkan input dan opsi yang diperlukan. Terakhir, panggilforEach()
untuk mengeksekusi skrip.- Grup Skrip
-
ScriptGroup
memungkinkan Anda menggabungkan Renderscript terkait skrip dan mengeksekusinya dengan satu panggilan.Gunakan
ScriptGroup.Builder
untuk menambahkan semua skrip ke grup dengan memanggiladdKernel()
. Setelah Anda menambahkan semua skrip, membuat koneksi antara skrip dengan memanggiladdConnection()
. Setelah selesai menambahkan koneksi, panggilcreate()
untuk membuat grup skrip. Sebelum menjalankan grup skrip, tentukan inputAllocation
dan skrip awal untuk dijalankan dengan MetodesetInput(Script.KernelID, Allocation)
dan memberikan outputAllocation
tempat hasilnya akan ditulis dan skrip akhir akan dijalankan dengansetOutput()
. Terakhir, panggilexecute()
untuk menjalankan grup skrip. - Skrip filter
-
Filterscript menentukan batasan pada Renderscript API yang ada yang memungkinkan kode yang dihasilkan untuk dijalankan lebih banyak pilihan prosesor (CPU, GPU, dan DSP). Untuk membuat file Filterscript, buat
.fs
file, dan bukan file.rs
, serta menentukan#pragma rs_fp_relaxed
untuk memberi tahu runtime Renderscript, skrip Anda tidak memerlukan presisi floating point IEEE 754-2008 yang ketat. Presisi ini memungkinkan flush-to-zero untuk denorm dan round-towards-zero. Selain itu, Filterscript skrip tidak boleh menggunakan jenis bawaan 32-bit dan harus menentukan fungsi root khusus dengan menggunakan Atribut__attribute__((kernel))
karena Filterscript tidak mendukung pointer, yang yang ditentukan oleh tanda tangan default fungsiroot()
.
Catatan: Meskipun dukungan Filterscript tersedia di platform, developer akan tersedia di Rilis SDK Tools 21.0.1.
Untuk tampilan detail semua perubahan API di Android 4.2, lihat Laporan Perbedaan API.