Android 4.1 API

Level API: 16

Android 4.1 (JELLY_BEAN) adalah progres platform yang menawarkan performa dan pengalaman pengguna yang lebih baik. API ini menambahkan fitur baru untuk pengguna dan developer aplikasi. Dokumen ini memberikan pengantar 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 untuk perangkat yang menjalankan Android 4.1, Anda harus menyetel targetSdkVersion ke "16", menginstalnya di image sistem Android 4.1, mengujinya, lalu memublikasikan update dengan perubahan ini.

Anda dapat menggunakan API di Android 4.1 sekaligus mendukung versi lama dengan menambahkan kondisi ke kode yang memeriksa API level sistem sebelum mengeksekusi API yang tidak didukung oleh minSdkVersion Anda. Untuk mempelajari lebih lanjut cara mempertahankan kompatibilitas mundur, baca Membuat UI yang Kompatibel dengan Mundur.

Informasi selengkapnya tentang cara kerja level API tersedia di bagian Apa yang dimaksud dengan API Level?

Komponen Aplikasi

Layanan terisolasi

Dengan menentukan android:isolatedProcess="true" dalam tag <service>, Service akan berjalan dalam proses ID pengguna yang terisolasi dan tidak memiliki izinnya sendiri.

Pengelolaan memori

Konstanta ComponentCallbacks2 baru seperti TRIM_MEMORY_RUNNING_LOW dan TRIM_MEMORY_RUNNING_CRITICAL memberikan informasi lebih lanjut tentang status memori ke proses latar depan 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 melakukannya. Berguna saat Anda berinteraksi dengan penyedia konten di aplikasi terpisah.

Wallpaper Animasi

Protokol intent baru untuk meluncurkan langsung aktivitas pratinjau wallpaper animasi sehingga Anda dapat membantu pengguna memilih wallpaper animasi dengan mudah tanpa memaksa mereka untuk keluar aplikasi dan membuka pemilih wallpaper Layar utama.

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 app stack

Android 4.1 mempermudah penerapan pola desain yang tepat untuk navigasi Naik. Anda hanya perlu menambahkan android:parentActivityName ke setiap elemen <activity> dalam file manifes. Sistem menggunakan informasi ini untuk membuka aktivitas yang sesuai ketika pengguna menekan tombol Atas di panel tindakan (sekaligus menyelesaikan aktivitas saat ini). Jadi, jika Anda mendeklarasikan android:parentActivityName untuk setiap aktivitas, Anda tidak memerlukan metode onOptionsItemSelected() untuk menangani peristiwa klik pada ikon aplikasi panel tindakan—sistem sekarang akan menangani peristiwa tersebut dan melanjutkan atau membuat aktivitas yang sesuai.

Hal ini sangat efektif untuk skenario saat 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). Jika pengguna memasuki aktivitas Anda dengan cara ini, aplikasi Anda mungkin secara alami tidak memiliki data sebelumnya aktivitas yang dapat dilanjutkan saat pengguna menavigasi ke atas. Namun, saat Anda menyediakan atribut android:parentActivityName untuk aktivitas, sistem akan mengenali apakah aplikasi Anda sudah berisi data sebelumnya dari aktivitas induk dan, jika belum, membuat data sebelumnya sintetis yang berisi semua aktivitas induk.

Catatan: Ketika pengguna memasukkan aktivitas mendalam di aplikasi Anda dan membuat tugas baru untuk aplikasi, sistem sebenarnya memasukkan tumpukan aktivitas induk ke dalam tugas. Oleh karena itu, menekan tombol Kembali juga akan membuka kembali tumpukan aktivitas induk.

Saat membuat data sebelumnya yang 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 dengan cara pengguna menavigasi secara natural melalui 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 tumpukan. Misalnya, jika pengguna melihat album di aplikasi musik, menavigasi ke atas mungkin akan membawa 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, sehingga 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(). Ini memberi Anda objek TaskStackBuilder yang dibuat sistem untuk menyintesis aktivitas induk. TaskStackBuilder berisi objek Intent yang digunakan sistem untuk membuat setiap aktivitas induk. Dalam implementasi onPrepareNavigateUpTaskStack(), Anda dapat memodifikasi 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 mulai dari bagian atas hierarki aktivitas. Jadi, Intent terakhir yang ditambahkan ke array internal adalah induk langsung dari aktivitas saat ini. Jika Anda ingin mengubah Intent untuk induk aktivitas, pertama-tama tentukan panjang array dengan getIntentCount() dan 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 menyesuaikan sepenuhnya data sintetis sebelumnya. Beberapa API yang memberi Anda kontrol tambahan meliputi:

onNavigateUp()
Ganti metode ini untuk melakukan tindakan kustom saat pengguna menekan tombol Atas.
navigateUpTo(Intent)
Panggil ini untuk menyelesaikan aktivitas saat ini dan membuka aktivitas yang ditunjukkan oleh Intent yang disediakan. Jika aktivitas tersebut ada di data sebelumnya, tetapi bukan merupakan induk terdekat, maka 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 menavigasi ke atas. Menampilkan nilai true jika stack sintetis harus dibuat, dan false 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 yang sintetis pada navigasi Naik.
onCreateNavigateUpTaskStack
Ganti ini jika Anda perlu mengontrol sepenuhnya cara pembuatan stack tugas sintetis. Jika Anda hanya ingin menambahkan beberapa data tambahan ke intent untuk data sebelumnya, sebaiknya ganti onPrepareNavigateUpTaskStack()

Namun, sebagian besar aplikasi tidak perlu menggunakan API ini atau menerapkan onPrepareNavigateUpTaskStack(), tetapi dapat mencapai perilaku yang tepat hanya dengan menambahkan android:parentActivityName ke setiap elemen <activity>.

Multimedia

Codec media

Class MediaCodec memberikan 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. Masing-masing metode ini menggunakan jenis MIME untuk jenis media yang ingin dienkode atau didekode, 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 selanjutnya akan tetap sama setelah Anda membuat MediaCodec. Pertama, panggil getInputBuffers() untuk mendapatkan array objek ByteBuffer input dan getOutputBuffers() untuk mendapatkan array objek ByteBuffer output.

Jika sudah siap mengenkode atau mendekode, panggil dequeueInputBuffer() untuk mendapatkan posisi indeks ByteBuffer (dari array buffering input) yang harus Anda gunakan untuk melakukan feed di media sumber. Setelah Anda mengisi ByteBuffer dengan media sumber, lepaskan kepemilikan buffer dengan memanggil queueInputBuffer().

Demikian juga 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() biasa.

Untuk mengetahui informasi selengkapnya tentang cara menggunakan codec, lihat dokumentasi MediaCodec.

Rekam audio saat isyarat

Metode baru startRecording() memungkinkan Anda memulai perekaman audio berdasarkan tanda yang ditentukan oleh MediaSyncEvent. MediaSyncEvent menentukan sesi audio (seperti sesi yang ditentukan oleh MediaPlayer), yang jika selesai, akan memicu perekam audio untuk memulai perekaman. Misalnya, Anda dapat menggunakan fungsi ini untuk memutar nada audio yang menunjukkan awal sesi perekaman dan perekaman akan dimulai secara otomatis sehingga Anda tidak perlu menyinkronkan nada dan awal rekaman secara manual.

Trek teks dengan waktu

MediaPlayer kini menangani trek teks in-band dan out-of-band. Trek teks in-band disertakan sebagai trek teks dalam sumber media MP4 atau 3GPP. Trek 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 terbaru 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 menerima 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:

  • Akustik Echo Canceler (AEC) dengan AcousticEchoCanceler menghapus kontribusi sinyal yang diterima dari pihak jarak jauh dari sinyal audio yang ditangkap.
  • Kontrol Perolehan Otomatis (AGC) dengan AutomaticGainControl secara otomatis menormalisasi output sinyal yang ditangkap.
  • Peredam Bising (NS) dengan NoiseSuppressor menghilangkan suara bising di latar belakang dari sinyal yang ditangkap.

Anda dapat menerapkan efek pra-prosesor ini pada audio yang diambil 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() pada class efek audio yang sesuai.

Pemutaran tanpa celah

Anda kini dapat melakukan pemutaran tanpa jeda antara dua objek MediaPlayer yang terpisah. Sebelum MediaPlayer pertama selesai, panggil setNextMediaPlayer() dan Android akan mencoba memulai pemain kedua saat pemain pertama berhenti.

Router media. API baru MediaRouter, MediaRouteActionProvider, dan MediaRouteButton menyediakan mekanisme dan UI standar untuk memilih tempat memutar media.

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 apakah fokus otomatis telah mulai bergerak atau berhenti bergerak.

Suara kamera

Class MediaActionSound menyediakan sekumpulan 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 membuat kamera diam atau video video kustom.

Untuk memutar suara, cukup buat instance objek MediaActionSound, panggil load() untuk memuat suara yang diinginkan terlebih dahulu, lalu panggil play() di waktu yang tepat.

Konektivitas

Android Beam

Android BeamTM kini mendukung transfer payload besar melalui Bluetooth. Saat Anda menentukan data yang akan ditransfer dengan metode setBeamPushUris() baru atau antarmuka callback NfcAdapter.CreateBeamUrisCallback yang baru, Android akan menyerahkan transfer data ke Bluetooth atau transport 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 antar-perangkat. Aplikasi tidak perlu melakukan tindakan tambahan apa pun untuk memanfaatkan transfer melalui Bluetooth.

Metode setBeamPushUris() mengambil array objek Uri yang menentukan data yang ingin ditransfer dari aplikasi. Atau, Anda dapat mengimplementasikan antarmuka NfcAdapter.CreateBeamUrisCallback, yang dapat ditentukan untuk aktivitas Anda 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. Ini berguna jika URI yang akan dibagikan mungkin bervariasi bergantung pada konteks pengguna dalam aktivitas, sedangkan memanggil setBeamPushUris() akan berguna jika URI yang akan dibagikan tidak berubah dan Anda dapat menentukannya dengan aman sebelumnya.

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 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 menyiarkan layanan di jaringan lokal, menemukan perangkat lokal di jaringan, dan terhubung ke perangkat.

Untuk mendaftarkan layanan, pertama-tama Anda harus membuat objek NsdServiceInfo dan menentukan berbagai properti layanan Anda dengan metode seperti setServiceName(), setServiceType(), dan setPort().

Kemudian, Anda harus mengimplementasikan NsdManager.RegistrationListener dan meneruskannya ke registerService() dengan NsdServiceInfo Anda.

Untuk menemukan layanan di jaringan, implementasikan NsdManager.DiscoveryListener dan teruskan ke discoverServices().

Saat NsdManager.DiscoveryListener menerima callback tentang layanan yang ditemukan, Anda harus me-resolve layanan dengan memanggil resolveService(), 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 P2P Wi-Fi ditingkatkan di Android 4.1 untuk mendukung penemuan layanan pra-pengaitan di WifiP2pManager. Hal ini memungkinkan Anda menemukan dan memfilter perangkat di sekitar berdasarkan layanan menggunakan Wi-Fi P2P sebelum terhubung ke salah satunya, sedangkan Penemuan Layanan Jaringan memungkinkan Anda menemukan layanan di jaringan terhubung yang sudah ada (seperti jaringan Wi-Fi lokal).

Untuk menyiarkan aplikasi 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 dapat mulai menemukan layanan di perangkat lokal, Anda juga perlu menelepon addServiceRequest(). Saat WifiP2pManager.ActionListener yang Anda teruskan ke metode ini menerima callback yang berhasil, Anda kemudian 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 pembanding.

Penggunaan jaringan

Metode baru isActiveNetworkMetered() memungkinkan Anda memeriksa apakah perangkat saat ini terhubung ke jaringan berkuota. Dengan memeriksa status ini sebelum melakukan transaksi jaringan yang intensif, Anda dapat membantu mengelola penggunaan data yang mungkin dapat merugikan pengguna dan membuat keputusan yang tepat terkait apakah akan melakukan transaksi sekarang atau nanti (seperti saat perangkat terhubung ke Wi-Fi).

Aksesibilitas

Accessibility Service API

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, Layar Utama, dan membuka Aplikasi dan Notifikasi Terbaru.

Navigasi aplikasi yang dapat disesuaikan

Saat mem-build aplikasi Android, kini Anda dapat menyesuaikan skema navigasi dengan menemukan elemen dan widget input yang dapat difokuskan 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 bagi layanan aksesibilitas yang benar-benar terpisah dari struktur tata letak widget. Struktur semantik ini memungkinkan layanan aksesibilitas menyajikan model interaksi yang lebih berguna bagi pengguna yang memiliki gangguan penglihatan.

Menyalin dan Menempel

Menyalin dan menempelkan 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 aplikasi lain, seperti saat berbagi beberapa dokumen. URI content: yang disediakan dengan cara ini juga akan mematuhi flag intent untuk menawarkan akses baca atau tulis, yang memungkinkan Anda memberikan akses ke beberapa URI dalam intent. Saat memulai intent ACTION_SEND atau ACTION_SEND_MULTIPLE, URI yang diberikan dalam intent kini otomatis disebarkan ke ClipData sehingga penerima dapat memiliki akses.

Dukungan untuk gaya HTML dan string

Class ClipData kini mendukung teks bergaya (baik sebagai string bergaya HTML atau 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 sampel 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. 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 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 diinginkan, 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 meningkatkan skala jendela aktivitas dari posisi awal yang telah ditentukan pada layar dan ukuran awal yang telah ditetapkan. Misalnya, layar utama di Android 4.1 menggunakan ini saat membuka aplikasi.
makeThumbnailScaleUpAnimation()
Membuat animasi yang meningkatkan skala 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 yang baru menyediakan mekanisme callback sederhana dengan TimeAnimator.TimeListener yang memberi tahu Anda pada setiap frame animasi. Tidak ada setelan nilai objek, interpolasi, atau durasi 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 region konten yang lebih besar, pratinjau gambar 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 region konten yang lebih besar. Untuk menentukan gaya bagi wilayah konten yang luas, 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 tersedia dukungan untuk maksimal dua tombol tindakan yang muncul di bagian bawah pesan notifikasi, baik notifikasi Anda menggunakan gaya normal maupun gaya yang lebih besar.

Untuk menambahkan tombol tindakan, panggil addAction(). Metode ini memerlukan tiga argumen: resource drawable untuk ikon, teks untuk tombol, dan PendingIntent yang menentukan tindakan yang akan dilakukan.

Prioritas

Sekarang Anda dapat menunjukkan kepada sistem seberapa penting notifikasi Anda akan memengaruhi urutan notifikasi dalam daftar dengan menyetel prioritas menggunakan setPriority(). Anda dapat meneruskan ini salah satu dari lima tingkat prioritas berbeda yang ditentukan oleh konstanta PRIORITY_* di class Notification. Defaultnya adalah PRIORITY_DEFAULT, dan ada dua tingkat yang lebih tinggi dan dua tingkat yang lebih rendah.

Notifikasi berprioritas tinggi adalah hal yang umumnya ingin direspons dengan cepat oleh pengguna, seperti pesan instan baru, pesan teks, atau pengingat acara yang akan datang. Notifikasi berprioritas 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 tanda baru untuk mengontrol visibilitas elemen UI sistem, seperti untuk meredupkan tampilan kolom sistem atau membuatnya menghilang sepenuhnya di handset. Android 4.1 menambahkan beberapa tanda lainnya yang memungkinkan Anda mengontrol lebih lanjut tampilan elemen UI sistem dan tata letak aktivitas sehubungan dengan elemen tersebut dengan memanggil setSystemUiVisibility() dan meneruskan tanda 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), flag 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 untuk menggunakan area layar yang sama yang tersedia saat Anda mengaktifkan SYSTEM_UI_FLAG_FULLSCREEN meskipun elemen UI sistem masih terlihat. Meskipun bagian tata letak akan dihamparkan oleh UI sistem, hal ini berguna jika aplikasi Anda sering menyembunyikan dan menampilkan UI sistem dengan SYSTEM_UI_FLAG_FULLSCREEN, karena tata letak akan menghindari penyesuaian dengan batas tata letak baru setiap kali UI sistem disembunyikan atau muncul.
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
Menetapkan tata letak aktivitas untuk menggunakan area layar yang sama yang tersedia saat Anda mengaktifkan SYSTEM_UI_FLAG_HIDE_NAVIGATION (ditambahkan di Android 4.0) meskipun elemen UI sistem masih terlihat. Meskipun sebagian tata letak akan dihamparkan oleh menu navigasi, hal ini berguna jika aplikasi Anda sering menyembunyikan dan menampilkan menu navigasi dengan SYSTEM_UI_FLAG_HIDE_NAVIGATION, karena tata letak akan menghindari tata letak menyesuaikan dengan batas tata letak baru setiap kali menu navigasi disembunyikan atau muncul.
SYSTEM_UI_FLAG_LAYOUT_STABLE
Anda mungkin ingin menambahkan flag ini jika menggunakan SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN dan/atau SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION untuk memastikan bahwa saat Anda memanggil fitSystemWindows() di tampilan, batas yang ditetapkan tetap konsisten dengan memperhitungkan ruang layar yang tersedia. Artinya, jika tanda ini disetel, fitSystemWindows() akan berperilaku seolah-olah visibilitas elemen UI sistem tidak berubah bahkan setelah Anda menyembunyikan semua UI sistem.

Untuk pembahasan selengkapnya tentang tanda UI sistem terkait lainnya, baca tentang yang ditambahkan di Android 4.0.

Tampilan jarak jauh

GridLayout dan ViewStub kini merupakan tampilan yang dapat dilepas 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 set lengkap varian ringan dan ringkas.

Rangkaian lengkap varian font Roboto yang tersedia adalah:

  • Rutin
  • Miring
  • Tebal
  • Tebal-miring
  • Cahaya
  • Miring tipis
  • Kondensasi reguler
  • Miring yang padat
  • Tebal padat
  • Tebal-miring yang dipadatkan

Anda dapat menerapkan salah satunya 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

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 kumpulan perangkat input yang saat ini terhubung dan mendaftar agar diberi tahu saat perangkat baru ditambahkan, diubah, atau dihapus. Hal ini sangat berguna jika Anda membuat game yang mendukung beberapa pemain, serta ingin mendeteksi jumlah pengontrol yang terhubung dan jika ada perubahan jumlah pengontrol.

Anda dapat membuat kueri 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. Selanjutnya, Anda dapat memanggil getInputDevice() guna 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 ke registerInputDeviceListener().

Getar untuk pengontrol input

Jika perangkat input yang terhubung memiliki kemampuan getarannya sendiri, kini Anda dapat mengontrol getaran perangkat tersebut menggunakan Vibrator API yang ada, cukup dengan memanggil getVibrator() di InputDevice.

Izin

Berikut adalah izin baru:

READ_EXTERNAL_STORAGE
Menyediakan akses baca yang terlindungi ke penyimpanan eksternal. Di Android 4.1 secara default, semua aplikasi masih memiliki akses baca. Izin 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 juga akan otomatis mendapatkan akses baca. Ada opsi developer baru untuk mengaktifkan pembatasan akses baca, yang memungkinkan developer menguji aplikasi mereka berdasarkan perilaku Android di masa mendatang.
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 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 yang biasa di ruang keluarga: ditampilkan pada layar TV, dengan pengguna duduk jauh dari layar dan bentuk input yang banyak dipakai adalah sesuatu seperti d-pad, dan umumnya bukan melalui sentuhan atau perangkat mouse/pointer.