Level API: 16
Android 4.1 (JELLY_BEAN
)
adalah perkembangan dari platform yang menawarkan
performa dan pengalaman pengguna yang lebih baik. Update ini menambahkan fitur baru bagi pengguna dan aplikasi
developer. Dokumen ini memberikan pengantar tentang hal-hal yang paling penting dan
API baru yang berguna bagi developer aplikasi.
Sebagai pengembang aplikasi, Android 4.1 tersedia untuk Anda dari SDK Manager sebagai image sistem. Anda dapat berjalan di emulator Android dan platform SDK yang dapat Anda gunakan untuk membangun aplikasi. Anda seharusnya download image sistem dan platform sesegera mungkin untuk membangun 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"
, instal pada image sistem Android 4.1,
mengujinya, lalu mempublikasikan
pembaruan dengan perubahan ini.
Anda
dapat menggunakan API di Android 4.1 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?
Komponen Aplikasi
Layanan terisolasi
Dengan menentukan android:isolatedProcess="true"
di
tag <service>
, Service
Anda akan berjalan pada
proses ID pengguna terisolasinya sendiri
yang tidak memiliki izin sendiri.
Manajemen memori
Konstanta ComponentCallbacks2
baru seperti TRIM_MEMORY_RUNNING_LOW
dan TRIM_MEMORY_RUNNING_CRITICAL
menyediakan latar depan
memproses informasi
lebih lanjut tentang
status memori sebelum sistem memanggil onLowMemory()
.
Metode getMyMemoryState(ActivityManager.RunningAppProcessInfo)
baru memungkinkan Anda untuk
mengambil status memori umum.
Penyedia konten
Metode baru, acquireUnstableContentProviderClient()
, memungkinkan Anda mengakses ContentProviderClient
yang mungkin "tidak stabil" sedemikian rupa sehingga aplikasi Anda tidak akan error jika
yang dilakukan penyedia konten. Hal ini berguna ketika Anda berinteraksi dengan penyedia konten secara
.
Wallpaper Animasi
Protokol intent baru untuk langsung meluncurkan aktivitas pratinjau wallpaper animasi sehingga Anda dapat membantu pengguna dengan mudah memilih wallpaper animasi Anda tanpa memaksa mereka untuk keluar aplikasi Anda dan buka pemilih wallpaper Beranda.
Untuk meluncurkan pemilih wallpaper animasi, panggil startActivity()
dengan Intent
menggunakan
ACTION_CHANGE_LIVE_WALLPAPER
dan lainnya
yang menentukan ComponentName
wallpaper animasi Anda sebagai string di EXTRA_LIVE_WALLPAPER_COMPONENT
.
Navigasi stack aplikasi
Android 4.1 memudahkan penerapan pola desain yang tepat untuk navigasi Naik.
Yang perlu Anda lakukan adalah menambahkan android:parentActivityName
ke setiap elemen <activity>
di
file manifes Anda. Sistem menggunakan informasi ini untuk membuka aktivitas yang sesuai ketika pengguna
menekan tombol Atas dalam bilah tindakan (sekaligus menyelesaikan aktivitas saat ini). Jadi jika Anda
mendeklarasikan android:parentActivityName
untuk setiap aktivitas, Anda tidak memerlukan metode onOptionsItemSelected()
untuk menangani klik
pada ikon aplikasi bilah tindakan—sistem akan menangani peristiwa itu dan melanjutkan
membuat aktivitas yang sesuai.
Hal ini sangat berguna untuk skenario saat pengguna memasuki salah satu aktivitas aplikasi Anda.
melalui "pembahasan mendalam" seperti dari notifikasi atau intent dari
aplikasi yang berbeda (seperti yang dijelaskan dalam panduan desain untuk Menavigasi Antar-Aplikasi). Kapan
pengguna memasuki aktivitas Anda dengan cara ini, aplikasi Anda mungkin secara alami tidak memiliki
aktivitas yang dapat dilanjutkan saat pengguna menavigasi ke atas. Namun, jika Anda menyediakan atribut android:parentActivityName
untuk aktivitas, sistem akan mengenali
apakah aplikasi Anda sudah berisi data sebelumnya aktivitas induk dan, jika belum, konstruksi
data sebelumnya yang sintetis
yang berisi semua aktivitas induk.
Catatan: Saat pengguna memasuki aktivitas mendalam di aplikasi Anda dan Ini membuat tugas baru untuk aplikasi Anda, sistem sebenarnya menyisipkan tumpukan aktivitas induk ke dalam tugas. Dengan demikian, menekan tombol Kembali juga akan mengarahkan kembali melalui tumpukan induk aktivitas Anda.
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
diharapkan membuat pengguna menavigasi
sampai
pada setiap aktivitas. Jika salah satu aktivitas induk biasanya menampilkan UI yang bergantung pada
konteks pengguna, informasi konteks tersebut akan
hilang dan Anda harus menyampaikannya ketika
nama
menavigasi kembali melalui tumpukan. Misalnya, jika pengguna melihat album
di aplikasi musik, navigasi ke atas dapat membawa mereka ke aktivitas yang mencantumkan semua album dalam
genre musik. Dalam hal ini, jika stack harus dibuat, Anda harus memberi tahu induk
genre album saat ini berada sehingga orang tua dapat menampilkan daftar yang tepat sebagai
jika pengguna benar-benar
berasal dari aktivitas tersebut. Untuk mengirimkan informasi tersebut ke induk sintetis
aktivitas Anda, Anda harus mengganti metode onPrepareNavigateUpTaskStack()
. Ini
memberi Anda objek TaskStackBuilder
yang dibuat sistem untuk
menyintesis aktivitas induk. TaskStackBuilder
berisi objek Intent
yang digunakan sistem untuk membuat setiap aktivitas induk. Di
implementasi onPrepareNavigateUpTaskStack()
, Anda dapat memodifikasi Intent
yang sesuai untuk
menambahkan data tambahan yang bisa digunakan aktivitas induk untuk menentukan konteks dan tampilan yang sesuai
UI yang sesuai.
Saat membuat TaskStackBuilder
, sistem akan menambahkan objek Intent
yang digunakan untuk membuat aktivitas induk dalam logika
urutan mulai 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 terlebih dahulu
panjang array dengan getIntentCount()
dan meneruskan
nilai ke editIntentAt()
.
Jika struktur aplikasi Anda lebih kompleks, ada beberapa API lain yang memungkinkan Anda menangani perilaku navigasi Naik dan menyesuaikan data sintetis sebelumnya. Beberapa API yang memberi Anda termasuk:
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 diberikan. Jika aktivitas ada di data sebelumnya, tetapi bukan induk terdekat, maka semua aktivitas lain antara aktivitas saat ini dan aktivitas yang ditetapkan dengan intent juga akan diselesaikan. getParentActivityIntent()
- Panggil ini untuk mendapatkan
Intent
yang akan memulai proses logika induk untuk aktivitas saat ini. shouldUpRecreateTask(Intent)
- Panggil ini untuk mengkueri apakah data sintetis sebelumnya harus dibuat untuk menavigasi ke atas. Menampilkan true (benar) jika tumpukan sintetis harus dibuat, false jika tumpukan yang sesuai sudah ada.
finishAffinity()
- Panggil ini untuk menyelesaikan aktivitas saat ini dan semua aktivitas orang tua dengan aktivitas yang sama
afinitas tugas yang dirantai dengan aktivitas saat ini.
Jika Anda mengganti perilaku default seperti
onNavigateUp()
, Anda harus memanggil metode ini saat membuat data sintetis sebelumnya melalui navigasi Naik. onCreateNavigateUpTaskStack
- Ganti opsi ini jika Anda perlu mengontrol sepenuhnya cara stack tugas sintetis dibuat. Jika Anda 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 mengimplementasikan 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 tingkat rendah untuk encoding
dan mendekode media Anda. Anda dapat membuat instance MediaCodec
dengan memanggil createEncoderByType()
untuk mengenkode media atau memanggil createDecoderByType()
untuk mendekode media. Tiap-tiap
mengambil jenis MIME untuk jenis media yang ingin Anda enkode atau dekode, seperti "video/3gpp"
atau "audio/vorbis"
.
Setelah instance MediaCodec
dibuat, Anda dapat memanggil configure()
untuk menentukan properti seperti format media atau
apakah konten dienkripsi atau tidak.
Baik Anda mengenkode atau mendekode media Anda, proses lainnya akan tetap sama setelah Anda
membuat MediaCodec
. Pertama, panggil getInputBuffers()
untuk mendapatkan array input ByteBuffer
dan getOutputBuffers()
untuk mendapatkan array objek ByteBuffer
output.
Setelah Anda siap mengenkode atau mendekode, panggil dequeueInputBuffer()
untuk mendapatkan posisi indeks ByteBuffer
(dari array buffer input) yang harus Anda gunakan untuk melakukan feed di sumber
lainnya. Setelah Anda mengisi ByteBuffer
dengan media sumber, lepaskan kepemilikan
buffer dengan memanggil queueInputBuffer()
.
Demikian pula untuk buffer output, panggil dequeueOutputBuffer()
untuk mendapatkan posisi indeks ByteBuffer
tempat Anda akan menerima hasilnya. Setelah Anda membaca output dari ByteBuffer
,
melepaskan kepemilikan dengan memanggil releaseOutputBuffer()
.
Anda dapat menangani data media terenkripsi dalam codec dengan memanggil queueSecureInputBuffer()
bersamaan dengan
MediaCrypto
API, bukan queueInputBuffer()
normal.
Untuk mengetahui informasi selengkapnya tentang cara menggunakan codec, lihat dokumentasi MediaCodec
.
Rekam audio saat isyarat
Metode baru startRecording()
memungkinkan
Anda untuk 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
putar nada audio yang menunjukkan awal sesi perekaman dan perekaman
dimulai secara otomatis sehingga Anda tidak perlu
rekaman.
Trek teks dengan waktu
MediaPlayer
kini menangani trek teks in-band dan out-of-band.
Trek teks in-band hadir sebagai trek teks dalam sumber media MP4 atau 3GPP. Teks yang tidak umum
trek dapat ditambahkan sebagai sumber teks eksternal melalui metode addTimedTextSource()
. Setelah semua teks eksternal
sumber trek ditambahkan, getTrackInfo()
harus dipanggil untuk mendapatkan
daftar yang diperbarui dari semua {i>track<i} yang tersedia dalam sumber data.
Untuk menyetel jalur agar digunakan dengan MediaPlayer
, Anda harus
panggil selectTrack()
, menggunakan indeks
untuk trek yang ingin Anda gunakan.
Agar diberi tahu saat trek teks siap diputar, implementasikan metode
Antarmuka dan kartu MediaPlayer.OnTimedTextListener
menjadi setOnTimedTextListener()
.
Efek audio
Class AudioEffect
kini mendukung audio tambahan
jenis pra-pemrosesan saat merekam audio:
- Acoustic Echo Canceler (AEC) dengan
AcousticEchoCanceler
menghapus kontribusi sinyal yang diterima dari pihak jarak jauh dari sinyal audio yang direkam. - Kontrol Perolehan Otomatis (AGC) dengan
AutomaticGainControl
menormalkan output sinyal yang ditangkap secara otomatis. - Peredam Bising (NS) dengan
NoiseSuppressor
menghilangkan suara bising di latar belakang dari sinyal yang ditangkap.
Anda dapat menerapkan efek pra-pemroses ini pada audio yang direkam dengan AudioRecord
menggunakan salah satu AudioEffect
subclass Keras.
Catatan: Tidak ada jaminan bahwa semua perangkat mendukung
sehingga Anda harus selalu memeriksa ketersediaan terlebih dahulu dengan memanggil isAvailable()
pada
class efek audio.
Pemutaran tanpa celah
Anda kini dapat melakukan pemutaran tanpa jeda antara dua pemutaran
Objek MediaPlayer
. Kapan saja sebelum MediaPlayer
pertama Anda selesai,
panggil setNextMediaPlayer()
dan Android
mencoba memulai pemain kedua saat pemutar pertama berhenti.
Kamera
Gerakan fokus otomatis
Antarmuka baru Camera.AutoFocusMoveCallback
memungkinkan Anda memproses
untuk perubahan pada gerakan fokus otomatis. Anda dapat mendaftarkan antarmuka dengan setAutoFocusMoveCallback()
. Kemudian ketika kamera
berada 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
suara yang sesuai saat membuat kamera video atau diam khusus.
Untuk memutar suara, cukup buat instance objek MediaActionSound
, panggil
load()
untuk melakukan pramuat suara yang diinginkan, lalu pada
pada waktu yang tepat, panggil play()
.
Konektivitas
Android Beam
Android BeamTM kini mendukung transfer payload besar melalui Bluetooth. Ketika Anda mendefinisikan data
untuk ditransfer dengan setBeamPushUris()
baru
atau antarmuka callback baru NfcAdapter.CreateBeamUrisCallback
, Android
menyerahkan transfer data ke Bluetooth
atau transportasi alternatif lain ke
mencapai kecepatan
transfer yang lebih cepat. Ini sangat berguna untuk {i>payload<i}
yang besar seperti gambar dan
file audio dan tidak memerlukan penyambungan antarperangkat. Tidak ada pekerjaan tambahan
yang dibutuhkan oleh
aplikasi Anda untuk memanfaatkan
transfer melalui Bluetooth.
Metode setBeamPushUris()
mengambil array
Objek Uri
yang menentukan data yang ingin ditransfer dari aplikasi Anda.
Atau, Anda dapat mengimplementasikan NfcAdapter.CreateBeamUrisCallback
, yang dapat Anda tetapkan untuk aktivitas dengan memanggil setBeamPushUrisCallback()
.
Saat menggunakan
antarmuka callback, sistem akan memanggil metode createBeamUris()
antarmuka saat metode
pengguna mengeksekusi berbagi 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()
adalah
berguna saat URI yang akan dibagikan tidak berubah dan Anda dapat menentukannya terlebih dahulu dengan aman.
Penemuan layanan jaringan
Android 4.1 menambahkan dukungan untuk penemuan layanan berbasis DNS multicast, yang memungkinkan Anda untuk menemukan dan terhubung ke layanan yang ditawarkan oleh perangkat pembanding 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 untuk
menyiarkan layanan Anda di jaringan lokal, menemukan perangkat lokal di jaringan, dan
menghubungkan ke perangkat.
Untuk mendaftarkan layanan, Anda harus membuat NsdServiceInfo
terlebih dahulu
dan menentukan berbagai properti layanan dengan metode seperti
setServiceName()
,
setServiceType()
, dan
setPort()
.
Kemudian, Anda perlu mengimplementasikan NsdManager.RegistrationListener
dan teruskan ke registerService()
dengan NsdServiceInfo
Anda.
Untuk menemukan layanan di jaringan, terapkan NsdManager.DiscoveryListener
dan teruskan ke discoverServices()
.
Saat NsdManager.DiscoveryListener
menerima callback tentang layanan
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
Wi-Fi P2P API ditingkatkan di Android 4.1 untuk mendukung penemuan layanan pra-asosiasi di
WifiP2pManager
. Ini memungkinkan Anda menemukan dan memfilter di sekitar
perangkat dengan layanan menggunakan Wi-Fi P2P sebelum
terhubung ke satu perangkat, sementara Layanan Jaringan
Dengan Discovery, Anda dapat menemukan layanan pada jaringan terhubung yang ada (seperti jaringan Wi-Fi lokal
jaringan).
Untuk menyiarkan aplikasi Anda sebagai layanan melalui Wi-Fi agar 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, pertama-tama siapkan beberapa pemroses callback dengan
setDnsSdResponseListeners()
, yang menggunakan WifiP2pManager.DnsSdServiceResponseListener
dan WifiP2pManager.DnsSdTxtRecordListener
. Untuk menggunakan Upnp, panggil
setUpnpServiceResponseListener()
, yang menggunakan WifiP2pManager.UpnpServiceResponseListener
.
Sebelum Anda bisa mulai menemukan layanan di perangkat lokal, Anda juga perlu memanggil addServiceRequest()
. Saat WifiP2pManager.ActionListener
yang Anda teruskan ke metode ini menerima
callback 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
terdaftar untuk menggunakan Bonjour atau Upnp. Callback yang diterima dalam kedua kasus berisi sebuah
Objek WifiP2pDevice
yang mewakili perangkat pembanding.
Penggunaan jaringan
Metode baru isActiveNetworkMetered()
memungkinkan Anda untuk
periksa apakah perangkat saat ini terhubung ke jaringan berkuota. Dengan memeriksa status ini
sebelum melakukan transaksi jaringan secara intensif, Anda dapat membantu mengelola penggunaan data yang mungkin memboroskan uang
keputusan berdasarkan informasi tentang apakah akan melakukan transaksi sekarang atau nanti (seperti ketika
perangkat Anda terhubung ke Wi-Fi).
Aksesibilitas
Accessibility Service API
Jangkauan API layanan aksesibilitas telah meningkat secara signifikan di Android 4.1. Sekarang
memungkinkan Anda membangun layanan yang memantau dan merespons lebih banyak peristiwa input, seperti gestur kompleks
menggunakan onGesture()
dan lainnya
memasukkan peristiwa 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 Terbaru
Aplikasi dan Notifikasi.
Navigasi aplikasi yang dapat disesuaikan
Saat membangun aplikasi Android, Anda kini dapat menyesuaikan skema navigasi dengan menemukan objek yang dapat difokuskan
elemen dan widget input menggunakan findFocus()
dan focusSearch()
, serta mengatur fokus
menggunakan setAccessibilityFocused()
.
Widget yang lebih mudah diakses
Class android.view.accessibility.AccessibilityNodeProvider
baru memungkinkan Anda untuk
memunculkan tampilan kustom yang kompleks ke layanan aksesibilitas sehingga dapat menyajikan informasi
cara yang lebih mudah diakses. android.view.accessibility.AccessibilityNodeProvider
memungkinkan pengguna
dengan konten lanjutan, seperti petak kalender, untuk menyajikan struktur semantik logis untuk
layanan aksesibilitas yang sepenuhnya terpisah dari struktur tata letak widget. Semantik ini
memungkinkan layanan aksesibilitas untuk
memberikan model interaksi yang lebih berguna bagi pengguna
penyandang disabilitas netra.
Menyalin dan Menempel
Menyalin dan menempel dengan intent
Anda kini dapat mengaitkan objek ClipData
dengan Intent
menggunakan metode setClipData()
.
Hal ini sangat berguna saat menggunakan intent untuk mentransfer beberapa URI content:
ke URI lainnya
seperti saat berbagi beberapa dokumen. URI content:
yang disediakan
cara ini juga akan mengikuti flag intent untuk memberikan akses baca atau tulis, sehingga Anda dapat
akses ke beberapa URI dalam intent. Saat memulai intent ACTION_SEND
atau ACTION_SEND_MULTIPLE
, URI yang disediakan di intent kini
secara otomatis disebarkan ke ClipData
sehingga penerima dapat memiliki
akses yang diberikan
kepada mereka.
Dukungan untuk HTML dan gaya string
Class ClipData
kini mendukung teks bergaya (baik sebagai HTML atau
Bergaya Android
string). 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 mengkueri 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. Ini memungkinkan Anda mengaktifkan operasi seperti neon neon seperti operasi matematika vektor yang cepat jalur CPU yang tidak mungkin dilakukan dengan standar IEEE 754-2008 lengkap.
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 membuat Bundle
yang dapat Anda
lalu teruskan ke salah satu
metode yang memulai aktivitas, seperti startActivity()
.
Class ActivityOptions
menyertakan metode yang berbeda untuk masing-masing
jenis animasi yang mungkin ingin Anda tampilkan saat aktivitas terbuka:
makeScaleUpAnimation()
- Membuat animasi yang meningkatkan skala periode aktivitas dari awal yang ditentukan posisi layar pada layar dan ukuran awal yang ditentukan. Misalnya, layar beranda di Android 4.1 menggunakannya saat membuka aplikasi.
makeThumbnailScaleUpAnimation()
- Membuat animasi yang meningkatkan skala periode aktivitas mulai dari yang ditentukan dan gambar thumbnail yang diberikan. Misalnya, jendela Aplikasi Terbaru di Android 4.1 menggunakannya saat kembali ke aplikasi.
makeCustomAnimation()
- Membuat animasi yang ditentukan oleh resource Anda sendiri: yang menentukan animasi untuk pembukaan aktivitas dan satu lagi untuk aktivitas yang dihentikan.
Animator waktu
TimeAnimator
baru memberikan callback sederhana
mekanisme dengan TimeAnimator.TimeListener
yang memberi tahu
Anda ke setiap
{i>frame<i} 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 berlalu sejak frame animasi sebelumnya.
Antarmuka Pengguna
Notifikasi
Di Android 4.1, Anda dapat membuat notifikasi dengan wilayah konten yang lebih besar, pratinjau gambar lebih dari satu tombol tindakan, dan prioritas yang dapat dikonfigurasi.
Gaya notifikasi
Metode baru setStyle()
memungkinkan Anda menentukan
satu dari tiga gaya baru untuk notifikasi Anda yang masing-masing menawarkan region konten yang lebih luas. Kepada
menentukan gaya untuk region konten yang luas, teruskan salah satu objek berikut ke setStyle()
:
Notification.BigPictureStyle
- Untuk notifikasi yang menyertakan lampiran gambar besar.
Notification.BigTextStyle
- Untuk notifikasi yang mencakup banyak teks, seperti satu email.
Notification.InboxStyle
- Untuk notifikasi yang menyertakan daftar string, seperti cuplikan dari beberapa email.
Tindakan notifikasi
Sekarang ada dukungan untuk hingga dua tombol tindakan yang muncul di bagian bawah pesan notifikasi, baik notifikasi Anda menggunakan gaya normal atau yang lebih besar.
Untuk menambahkan tombol tindakan, panggil addAction()
. Metode ini menggunakan tiga argumen: sumber daya drawable untuk ikon,
teks untuk tombol, dan PendingIntent
yang menentukan tindakan
untuk mewujudkannya.
Prioritas
Anda sekarang dapat mengisyaratkan kepada sistem betapa pentingnya notifikasi Anda untuk memengaruhi
urutan notifikasi Anda dalam daftar dengan mengatur
prioritas dengan setPriority()
. Anda
dapat meneruskan salah satu dari lima tingkat prioritas 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 biasanya ingin direspons cepat oleh pengguna, seperti pesan instan baru, pesan teks, atau pengingat acara yang akan datang. Prioritas rendah notifikasi adalah hal-hal seperti acara kalender yang sudah habis masa berlakunya atau promosi aplikasi.
Kontrol untuk UI sistem
Android 4.0 (Ice Cream Sandwich) menambahkan tanda baru untuk mengontrol visibilitas UI sistem
lainnya, misalnya untuk meredupkan tampilan bilah sistem atau menghilangkannya sama sekali pada handset.
Android 4.1 menambahkan beberapa flag lagi yang memungkinkan Anda untuk lebih mengontrol tampilan sistem
Elemen UI dan tata letak aktivitas Anda yang berkaitan dengannya dengan memanggil setSystemUiVisibility()
dan meneruskan flag berikut:
SYSTEM_UI_FLAG_FULLSCREEN
- Menyembunyikan UI sistem yang tidak penting (seperti status bar).
Jika aktivitas Anda menggunakan bilah tindakan dalam mode overlay (dengan
mengaktifkan
android:windowActionBarOverlay
), flag ini juga menyembunyikan panel tindakan dan dengan animasi yang terkoordinasi saat menyembunyikan dan menampilkan keduanya. SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- Setel tata letak aktivitas agar menggunakan area layar sama dengan yang tersedia saat Anda
mengaktifkan
SYSTEM_UI_FLAG_FULLSCREEN
meskipun elemen UI sistem masih terlihat. Meskipun sebagian tata letak Anda akan dihamparkan oleh UI sistem, ini berguna jika aplikasi Anda sering menyembunyikan dan menampilkan UI sistem denganSYSTEM_UI_FLAG_FULLSCREEN
, karena menghindari tata letak Anda dari menyesuaikan dengan batas tata letak baru setiap kali UI sistem bersembunyi atau muncul. SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- Setel tata letak aktivitas agar menggunakan area layar sama dengan yang tersedia saat Anda
mengaktifkan
SYSTEM_UI_FLAG_HIDE_NAVIGATION
(ditambahkan di Android 4.0) meskipun elemen UI sistem masih terlihat. Meskipun beberapa bagian dari tata letak akan ditempatkan oleh bilah navigasi, ini berguna jika aplikasi Anda sering menyembunyikan dan menampilkan bilah navigasi denganSYSTEM_UI_FLAG_HIDE_NAVIGATION
, karena menghindari tata letak Anda dari menyesuaikan ke batas tata letak baru setiap kali menu navigasi menyembunyikan atau muncul. SYSTEM_UI_FLAG_LAYOUT_STABLE
- Anda mungkin perlu 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 yang yang ditentukan tetap konsisten terkait 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 yang ditambahkan di Android 4.0.
Tampilan jarak jauh
GridLayout
dan ViewStub
sekarang menjadi tampilan yang dapat dipindahkan 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 dengan total 10 varian, dan mereka semua dapat digunakan oleh aplikasi. Aplikasi Anda sekarang memiliki akses ke rangkaian lengkap pencahayaan dan varian ringkas.
Rangkaian lengkap varian font Roboto yang tersedia adalah:
- Rutin
- Miring
- Tebal
- Tebal-miring
- Ringan
- Miring terang
- Padat reguler
- Miring dipadatkan
- Dipadatkan tebal
- Ringkas tebal-miring
Anda dapat menerapkan salah satunya dengan fontFamily
yang baru
bersama 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
Anda kemudian dapat menerapkan cetak tebal dan/atau miring dengan nilai textStyle
"bold"
dan "italic"
. Anda dapat menerapkan keduanya seperti berikut: 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
baru memungkinkan Anda membuat kueri
serangkaian perangkat input yang saat ini terhubung dan mendaftar agar diberi tahu jika ada perangkat baru
ditambahkan, diubah, atau dihapus. Hal ini sangat berguna jika Anda membangun game
yang mendukung banyak pemain dan Anda ingin
mendeteksi berapa banyak {i>controller<i} yang tersambung
dan ketika ada perubahan
pada jumlah {i>controller<i}.
Anda bisa melakukan kueri semua perangkat input yang terhubung dengan memanggil
getInputDeviceIds()
. Ini akan mengembalikan
array bilangan bulat, yang masing-masing merupakan ID untuk perangkat input yang berbeda. Anda kemudian dapat memanggil
getInputDevice()
untuk mengakuisisi
InputDevice
untuk ID perangkat input yang ditentukan.
Jika Anda ingin diberi tahu saat perangkat input
baru terhubung, berubah, atau terputus,
mengimplementasikan antarmuka InputManager.InputDeviceListener
dan
mendaftarkannya ke registerInputDeviceListener()
.
Getar untuk pengontrol input
Jika perangkat input yang terhubung memiliki kemampuan getarnya sendiri, Anda kini dapat mengontrol
getaran perangkat tersebut menggunakan Vibrator
API yang ada hanya
dengan memanggil getVibrator()
pada InputDevice
.
Izin
Berikut adalah izin baru:
READ_EXTERNAL_STORAGE
- Memberikan akses baca yang terlindungi ke penyimpanan eksternal. Di Android 4.1 oleh secara {i>default<i} semua aplikasi masih memiliki baca akses. Hal ini akan diubah dalam rilis mendatang untuk mewajibkan aplikasi meminta secara eksplisit akses baca dengan menggunakan izin akses ini. Jika aplikasi Anda sudah meminta akses tulis, aplikasi akan mendapatkan akses baca secara otomatis. Ada opsi developer baru untuk mengaktifkan akses baca , bagi developer untuk menguji aplikasi mereka terhadap perilaku Android dalam masa depan.
- android.Manifest.permission.READ_USER_DICTIONARY
- Mengizinkan aplikasi membaca kamus pengguna. Hal ini hanya 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
- Memungkinkan aplikasi menulis ke kamus kata pengguna.
Fitur Perangkat
Android 4.1 menyertakan pernyataan fitur baru untuk perangkat khusus
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 mendefinisikan "televisi" seperti penggunaan TV di ruang tamu pada umumnya: ditampilkan pada layar besar, di mana pengguna duduk jauh dan bentuk dominan input tersebut adalah sesuatu seperti d-pad, dan umumnya bukan melalui sentuhan atau mouse/perangkat pointer.