API Level: 16
Android 4.1 (JELLY_BEAN
)
adalah progres platform yang menawarkan performa
yang lebih baik dan pengalaman pengguna yang ditingkatkan. Versi ini menambahkan fitur baru untuk pengguna dan developer
aplikasi. Dokumen ini memberikan pengantar untuk API baru yang paling penting dan berguna bagi developer aplikasi.
Sebagai developer aplikasi, Android 4.1 tersedia untuk Anda dari SDK Manager sebagai image sistem yang dapat dijalankan di emulator Android dan platform SDK yang dapat digunakan untuk mem-build aplikasi. Anda harus mendownload image sistem dan platform sesegera mungkin untuk mem-build dan menguji aplikasi di Android 4.1.
Untuk lebih mengoptimalkan aplikasi Anda pada perangkat yang menjalankan Android 4.1,
Anda harus menetapkan targetSdkVersion
ke
"16"
, menginstalnya pada image sistem Android 4.1,
mengujinya, lalu memublikasikan update dengan perubahan ini.
Anda
dapat menggunakan API di Android 4.1 sekaligus mendukung versi yang lebih lama dengan menambahkan
kondisi ke kode yang memeriksa level API sistem sebelum mengeksekusi
API yang tidak didukung oleh minSdkVersion
Anda.
Untuk mempelajari lebih lanjut cara mempertahankan kompatibilitas mundur, baca Membuat UI yang Kompatibel dengan Versi Sebelumnya.
Informasi selengkapnya tentang cara kerja API level tersedia di Apa yang dimaksud dengan API Level?
Komponen Aplikasi
Layanan terisolasi
Dengan menentukan android:isolatedProcess="true"
di tag <service>
, Service
Anda akan berjalan di bawah proses ID pengguna terisolasinya sendiri yang tidak memiliki izinnya sendiri.
Manajemen memori
Konstanta ComponentCallbacks2
baru seperti TRIM_MEMORY_RUNNING_LOW
dan TRIM_MEMORY_RUNNING_CRITICAL
menyediakan proses latar depan
yang memproses informasi selengkapnya tentang
status memori sebelum sistem memanggil onLowMemory()
.
Metode getMyMemoryState(ActivityManager.RunningAppProcessInfo)
baru memungkinkan Anda
mengambil status memori umum.
Penyedia konten
Metode baru, acquireUnstableContentProviderClient()
, memungkinkan Anda mengakses ContentProviderClient
yang mungkin "tidak stabil" sehingga aplikasi Anda tidak akan error jika
penyedia konten mengalami error. Hal ini berguna saat Anda berinteraksi dengan penyedia konten di aplikasi
terpisah.
Wallpaper Animasi
Protokol intent baru untuk langsung meluncurkan aktivitas pratinjau wallpaper animasi sehingga Anda dapat membantu pengguna memilih wallpaper animasi dengan mudah tanpa memaksa mereka untuk keluar dari aplikasi dan membuka pemilih wallpaper Beranda.
Untuk meluncurkan pemilih wallpaper animasi, panggil startActivity()
dengan Intent
menggunakan
ACTION_CHANGE_LIVE_WALLPAPER
dan tambahan
yang menentukan ComponentName
wallpaper animasi Anda sebagai string di EXTRA_LIVE_WALLPAPER_COMPONENT
.
Navigasi stack aplikasi
Android 4.1 mempermudah penerapan pola desain yang tepat untuk navigasi Naik.
Yang perlu Anda lakukan adalah menambahkan android:parentActivityName
ke setiap elemen <activity>
dalam
file manifes. Sistem menggunakan informasi ini untuk membuka aktivitas yang sesuai saat pengguna
menekan tombol Naik di panel tindakan (sekaligus menyelesaikan aktivitas saat ini). Jadi, jika
mendeklarasikan android:parentActivityName
untuk setiap aktivitas, Anda tidak memerlukan metode onOptionsItemSelected()
untuk menangani peristiwa
klik pada ikon aplikasi panel tindakan—sistem kini menangani peristiwa tersebut dan melanjutkan atau
membuat aktivitas yang sesuai.
Cara ini sangat efektif untuk skenario ketika pengguna memasuki salah satu aktivitas aplikasi Anda
melalui intent "pembahasan mendalam" seperti dari notifikasi atau intent dari
aplikasi yang berbeda (seperti yang dijelaskan dalam panduan desain untuk Menavigasi Antar-Aplikasi). Saat
pengguna memasuki aktivitas dengan cara ini, aplikasi Anda mungkin tidak memiliki data sebelumnya
aktivitas yang dapat dilanjutkan saat pengguna menavigasi ke atas. Namun, saat Anda memberikan atribut android:parentActivityName
untuk aktivitas, sistem akan mengenali
apakah aplikasi Anda sudah berisi data sebelumnya dari aktivitas induk atau tidak, dan jika tidak, membuat
data sebelumnya sintetis yang berisi semua aktivitas induk.
Catatan: Saat pengguna memasuki aktivitas dalam aplikasi dan membuat tugas baru untuk aplikasi Anda, sistem sebenarnya menyisipkan stack aktivitas induk ke dalam tugas. Dengan demikian, menekan tombol Kembali juga akan menavigasi kembali melalui tumpukan aktivitas induk.
Saat membuat data sebelumnya sintetis untuk aplikasi Anda, sistem akan mem-build Intent
dasar untuk membuat instance baru dari setiap aktivitas induk. Jadi, tidak ada
status tersimpan untuk aktivitas induk seperti yang Anda harapkan saat pengguna menavigasi
setiap aktivitas. Jika salah satu aktivitas induk biasanya menampilkan UI yang bergantung pada
konteks pengguna, informasi konteks tersebut akan hilang dan Anda harus mengirimkannya saat
pengguna
menavigasi kembali melalui stack. Misalnya, jika pengguna melihat album
di aplikasi musik, menavigasi ke atas dapat mengarahkan mereka ke aktivitas yang mencantumkan semua album dalam genre musik
yang dipilih. Dalam hal ini, jika tumpukan harus dibuat, Anda perlu memberi tahu aktivitas
induk tentang genre album saat ini agar induk dapat menampilkan daftar yang tepat
seolah-olah pengguna benar-benar berasal dari aktivitas tersebut. Untuk mengirimkan informasi tersebut ke aktivitas induk
sintetik, Anda harus mengganti metode onPrepareNavigateUpTaskStack()
. Tindakan ini
memberikan objek TaskStackBuilder
yang dibuat sistem untuk
menyintetisasikan aktivitas induk. TaskStackBuilder
berisi objek Intent
yang digunakan sistem untuk membuat setiap aktivitas induk. Dalam
implementasi onPrepareNavigateUpTaskStack()
, Anda dapat mengubah Intent
yang sesuai untuk
menambahkan data tambahan yang dapat digunakan aktivitas induk untuk menentukan konteks yang sesuai dan menampilkan
UI yang sesuai.
Saat membuat TaskStackBuilder
, sistem akan menambahkan objek Intent
yang digunakan untuk membuat aktivitas induk dalam urutan
logisnya yang dimulai dari bagian atas hierarki aktivitas. Jadi, Intent
terakhir yang ditambahkan ke array internal adalah induk langsung dari aktivitas saat ini. Jika
Anda ingin memodifikasi Intent
untuk induk aktivitas, tentukan
panjang array dengan getIntentCount()
terlebih dahulu, lalu teruskan
nilai tersebut ke editIntentAt()
.
Jika struktur aplikasi Anda lebih kompleks, ada beberapa API lain yang tersedia yang memungkinkan Anda menangani perilaku navigasi Naik dan sepenuhnya menyesuaikan data sebelumnya yang sintetis. Beberapa API yang memberi Anda kontrol tambahan meliputi:
onNavigateUp()
- Ganti ini untuk melakukan tindakan kustom ketika pengguna menekan tombol Atas.
navigateUpTo(Intent)
- Panggil ini untuk menyelesaikan aktivitas saat ini dan membuka aktivitas yang ditunjukkan oleh
Intent
yang disediakan. Jika aktivitas ada di data sebelumnya, tetapi bukan induk terdekat, semua aktivitas lain antara aktivitas saat ini dan aktivitas yang ditentukan dengan intent juga akan selesai. getParentActivityIntent()
- Panggil ini untuk mendapatkan
Intent
yang akan memulai induk logis untuk aktivitas saat ini. shouldUpRecreateTask(Intent)
- Panggil ini untuk mengkueri apakah data sintetis sebelumnya harus dibuat untuk naik ke atas atau tidak. Menampilkan true (benar) jika stack sintetis harus dibuat, false (salah) jika stack yang sesuai sudah ada.
finishAffinity()
- Panggil ini untuk menyelesaikan aktivitas saat ini dan semua aktivitas induk dengan
afinitas tugas yang sama yang dirantai ke aktivitas saat ini.
Jika mengganti perilaku default seperti
onNavigateUp()
, Anda harus memanggil metode ini saat membuat data sebelumnya sintetis setelah navigasi Atas. onCreateNavigateUpTaskStack
- Ganti ini jika Anda perlu mengontrol sepenuhnya cara pembuatan data sintetis. Jika hanya ingin menambahkan beberapa data tambahan ke intent untuk data sebelumnya, Anda harus mengganti
onPrepareNavigateUpTaskStack()
Namun, sebagian besar aplikasi tidak perlu menggunakan API ini atau menerapkan onPrepareNavigateUpTaskStack()
, tetapi dapat memperoleh perilaku yang benar hanya dengan
menambahkan android:parentActivityName
ke setiap elemen <activity>
.
Multimedia
Codec media
Class MediaCodec
menyediakan akses ke codec media level rendah untuk mengenkode
dan mendekode media Anda. Anda dapat membuat instance MediaCodec
dengan memanggil createEncoderByType()
untuk mengenkode media atau memanggil createDecoderByType()
untuk mendekode media. Setiap metode ini
menggunakan jenis MIME untuk jenis media yang ingin Anda enkode atau dekode, seperti "video/3gpp"
atau "audio/vorbis"
.
Dengan instance MediaCodec
yang dibuat, Anda dapat memanggil configure()
untuk menentukan properti seperti format media atau
apakah konten dienkripsi atau tidak.
Baik Anda mengenkode atau mendekode media, proses lainnya akan sama setelah Anda
membuat MediaCodec
. Pertama, panggil getInputBuffers()
untuk mendapatkan array objek ByteBuffer
input
dan getOutputBuffers()
untuk mendapatkan array objek ByteBuffer
output.
Jika Anda siap untuk mengenkode atau mendekode, panggil dequeueInputBuffer()
untuk mendapatkan posisi indeks ByteBuffer
(dari array buffer input) yang harus Anda gunakan untuk memasukkan media
sumber. Setelah Anda mengisi ByteBuffer
dengan media sumber, lepaskan kepemilikan
buffer dengan memanggil queueInputBuffer()
.
Demikian pula untuk buffering output, panggil dequeueOutputBuffer()
untuk mendapatkan posisi indeks ByteBuffer
tempat Anda akan menerima hasilnya. Setelah Anda membaca output dari ByteBuffer
,
lepaskan kepemilikan dengan memanggil releaseOutputBuffer()
.
Anda dapat menangani data media terenkripsi dalam codec dengan memanggil queueSecureInputBuffer()
bersama dengan
MediaCrypto
API, bukan queueInputBuffer()
normal.
Untuk informasi selengkapnya tentang cara menggunakan codec, lihat dokumentasi MediaCodec
.
Rekam audio saat isyarat
Metode baru startRecording()
memungkinkan
Anda memulai perekaman audio berdasarkan isyarat yang ditentukan oleh MediaSyncEvent
.
MediaSyncEvent
menentukan sesi audio
(seperti yang ditentukan oleh MediaPlayer
), yang jika selesai, akan memicu
perekam audio untuk mulai merekam. Misalnya, Anda dapat menggunakan fungsi ini untuk
memutar nada audio yang menunjukkan awal sesi perekaman dan perekaman
akan otomatis dimulai sehingga Anda tidak perlu menyinkronkan nada dan awal
rekaman secara manual.
Jalur teks yang disinkronkan dengan waktu
MediaPlayer
kini menangani trek teks dalam band dan di luar band.
Trek teks dalam band tersedia sebagai trek teks dalam sumber media MP4 atau 3GPP. Jalur teks
out-of-band dapat ditambahkan sebagai sumber teks eksternal melalui metode addTimedTextSource()
. Setelah semua sumber jalur teks
eksternal ditambahkan, getTrackInfo()
harus dipanggil untuk mendapatkan
daftar yang diperbarui dari semua jalur yang tersedia di sumber data.
Untuk menetapkan jalur yang akan digunakan dengan MediaPlayer
, Anda harus
memanggil selectTrack()
, menggunakan posisi
indeks untuk jalur yang ingin digunakan.
Agar mendapatkan notifikasi saat trek teks siap diputar, terapkan
antarmuka MediaPlayer.OnTimedTextListener
dan teruskan
ke setOnTimedTextListener()
.
Efek audio
Class AudioEffect
kini mendukung jenis pra-pemrosesan
audio tambahan saat merekam audio:
- Peredam Gema Akustik (AEC) dengan
AcousticEchoCanceler
menghapus kontribusi sinyal yang diterima dari pihak jarak jauh dari sinyal audio yang direkam. - Automatic Gain Control (AGC) dengan
AutomaticGainControl
secara otomatis menormalisasi output sinyal yang diambil. - Noise Suppressor (NS) dengan
NoiseSuppressor
menghilangkan suara bising di latar belakang dari sinyal yang diambil.
Anda dapat menerapkan efek pra-pemroses ini pada audio yang direkam dengan AudioRecord
menggunakan salah satu subclass
AudioEffect
.
Catatan: Tidak ada jaminan bahwa semua perangkat mendukung efek
ini, jadi Anda harus selalu memeriksa ketersediaan terlebih dahulu dengan memanggil isAvailable()
di class efek audio
yang sesuai.
Pemutaran tanpa jeda
Sekarang Anda dapat melakukan pemutaran tanpa jeda di antara dua objek
MediaPlayer
terpisah. Kapan saja sebelum MediaPlayer
pertama selesai,
panggil setNextMediaPlayer()
dan Android
akan mencoba memulai pemutar kedua saat pemutar pertama berhenti.
Kamera
Gerakan fokus otomatis
Antarmuka baru Camera.AutoFocusMoveCallback
memungkinkan Anda memproses
perubahan pada gerakan fokus otomatis. Anda dapat mendaftarkan antarmuka dengan setAutoFocusMoveCallback()
. Kemudian, saat kamera
dalam mode fokus otomatis berkelanjutan (FOCUS_MODE_CONTINUOUS_VIDEO
atau
FOCUS_MODE_CONTINUOUS_PICTURE
), Anda akan menerima panggilan
ke onAutoFocusMoving()
,
yang memberi tahu Anda apakah fokus otomatis telah mulai bergerak atau telah berhenti bergerak.
Suara kamera
Class MediaActionSound
menyediakan kumpulan API sederhana untuk menghasilkan
suara standar yang dibuat oleh kamera atau tindakan media lainnya. Anda harus menggunakan API ini untuk memutar
suara yang sesuai saat mem-build kamera foto atau video kustom.
Untuk memutar suara, cukup buat instance objek MediaActionSound
, panggil
load()
untuk melakukan pramuat suara yang diinginkan, lalu pada
waktu yang tepat, panggil play()
.
Konektivitas
Android Beam
Android Beam™ kini mendukung transfer payload besar melalui Bluetooth. Saat Anda menentukan data
yang akan ditransfer dengan metode setBeamPushUris()
baru atau antarmuka callback NfcAdapter.CreateBeamUrisCallback
baru, Android
akan menyerahkan transfer data ke Bluetooth atau transpor alternatif lainnya untuk
mencapai kecepatan transfer yang lebih cepat. Hal ini sangat berguna untuk payload besar seperti file gambar dan
audio serta tidak memerlukan penyambungan yang terlihat antara perangkat. Aplikasi Anda tidak memerlukan tindakan tambahan
untuk memanfaatkan transfer melalui Bluetooth.
Metode setBeamPushUris()
menggunakan array
objek Uri
yang menentukan data yang ingin Anda transfer dari aplikasi.
Atau, Anda dapat mengimplementasikan antarmuka
NfcAdapter.CreateBeamUrisCallback
, yang dapat Anda tentukan untuk aktivitas dengan memanggil setBeamPushUrisCallback()
.
Saat menggunakan
antarmuka callback, sistem akan memanggil metode createBeamUris()
antarmuka saat
pengguna mengeksekusi pembagian dengan Android Beam sehingga Anda dapat menentukan URI yang akan dibagikan pada waktu berbagi.
Hal ini berguna jika URI yang akan dibagikan dapat bervariasi bergantung pada konteks pengguna dalam
aktivitas, sedangkan memanggil setBeamPushUris()
berguna ketika URI yang akan dibagikan tidak berubah dan Anda dapat dengan aman menentukannya terlebih dahulu.
Penemuan layanan jaringan
Android 4.1 menambahkan dukungan untuk penemuan layanan berbasis DNS multicast, yang memungkinkan Anda menemukan dan terhubung ke layanan yang ditawarkan oleh perangkat peer melalui Wi-Fi, seperti perangkat seluler, printer, kamera, pemutar media, dan lainnya yang terdaftar di jaringan lokal.
Paket baru android.net.nsd
berisi API baru yang memungkinkan Anda
menyiarkan layanan di jaringan lokal, menemukan perangkat lokal di jaringan, dan
terhubung ke perangkat.
Untuk mendaftarkan layanan, Anda harus membuat objek NsdServiceInfo
terlebih dahulu dan menentukan berbagai properti layanan dengan metode seperti setServiceName()
, setServiceType()
, dan setPort()
.
Kemudian, Anda perlu menerapkan NsdManager.RegistrationListener
dan meneruskannya ke registerService()
dengan NsdServiceInfo
.
Untuk menemukan layanan di jaringan, terapkan NsdManager.DiscoveryListener
dan teruskan ke discoverServices()
.
Saat NsdManager.DiscoveryListener
menerima callback tentang layanan yang ditemukan, Anda harus menyelesaikan layanan dengan memanggil resolveService()
, dengan meneruskan implementasi NsdManager.ResolveListener
yang menerima objek NsdServiceInfo
yang berisi informasi tentang layanan yang ditemukan, sehingga Anda dapat memulai koneksi.
Penemuan layanan P2P Wi-Fi
API Wi-Fi P2P ditingkatkan di Android 4.1 untuk mendukung penemuan layanan pra-asosiasi di
WifiP2pManager
. Dengan begitu, Anda dapat menemukan dan memfilter perangkat
terdekat berdasarkan layanan menggunakan Wi-Fi P2P sebelum terhubung ke salah satunya, sedangkan Penemuan
Layanan Jaringan memungkinkan Anda menemukan layanan di jaringan yang terhubung (seperti jaringan Wi-Fi
lokal).
Untuk menyiarkan aplikasi sebagai layanan melalui Wi-Fi sehingga perangkat lain dapat menemukan
aplikasi Anda dan terhubung ke aplikasi tersebut, panggil addLocalService()
dengan
objek WifiP2pServiceInfo
yang mendeskripsikan layanan aplikasi Anda.
Untuk memulai penemuan perangkat di sekitar melalui Wi-Fi, Anda harus terlebih dahulu memutuskan apakah akan
berkomunikasi menggunakan Bonjour atau Upnp. Untuk menggunakan Bonjour, siapkan beberapa pemroses callback terlebih dahulu dengan
setDnsSdResponseListeners()
, yang menggunakan WifiP2pManager.DnsSdServiceResponseListener
dan WifiP2pManager.DnsSdTxtRecordListener
. Untuk menggunakan Upnp, panggil
setUpnpServiceResponseListener()
, yang menggunakan WifiP2pManager.UpnpServiceResponseListener
.
Sebelum Anda dapat mulai menemukan layanan di perangkat lokal, Anda juga perlu memanggil addServiceRequest()
. Saat WifiP2pManager.ActionListener
yang Anda teruskan ke metode ini menerima
callback yang berhasil, Anda dapat mulai menemukan layanan di perangkat lokal dengan memanggil discoverServices()
.
Saat layanan lokal ditemukan, Anda akan menerima callback ke WifiP2pManager.DnsSdServiceResponseListener
atau WifiP2pManager.UpnpServiceResponseListener
, bergantung pada apakah Anda
mendaftar untuk menggunakan Bonjour atau Upnp. Callback yang diterima dalam kedua kasus tersebut berisi
objek WifiP2pDevice
yang mewakili perangkat peer.
Penggunaan jaringan
Metode baru isActiveNetworkMetered()
memungkinkan Anda
memeriksa apakah perangkat saat ini terhubung ke jaringan berbayar. Dengan memeriksa status ini
sebelum melakukan transaksi jaringan yang intensif, Anda dapat membantu mengelola penggunaan data yang dapat membebani pengguna dan membuat
keputusan yang tepat tentang apakah akan melakukan transaksi sekarang atau nanti (seperti saat
perangkat terhubung ke Wi-Fi).
Aksesibilitas
API layanan aksesibilitas
Jangkauan API layanan aksesibilitas telah meningkat secara signifikan di Android 4.1. Sekarang,
Anda dapat membuat layanan yang memantau dan merespons lebih banyak peristiwa input, seperti gestur kompleks
menggunakan onGesture()
dan peristiwa
input lainnya melalui penambahan ke class AccessibilityEvent
, AccessibilityNodeInfo
, dan AccessibilityRecord
.
Layanan aksesibilitas juga dapat melakukan tindakan atas nama pengguna, termasuk mengklik,
men-scroll, dan menelusuri teks menggunakan performAction
dan setMovementGranularities
. Metode performGlobalAction()
juga memungkinkan layanan melakukan tindakan seperti Kembali, Beranda, dan membuka Aplikasi
Terbaru dan Notifikasi.
Navigasi aplikasi yang dapat disesuaikan
Saat mem-build aplikasi Android, Anda kini dapat menyesuaikan skema navigasi dengan menemukan elemen
yang dapat difokuskan dan widget input menggunakan findFocus()
dan focusSearch()
, serta menetapkan fokus
menggunakan setAccessibilityFocused()
.
Widget yang lebih mudah diakses
Class android.view.accessibility.AccessibilityNodeProvider
baru memungkinkan Anda
menampilkan tampilan kustom yang kompleks ke layanan aksesibilitas sehingga dapat menyajikan informasi dengan
cara yang lebih mudah diakses. android.view.accessibility.AccessibilityNodeProvider
memungkinkan widget pengguna dengan konten lanjutan, seperti petak kalender, untuk menyajikan struktur semantik logis untuk layanan aksesibilitas yang sepenuhnya terpisah dari struktur tata letak widget. Struktur
semantik ini memungkinkan layanan aksesibilitas menampilkan model interaksi yang lebih berguna bagi pengguna yang
menderita gangguan penglihatan.
Menyalin dan Menempel
Menyalin dan menempel dengan intent
Sekarang Anda dapat mengaitkan objek ClipData
dengan Intent
menggunakan metode setClipData()
.
Hal ini sangat berguna saat menggunakan intent untuk mentransfer beberapa URI content:
ke aplikasi
lain, seperti saat berbagi beberapa dokumen. URI content:
yang disediakan
dengan cara ini juga akan mengikuti tanda intent untuk menawarkan akses baca atau tulis, sehingga Anda dapat memberikan
akses ke beberapa URI dalam intent. Saat memulai intent ACTION_SEND
atau ACTION_SEND_MULTIPLE
, URI yang disediakan dalam intent kini
otomatis disebarkan ke ClipData
sehingga penerima dapat
mendapatkan akses yang diberikan kepada mereka.
Dukungan untuk gaya HTML dan string
Class ClipData
kini mendukung teks bergaya (baik sebagai HTML maupun
string bergaya Android). Anda dapat menambahkan teks bergaya HTML ke ClipData
dengan newHtmlText()
.
Renderscript
Fungsi komputasi Renderscript telah ditingkatkan dengan fitur berikut:
- Dukungan untuk beberapa kernel dalam satu skrip.
- Dukungan untuk membaca dari alokasi dengan sampler yang difilter dari komputasi dalam API skrip baru
rsSample
. - Dukungan untuk berbagai tingkat presisi FP di
#pragma
. - Dukungan untuk membuat kueri informasi tambahan dari objek RS dari skrip komputasi.
- Banyak peningkatan performa.
Pragma baru juga tersedia untuk menentukan presisi floating point yang diperlukan oleh Renderscript komputasi Anda. Hal ini memungkinkan Anda mengaktifkan operasi seperti NEON, seperti operasi matematika vektor cepat di jalur CPU yang sebelumnya tidak mungkin dilakukan dengan standar IEEE 754-2008 penuh.
Catatan: Mesin grafis Renderscript eksperimental kini tidak digunakan lagi.
Animasi
Animasi peluncuran aktivitas
Anda kini dapat meluncurkan Activity
menggunakan animasi zoom atau
animasi kustom Anda sendiri. Untuk menentukan animasi yang Anda inginkan, gunakan ActivityOptions
API untuk mem-build Bundle
yang kemudian dapat
Anda teruskan ke salah satu
metode yang memulai aktivitas, seperti startActivity()
.
Class ActivityOptions
menyertakan metode yang berbeda untuk setiap
jenis animasi yang mungkin ingin Anda tampilkan saat aktivitas terbuka:
makeScaleUpAnimation()
- Membuat animasi yang menskalakan jendela aktivitas dari posisi awal yang ditentukan di layar dan ukuran awal yang ditentukan. Misalnya, layar utama di Android 4.1 menggunakannya saat membuka aplikasi.
makeThumbnailScaleUpAnimation()
- Membuat animasi yang menskalakan jendela aktivitas mulai dari posisi yang ditentukan dan gambar thumbnail yang disediakan. Misalnya, jendela Aplikasi Terbaru di Android 4.1 menggunakan ini saat kembali ke aplikasi.
makeCustomAnimation()
- Membuat animasi yang ditentukan oleh resource Anda sendiri: satu yang menentukan animasi untuk pembukaan aktivitas dan satu lagi untuk aktivitas yang dihentikan.
Animator waktu
TimeAnimator
baru menyediakan mekanisme callback sederhana
dengan TimeAnimator.TimeListener
yang memberi tahu
Anda pada setiap frame animasi. Tidak ada durasi, interpolasi, atau setelan nilai objek dengan Animator ini. Callback pemroses menerima informasi untuk setiap frame, termasuk total waktu berlalu dan waktu yang berlalu sejak frame animasi sebelumnya.
Antarmuka Pengguna
Notifikasi
Di Android 4.1, Anda dapat membuat notifikasi dengan region konten yang lebih besar, pratinjau gambar berukuran besar, beberapa tombol tindakan, dan prioritas yang dapat dikonfigurasi.
Gaya notifikasi
Metode baru setStyle()
memungkinkan Anda menentukan
salah satu dari tiga gaya baru untuk notifikasi yang masing-masing menawarkan wilayah konten yang lebih besar. Untuk
menentukan gaya untuk wilayah konten besar, teruskan setStyle()
salah satu objek berikut:
Notification.BigPictureStyle
- Untuk notifikasi yang menyertakan lampiran gambar besar.
Notification.BigTextStyle
- Untuk notifikasi yang menyertakan banyak teks, seperti satu email.
Notification.InboxStyle
- Untuk notifikasi yang menyertakan daftar string, seperti cuplikan dari beberapa email.
Tindakan notifikasi
Kini ada dukungan untuk maksimal dua tombol tindakan yang muncul di bagian bawah pesan notifikasi, baik notifikasi Anda menggunakan gaya normal atau lebih besar.
Untuk menambahkan tombol tindakan, panggil addAction()
. Metode ini menggunakan tiga argumen: resource drawable untuk ikon,
teks untuk tombol, dan PendingIntent
yang menentukan tindakan
yang akan dilakukan.
Prioritas
Sekarang Anda dapat memberi tahu sistem seberapa penting notifikasi Anda untuk memengaruhi
urutan notifikasi dalam daftar dengan menetapkan
prioritas dengan setPriority()
. Anda
dapat meneruskan salah satu dari lima tingkat prioritas yang berbeda yang ditentukan oleh konstanta PRIORITY_*
di class Notification
. Defaultnya adalah PRIORITY_DEFAULT
, dan ada dua tingkat di atas dan dua tingkat lebih rendah.
Notifikasi prioritas tinggi adalah hal yang umumnya ingin direspons pengguna dengan cepat, seperti pesan instan baru, pesan teks, atau pengingat acara yang akan datang. Notifikasi dengan prioritas rendah adalah hal-hal seperti acara kalender yang sudah tidak berlaku atau promosi aplikasi.
Kontrol untuk UI sistem
Android 4.0 (Ice Cream Sandwich) menambahkan flag baru untuk mengontrol visibilitas elemen UI
sistem, seperti untuk meredupkan tampilan panel sistem atau membuatnya menghilang sepenuhnya di handset.
Android 4.1 menambahkan beberapa flag lainnya yang memungkinkan Anda mengontrol tampilan elemen UI
sistem dan tata letak aktivitas lebih lanjut terkait elemen tersebut dengan memanggil setSystemUiVisibility()
dan meneruskan flag berikut:
SYSTEM_UI_FLAG_FULLSCREEN
- Menyembunyikan UI sistem yang tidak penting (seperti status bar).
Jika aktivitas Anda menggunakan panel tindakan dalam mode overlay (dengan
mengaktifkan
android:windowActionBarOverlay
), tanda ini juga akan menyembunyikan panel tindakan dan melakukannya dengan animasi terkoordinasi saat menyembunyikan dan menampilkan keduanya. SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- Menetapkan tata letak aktivitas agar dapat menggunakan area layar yang sama dengan yang tersedia saat Anda
mengaktifkan
SYSTEM_UI_FLAG_FULLSCREEN
meskipun elemen UI sistem masih terlihat. Meskipun bagian tata letak Anda akan ditempatkan di atas UI sistem, hal ini berguna jika aplikasi Anda sering menyembunyikan dan menampilkan UI sistem denganSYSTEM_UI_FLAG_FULLSCREEN
, karena hal ini mencegah tata letak Anda menyesuaikan dengan batas tata letak baru setiap kali UI sistem disembunyikan atau muncul. SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- Menetapkan tata letak aktivitas agar dapat menggunakan area layar yang sama dengan yang tersedia saat Anda
mengaktifkan
SYSTEM_UI_FLAG_HIDE_NAVIGATION
(ditambahkan di Android 4.0) meskipun elemen UI sistem masih terlihat. Meskipun bagian tata letak Anda akan ditempatkan di atas menu navigasi, hal ini berguna jika aplikasi Anda sering menyembunyikan dan menampilkan menu navigasi denganSYSTEM_UI_FLAG_HIDE_NAVIGATION
, karena hal ini menghindari tata letak Anda menyesuaikan dengan batas tata letak baru setiap kali menu navigasi disembunyikan atau muncul. SYSTEM_UI_FLAG_LAYOUT_STABLE
- Anda mungkin ingin menambahkan tanda ini jika menggunakan
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
dan/atauSYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
untuk memastikan bahwa saat Anda memanggilfitSystemWindows()
pada tampilan, batas yang ditentukan tetap konsisten sehubungan dengan ruang layar yang tersedia. Artinya, dengan menetapkan tanda ini,fitSystemWindows()
akan berperilaku seolah-olah visibilitas elemen UI sistem tidak berubah, bahkan setelah Anda menyembunyikan semua UI sistem.
Untuk diskusi lebih lanjut tentang flag UI sistem terkait lainnya, baca tentang flag yang ditambahkan di Android 4.0.
Tampilan jarak jauh
GridLayout
dan ViewStub
kini menjadi tampilan yang dapat di-remote sehingga Anda dapat menggunakannya dalam tata letak untuk
widget aplikasi dan tata letak kustom notifikasi.
Jenis font
Android 4.1 menambahkan beberapa varian gaya font Roboto lainnya dengan total 10 varian, dan semuanya dapat digunakan oleh aplikasi. Aplikasi Anda kini memiliki akses ke kumpulan lengkap varian terang dan ringkas.
Rangkaian lengkap varian font Roboto yang tersedia adalah:
- Rutin
- Miring
- Tebal
- Tebal-miring
- Ringan
- Miring-tipis
- Reguler yang dipadatkan
- Miring rapat
- Tebal ringkas
- Tebal-miring ringkas
Anda dapat menerapkan salah satu dari atribut ini dengan atribut fontFamily
baru yang dikombinasikan dengan atribut textStyle
.
Nilai yang didukung untuk fontFamily
adalah:
"sans-serif"
untuk Roboto reguler"sans-serif-light"
untuk Roboto Light"sans-serif-condensed"
untuk Roboto Condensed
Kemudian, Anda dapat menerapkan cetak tebal dan/atau miring dengan nilai textStyle
"bold"
dan "italic"
. Anda dapat menerapkan keduanya seperti ini: android:textStyle="bold|italic"
.
Anda juga dapat menggunakan Typeface.create()
.
Misalnya, Typeface.create("sans-serif-light", Typeface.NORMAL)
.
Framework Input
Beberapa perangkat input
Class InputManager
yang baru memungkinkan Anda membuat kueri
kumpulan perangkat input yang saat ini terhubung dan didaftarkan agar diberi tahu saat perangkat baru
ditambahkan, diubah, atau dihapus. Hal ini sangat berguna jika Anda membuat game
yang mendukung beberapa pemain dan ingin mendeteksi jumlah pengontrol yang terhubung
dan jika ada perubahan jumlah pengontrol.
Anda dapat mengkueri semua perangkat input yang terhubung dengan memanggil
getInputDeviceIds()
. Tindakan ini akan menampilkan
array bilangan bulat, yang masing-masing merupakan ID untuk perangkat input yang berbeda. Kemudian, Anda dapat memanggil
getInputDevice()
untuk mendapatkan
InputDevice
untuk ID perangkat input yang ditentukan.
Jika Anda ingin diberi tahu saat perangkat input baru terhubung, diubah, atau terputus,
implementasikan antarmuka InputManager.InputDeviceListener
dan
daftarkan dengan registerInputDeviceListener()
.
Getar untuk pengontrol input
Jika perangkat input yang terhubung memiliki kemampuan getarnya sendiri, kini Anda dapat mengontrol
getaran perangkat tersebut menggunakan Vibrator
API yang ada hanya
dengan memanggil getVibrator()
di InputDevice
.
Izin
Berikut adalah izin baru:
READ_EXTERNAL_STORAGE
- Memberikan akses baca yang dilindungi ke penyimpanan eksternal. Di Android 4.1, secara default semua aplikasi masih memiliki akses baca. Hal ini akan diubah dalam rilis mendatang untuk mewajibkan aplikasi secara eksplisit meminta akses baca menggunakan izin ini. Jika aplikasi Anda sudah meminta akses tulis, aplikasi tersebut juga akan otomatis mendapatkan akses baca. Ada opsi developer baru untuk mengaktifkan pembatasan akses baca, bagi developer untuk menguji aplikasi mereka terhadap perilaku Android di masa mendatang.
- android.Manifest.permission.READ_USER_DICTIONARY
- Mengizinkan aplikasi membaca kamus pengguna. Hal ini hanya boleh diperlukan oleh IME, atau editor kamus seperti aplikasi Setelan.
READ_CALL_LOG
- Mengizinkan aplikasi membaca log panggilan sistem yang berisi informasi tentang panggilan masuk dan keluar.
WRITE_CALL_LOG
- Mengizinkan aplikasi mengubah log panggilan sistem yang disimpan di ponsel Anda
- android.Manifest.permission.WRITE_USER_DICTIONARY
- Mengizinkan aplikasi menulis ke kamus kata pengguna.
Fitur Perangkat
Android 4.1 menyertakan deklarasi fitur baru untuk perangkat yang dikhususkan
untuk menampilkan antarmuka pengguna di layar televisi: FEATURE_TELEVISION
. Untuk mendeklarasikan bahwa aplikasi Anda memerlukan
antarmuka televisi, deklarasikan fitur ini dalam file manifes dengan elemen <uses-feature>
:
<manifest ... > <uses-feature android:name="android.hardware.type.television" android:required="true" /> ... </manifest>
Fitur ini menentukan "televisi" sebagai pengalaman televisi khas untuk ruang tamu: ditampilkan pada layar TV, dengan pengguna duduk jauh dari layar dan bentuk input yang banyak dipakai adalah sesuatu seperti d-pad, dan biasanya tidak melalui sentuhan atau mouse/perangkat pointer.