Android 4.1 API

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.

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

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 dengan SYSTEM_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 dengan SYSTEM_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/atau SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION untuk memastikan bahwa saat Anda memanggil fitSystemWindows() 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.