Android 4.1 API'leri

API Düzeyi: 16

Android 4.1 (JELLY_BEAN) daha iyi performans ve iyileştirilmiş kullanıcı deneyimi sunan, platformun bir ilerlemesidir. Kullanıcılar ve uygulama geliştiriciler için yeni özellikler ekler. Bu belgede, uygulama geliştiriciler için en göze çarpan ve kullanışlı yeni API'ler tanıtılmaktadır.

Uygulama geliştirici olarak Android 4.1'i, Android emülatöründe çalıştırabileceğiniz bir sistem görüntüsü ve uygulamanızı oluşturmak için kullanabileceğiniz bir SDK platformunda çalıştırabileceğiniz bir sistem görüntüsü olarak SDK Yöneticisi'nden edinebilirsiniz. Uygulamanızı Android 4.1'de oluşturup test etmek için en kısa sürede sistem görüntüsünü ve platformu indirmeniz gerekir.

Uygulamanızı Android 4.1 çalıştıran cihazlar için daha iyi optimize etmek istiyorsanız targetSdkVersion özelliğini "16" olarak ayarlamanız, bir Android 4.1 sistem görüntüsüne yüklemeniz, test etmeniz ve ardından bu değişikliği içeren bir güncelleme yayınlamanız gerekir.

Kodunuza, minSdkVersion tarafından desteklenmeyen API'leri yürütmeden önce sistem API düzeyini kontrol eden koşullar ekleyerek eski sürümleri desteklerken Android 4.1'de API'leri kullanabilirsiniz. Geriye dönük uyumluluğu sağlama hakkında daha fazla bilgi için Geriye Doğru Uyumlu Kullanıcı Arayüzü Oluşturma bölümüne bakın.

API düzeylerinin işleyiş şekli hakkında daha fazla bilgiyi API Düzeyi nedir? bölümünde bulabilirsiniz.

Uygulama Bileşenleri

Yalıtılmış hizmetler

<service> etiketinde android:isolatedProcess="true" belirtildiğinde Service, kendi izni olmayan kendi izole kullanıcı kimliği işlemi altında çalışır.

Bellek yönetimi

TRIM_MEMORY_RUNNING_LOW ve TRIM_MEMORY_RUNNING_CRITICAL gibi yeni ComponentCallbacks2 sabitleri, sistem onLowMemory() yöntemini çağırmadan önce ön plan işlemlerinde bellek durumu hakkında daha fazla bilgi sağlar.

Yeni getMyMemoryState(ActivityManager.RunningAppProcessInfo) yöntemi, genel bellek durumunu almanıza olanak tanır.

İçerik sağlayıcılar

Yeni bir yöntem olan acquireUnstableContentProviderClient(), "kararsız" olabilecek bir ContentProviderClient özelliğine erişmenize olanak tanır. Böylece içerik sağlayıcı devre dışı bıraktığında uygulamanız kilitlenmez. Ayrı bir uygulamada içerik sağlayıcılarla etkileşim kurarken bu özellik kullanışlıdır.

Animasyonlu Duvar Kağıtları

Animasyonlu duvar kağıdı önizleme etkinliğini doğrudan başlatan yeni intent protokolü, kullanıcıların uygulamanızdan ayrılmak ve Ana Ekran duvar kağıdı seçicide gezinmek zorunda kalmadan animasyonlu duvar kağıdınızı kolayca seçmelerine yardımcı olabilirsiniz.

Animasyonlu duvar kağıdı seçiciyi başlatmak için startActivity() öğesini, ACTION_CHANGE_LIVE_WALLPAPER ile Intent ve EXTRA_LIVE_WALLPAPER_COMPONENT içinde dize olarak belirten animasyonlu duvar kağıdı ComponentName ile birlikte çağırın.

Uygulama yığınında gezinme

Android 4.1, Yukarı gezinme için doğru tasarım modellerini uygulamayı çok daha kolay hale getirir. Tek yapmanız gereken, manifest dosyanızdaki her bir <activity> öğesine android:parentActivityName kodunu eklemektir. Sistem, kullanıcı işlem çubuğundaki Yukarı düğmesine bastığında (geçerli etkinliği de bitirirken) uygun etkinliği açmak için bu bilgileri kullanır. Dolayısıyla, her etkinlik için android:parentActivityName özelliğini beyan ederseniz işlem çubuğunun uygulama simgesinde tıklama etkinliklerini işlemek için onOptionsItemSelected() yöntemine ihtiyacınız yoktur. Sistem artık bu etkinliği işler ve uygun etkinliği devam ettirir veya oluşturur.

Bu, özellikle kullanıcının bildirim veya farklı bir uygulamadan gelen niyet gibi "ayrıntılı" bir niyetiyle uygulamanızın etkinliklerinden birine girdiği senaryolar için güçlüdür (Uygulamalar Arasında Gezinme tasarım kılavuzunda açıklandığı gibi). Kullanıcı, etkinliğinize bu şekilde girdiğinde uygulamanızda doğal olarak kullanıcı yukarı çıktıkça devam ettirilebilecek bir arka etkinlik grubu bulunmayabilir. Ancak, etkinlikleriniz için android:parentActivityName özelliğini sağladığınızda sistem, uygulamanızın halihazırda bir üst öğe etkinliği yığını içerip içermediğini tespit eder ve yoksa tüm ebeveyn etkinliklerini içeren sentetik bir arka yığın oluşturur.

Not: Kullanıcı, uygulamanıza derin bir etkinlik girdiğinde ve bu işlem uygulamanız için yeni bir görev oluşturduğunda, sistem aslında üst etkinlikler yığınını göreve ekler. Aynı şekilde, Geri düğmesine basıldığında üst etkinlik yığını arasında da gezinme yapılır.

Sistem, uygulamanız için sentetik bir arka yığın oluşturduğunda her ebeveyn etkinliğinin yeni bir örneğini oluşturmak için temel bir Intent oluşturur. Dolayısıyla, üst etkinlikler için kullanıcının her bir etkinlikte doğal olarak gezinmesini beklediğiniz şekilde kaydedilmiş bir durum yoktur. Üst etkinliklerden herhangi biri normalde kullanıcının bağlamına bağlı bir kullanıcı arayüzü gösteriyorsa bu bağlam bilgisi eksik olur ve kullanıcı yığında geri döndüğünde bunu sunmanız gerekir. Örneğin, kullanıcı bir müzik uygulamasında bir albümü görüntülüyorsa sayfayı yukarı çıkardığında belirli bir müzik türündeki tüm albümleri listeleyen bir etkinliğe yönlendirilir. Bu durumda, yığının oluşturulması gerekiyorsa ebeveynin uygun listeyi, kullanıcı gerçekten bu etkinlikten gelmiş gibi görüntüleyebilmesi için ebeveyn etkinliğine mevcut albümün hangi türe ait olduğunu bildirmeniz gerekir. Bu tür bilgileri sentetik bir üst etkinliğe göndermek için onPrepareNavigateUpTaskStack() yöntemini geçersiz kılmanız gerekir. Bu işlem size, üst etkinlikleri sentezlemek için sistemin oluşturduğu bir TaskStackBuilder nesnesi sağlar. TaskStackBuilder, sistemin her bir üst etkinliği oluşturmak için kullandığı Intent nesneyi içerir. onPrepareNavigateUpTaskStack() uygulamanızda, uygun Intent öğesini değiştirerek üst etkinliğin uygun bağlamı belirlemek ve uygun kullanıcı arayüzünü görüntülemek için kullanabileceği ekstra veriler ekleyebilirsiniz.

Sistem TaskStackBuilder öğesini oluşturduğunda, üst etkinlikleri oluşturmak için kullanılan Intent nesnelerini etkinlik ağacının en üstünden başlayarak mantıksal sıralarıyla ekler. Dolayısıyla, dahili diziye eklenen son Intent geçerli etkinliğin doğrudan üst öğesidir. Etkinliğin üst öğesi için Intent değerini değiştirmek isterseniz önce getIntentCount() ile dizinin uzunluğunu belirleyin ve bu değeri editIntentAt() öğesine iletin.

Uygulama yapınız daha karmaşıksa Yukarı gezinmenin davranışını işlemenize ve sentetik arka yığını tamamen özelleştirmenize olanak tanıyan başka API'ler de vardır. Size ek kontrol sağlayan API'lerden bazıları şunlardır:

onNavigateUp()
Kullanıcı Yukarı düğmesine bastığında özel bir işlem gerçekleştirmek için bunu geçersiz kılın.
navigateUpTo(Intent)
Mevcut etkinliği tamamlamak ve sağlanan Intent ile belirtilen etkinliğe gitmek için bunu çağırın. Etkinlik arka yığında mevcutsa ancak en yakın üst öğe değilse geçerli etkinlik ile amaç için belirtilen etkinlik arasındaki diğer tüm etkinlikler de tamamlanır.
getParentActivityIntent()
Geçerli etkinliğin mantıksal üst öğesini başlatacak Intent öğesini almak için bunu çağırın.
shouldUpRecreateTask(Intent)
Yukarı gitmek için sentetik bir arka yığının oluşturulması gerekip gerekmediğini sorgulamak amacıyla bunu çağırın. Sentetik bir yığın oluşturulması gerekiyorsa true (doğru), uygun yığın zaten varsa false (yanlış) değerini döndürür.
finishAffinity()
Mevcut etkinliği ve mevcut etkinliğe bağlı aynı görev yakınlığına sahip tüm üst etkinlikleri bitirmek için bunu çağırın. onNavigateUp() gibi varsayılan davranışları geçersiz kılarsanız Yukarı gezinmesinde sentetik bir geri yığın oluşturduğunuzda bu yöntemi çağırmanız gerekir.
onCreateNavigateUpTaskStack
Sentetik görev yığınının nasıl oluşturulduğunu tamamen kontrol etmeniz gerekiyorsa bunu geçersiz kılın. Yalnızca arka yığınınızın amaçlarına biraz ek veriler eklemek istiyorsanız bunun yerine onPrepareNavigateUpTaskStack() politikasını geçersiz kılmanız gerekir.

Ancak çoğu uygulamanın bu API'leri kullanması veya onPrepareNavigateUpTaskStack() uygulaması gerekmez ancak her <activity> öğesine android:parentActivityName ekleyerek doğru davranışı elde edebilir.

Multimedya

Medya codec'leri

MediaCodec sınıfı, medyanızı kodlama ve kodunu çözmek için alt düzey medya codec'lerine erişim sağlar. Medyayı kodlamak için createEncoderByType() veya medya kodunu çözmek için createDecoderByType() yöntemini çağırarak bir MediaCodec örneği oluşturabilirsiniz. Bu yöntemlerin her biri, "video/3gpp" veya "audio/vorbis" gibi kodlamak veya kodunu çözmek istediğiniz medya türü için bir MIME türü alır.

Bir MediaCodec örneği oluşturulduğunda, medya biçimi gibi özellikleri veya içeriğin şifrelenmiş olup olmadığını belirtmek için configure() yöntemini çağırabilirsiniz.

Medyanızı kodluyor veya kodunu çözerken, MediaCodec oluşturulduktan sonra sürecin geri kalanı aynıdır. İlk olarak, bir giriş ByteBuffer nesnesi dizisi almak için getInputBuffers() ve bir çıkış ByteBuffer nesneleri dizisi almak için getOutputBuffers() çağrısı yapın.

Kodlamaya veya kodu çözmeye hazır olduğunuzda, kaynak medyanızı beslemek için kullanmanız gereken ByteBuffer öğesinin dizin konumunu (giriş arabellekleri dizisinden) almak için dequeueInputBuffer() yöntemini çağırın. ByteBuffer öğesini kaynak medyanızla doldurduktan sonra queueInputBuffer() yöntemini çağırarak arabelleğin sahipliğini serbest bırakın.

Benzer şekilde, çıkış arabelleği için sonuçları alacağınız ByteBuffer dizininin konumunu almak için dequeueOutputBuffer() yöntemini çağırın. ByteBuffer çıktısını okuduktan sonra releaseOutputBuffer() yöntemini çağırarak sahipliği iptal edin.

Normal queueInputBuffer() yerine MediaCrypto API'leriyle birlikte queueSecureInputBuffer() çağrısı yaparak codec'lerdeki şifrelenmiş medya verilerini işleyebilirsiniz.

Codec'lerin kullanımı hakkında daha fazla bilgi için MediaCodec dokümanlarına bakın.

İşaret sırasında ses kaydedin

Yeni startRecording() yöntemi, MediaSyncEvent tarafından tanımlanan işarete göre ses kaydı başlatmanıza olanak tanıyor. MediaSyncEvent, bir ses oturumu (MediaPlayer tarafından tanımlanan gibi) belirtir. Bu oturum, tamamlandığında ses kaydedicinin kayda başlamasını tetikler. Örneğin, bir kayıt oturumunun başlangıcını belirten bir ses tonu çalmak için bu işlevi kullanabilir ve kayıt otomatik olarak başlar. Böylece tonu ve kaydın başlangıcını manuel olarak senkronize etmenize gerek kalmaz.

Zamanlanmış metin parçaları

MediaPlayer artık hem bant içi hem de bant dışı metin parçalarını işleyebilir. Bant içi metin parçaları, MP4 veya 3GPP medya kaynağı içinde metin parçası olarak gelir. Bant dışı metin parçaları, addTimedTextSource() yöntemiyle harici metin kaynağı olarak eklenebilir. Tüm harici metin parçası kaynakları eklendikten sonra, bir veri kaynağındaki kullanılabilir tüm parçaların yenilenmiş listesini almak için getTrackInfo() çağrılmalıdır.

Parçayı MediaPlayer ile kullanılacak şekilde ayarlamak için kullanmak istediğiniz parçanın dizin konumunu kullanarak selectTrack() çağrısı yapmanız gerekir.

Metin parçası oynatılmaya hazır olduğunda bildirim almak için MediaPlayer.OnTimedTextListener arayüzünü uygulayın ve setOnTimedTextListener() ekibine iletin.

Ses efektleri

AudioEffect sınıfı artık ses kaydederken ek ses ön işleme türlerini desteklemektedir:

  • AcousticEchoCanceler özellikli Akustik Yankı İptal Edici (AEC), uzak taraftan alınan sinyalin katkısını yakalanan ses sinyalinden kaldırır.
  • AutomaticGainControl ile Otomatik Kazanç Kontrolü (AGC), yakalanan sinyalin çıkışını otomatik olarak normalleştirir.
  • NoiseSuppressor özellikli Gürültü Çözücü (NS), yakalanan sinyalden arka plan gürültüsünü kaldırır.

Bu ön işlemci efektlerini, AudioEffect alt sınıflarından birini kullanarak AudioRecord ile yakalanan sese uygulayabilirsiniz.

Not: Bu efektlerin tüm cihazlarda destekleneceği garanti edilmez. Bu nedenle, her zaman önce ilgili ses efekti sınıfında isAvailable() çağrısı yaparak kullanılabilirliği kontrol etmeniz gerekir.

Boşluksuz oynatma

Artık iki ayrı MediaPlayer nesnesi arasında boşluksuz oynatma gerçekleştirebilirsiniz. İlk MediaPlayer bitmeden önce herhangi bir anda setNextMediaPlayer() numaralı telefonu arayın. Android, ilk oyuncu durduğu anda ikinci oyuncuyu başlatmaya çalışır.

Medya yönlendiricisi. Yeni MediaRouter, MediaRouteActionProvider ve MediaRouteButton API'leri, medyanın nerede oynatılacağını seçmek için standart mekanizmalar ve kullanıcı arayüzü sağlar.

Kamera

Otomatik odaklama hareketi

Yeni arayüz olan Camera.AutoFocusMoveCallback, otomatik odak hareketinde yapılan değişiklikleri dinlemenizi sağlar. Arayüzünüzü setAutoFocusMoveCallback() hizmetine kaydedebilirsiniz. Daha sonra, kamera sürekli otomatik odaklama modundayken (FOCUS_MODE_CONTINUOUS_VIDEO veya FOCUS_MODE_CONTINUOUS_PICTURE) onAutoFocusMoving() numaralı telefona bir çağrı alacaksınız. Bu çağrı, otomatik odağın hareket etmeye başlayıp başlamadığını veya hareket etmeyi bıraktığını bildirir.

Kamera sesleri

MediaActionSound sınıfı, kamera veya diğer medya işlemleri tarafından yapılan standart sesleri üretmek için basit bir API seti sağlar. Bu API'leri, özel bir fotoğraf makinesi veya video kamera oluştururken uygun sesi çalmak için kullanmanız gerekir.

Ses çalmak için bir MediaActionSound nesnesini örneklendirmeniz yeterlidir. İstediğiniz sesin önceden yüklenmesi için load() çağrısı yapın, ardından uygun zamanda play() işlevini çağırın.

Bağlantı

Android Beam

Android IşınlamaTM artık Bluetooth üzerinden büyük yük aktarımlarını desteklemektedir. Aktarılacak verileri yeni setBeamPushUris() yöntemi veya yeni geri çağırma arayüzü NfcAdapter.CreateBeamUrisCallback ile tanımladığınızda Android, daha yüksek aktarım hızları elde etmek için veri aktarımını Bluetooth'a veya başka bir alternatif aktarıma dağıtır. Bu, özellikle resim ve ses dosyaları gibi büyük yükler için kullanışlıdır ve cihazlar arasında görünür bir eşleme gerektirmez. Bluetooth üzerinden aktarımlardan yararlanmak için uygulamanızın başka bir işlem yapmasına gerek yoktur.

setBeamPushUris() yöntemi, uygulamanızdan aktarmak istediğiniz verileri belirten Uri nesne dizisi alır. Alternatif olarak, setBeamPushUrisCallback() yöntemini çağırarak etkinliğiniz için belirtebileceğiniz NfcAdapter.CreateBeamUrisCallback arayüzünü uygulayabilirsiniz.

Geri çağırma arayüzünü kullanırken, kullanıcı Android Beam ile bir paylaşım gerçekleştirdiğinde sistem arayüzün createBeamUris() yöntemini çağırır. Böylece paylaşım anında paylaşılacak URI'leri tanımlayabilirsiniz. Bu, paylaşılacak URI'lar etkinlikteki kullanıcı bağlamına bağlı olarak değişebilecekse yararlı olur. Paylaşılacak URI'lar değişmediğinde ve bunları önceden güvenli bir şekilde tanımlayabileceğiniz durumlarda setBeamPushUris() çağrısının kullanılması yararlı olur.

Ağ hizmeti keşfi

Android 4.1, kablosuz ağ üzerinden eş cihazlar tarafından sunulan hizmetleri (örneğin, mobil cihazlar, yazıcılar, kameralar, medya oynatıcılar ve yerel ağda kayıtlı olan diğer hizmetler) bulup bağlanmanıza olanak tanıyan, çoklu yayın DNS tabanlı hizmet keşfine yönelik destek sunar.

android.net.nsd adlı yeni paket, hizmetlerinizi yerel ağda yayınlamanıza, ağdaki yerel cihazları keşfetmenize ve cihazlara bağlanmanıza olanak tanıyan yeni API'leri içerir.

Hizmetinizi kaydetmek için önce bir NsdServiceInfo nesnesi oluşturmanız ve setServiceName(), setServiceType() ve setPort() gibi yöntemlerle hizmetinizin çeşitli özelliklerini tanımlamanız gerekir.

Ardından, NsdManager.RegistrationListener işlemini uygulamanız ve NsdServiceInfo cihazınızla registerService() hizmetine iletmeniz gerekir.

Ağdaki hizmetleri keşfetmek için NsdManager.DiscoveryListener işlevini uygulayın ve discoverServices() hizmetine iletin.

NsdManager.DiscoveryListener hizmetiniz bulunan hizmetlerle ilgili geri çağırmalar aldığında resolveService() yöntemini çağırarak hizmeti çözümlemeniz ve bunu, keşfedilen hizmetle ilgili bilgi içeren bir NsdServiceInfo nesnesi alan NsdManager.ResolveListener uygulamasını iletmeniz gerekir. Böylece, bağlantıyı başlatabilirsiniz.

Kablosuz P2P hizmet keşfi

Wi-Fi P2P API'ler, WifiP2pManager içinde ilişkilendirme öncesi hizmet keşfini desteklemek için Android 4.1'de geliştirilmiştir. Bu sayede, bir ağa bağlanmadan önce kablosuz P2P kullanan hizmetlere göre yakındaki cihazları keşfedip filtreleyebilirsiniz. Network Service Discovery ise mevcut bir bağlı ağdaki (yerel kablosuz ağ gibi) hizmetleri keşfetmenize olanak tanır.

Diğer cihazların uygulamanızı keşfedip bağlanabilmesi amacıyla uygulamanızı kablosuz bağlantı üzerinden hizmet olarak yayınlamak için addLocalService() yöntemini, uygulama hizmetlerinizi açıklayan WifiP2pServiceInfo nesnesiyle arayın.

Yakındaki cihazları kablosuz ağ üzerinden keşfetmeyi başlatmak için önce Bonjour mu yoksa Upnp kullanarak mı iletişim kuracağınıza karar vermeniz gerekir. Bonjour'u kullanmak için önce setDnsSdResponseListeners() ile hem WifiP2pManager.DnsSdServiceResponseListener hem de WifiP2pManager.DnsSdTxtRecordListener gerektiren geri çağırma dinleyicileri ayarlayın. Upnp'yi kullanmak için setUpnpServiceResponseListener() numaralı telefonu arayın. Bu işlem WifiP2pManager.UpnpServiceResponseListener sürer.

Yerel cihazlarda hizmetleri keşfetmeye başlamadan önce addServiceRequest() numaralı telefonu aramanız da gerekir. Bu yönteme ilettiğiniz WifiP2pManager.ActionListener başarılı bir geri arama aldığında, discoverServices() yöntemini çağırarak yerel cihazlarda hizmetleri keşfetmeye başlayabilirsiniz.

Yerel hizmetler keşfedildiğinde, Bonjour veya Upnp kullanmak üzere kaydolmuş olup olmadığınıza bağlı olarak WifiP2pManager.DnsSdServiceResponseListener veya WifiP2pManager.UpnpServiceResponseListener sizi geri arar. Her iki durumda da alınan geri çağırma, eş cihazı temsil eden bir WifiP2pDevice nesnesi içerir.

Ağ kullanımı

Yeni isActiveNetworkMetered() yöntemi, cihazın o anda sayaçlı bir ağa bağlı olup olmadığını kontrol etmenizi sağlar. Yoğun ağ işlemleri gerçekleştirmeden önce bu durumu kontrol ederek, kullanıcılarınızın parasına mal olabilecek veri kullanımını yönetmeye yardımcı olabilir ve işlemleri şimdi mi yoksa daha sonra mı gerçekleştireceğinize (örneğin, cihazın kablosuz ağa bağlandığı zaman) bilinçli kararlar verebilirsiniz.

Erişilebilirlik

Erişilebilirlik hizmeti API'leri

Erişilebilirlik hizmeti API'lerinin erişimi, Android 4.1'de önemli ölçüde artırıldı. Artık AccessibilityEvent, AccessibilityNodeInfo ve AccessibilityRecord sınıflarına eklemeler yaparak onGesture() ve diğer giriş etkinliklerini kullanarak karmaşık hareketler gibi daha fazla giriş etkinliğini izleyen ve yanıt veren hizmetler derlemenize olanak tanır.

Erişilebilirlik hizmetleri ayrıca kullanıcı adına tıklama, kaydırma ve metinde adım adım ilerleme gibi işlemleri performAction ve setMovementGranularities ile gerçekleştirebilir. performGlobalAction() yöntemi, hizmetlerin Geri, Ana Sayfa ve Son Uygulamalar ile Bildirimler'i açma gibi işlemleri gerçekleştirmesine de olanak tanır.

Özelleştirilebilir uygulamada gezinme

Bir Android uygulaması oluştururken artık findFocus() ve focusSearch() ile odaklanabilir öğeleri ve giriş widget'larını bularak gezinme şemalarını özelleştirebilir ve setAccessibilityFocused() ile odağı ayarlayabilirsiniz.

Daha erişilebilir widget'lar

Yeni android.view.accessibility.AccessibilityNodeProvider sınıfı, erişilebilirlik hizmetlerine karmaşık özel görünümler sunarak bilgileri daha erişilebilir bir şekilde sunmanızı sağlar. android.view.accessibility.AccessibilityNodeProvider, takvim ızgarası gibi gelişmiş içeriğe sahip bir kullanıcı widget'ının, erişilebilirlik hizmetleri için widget'ın düzen yapısından tamamen ayrı bir mantıksal semantik yapı sunmasına olanak tanır. Bu anlamsal yapı, erişilebilirlik hizmetlerinin, görme engelli kullanıcılar için daha yararlı bir etkileşim modeli sunmasını sağlar.

Kopyala ve Yapıştır

Amaçlarla kopyalama ve yapıştırma

Artık setClipData() yöntemini kullanarak bir ClipData nesnesini Intent ile ilişkilendirebilirsiniz. Bu, özellikle birden fazla content: URI'sini başka bir uygulamaya aktarmak için niyet kullanırken (örneğin, birden fazla belge paylaşırken) faydalıdır. Bu şekilde sağlanan content: URI'leri de okuma veya yazma erişimi sağlamak için niyetin bayraklarına uyar ve amaçtaki birden fazla URI'ye erişim izni vermenizi sağlar. Bir ACTION_SEND veya ACTION_SEND_MULTIPLE niyeti başlatırken, alıcının erişim izni verebilmesi için amaçta sağlanan URI'lar artık otomatik olarak ClipData'a iletilir.

HTML ve dize stilleri için destek

ClipData sınıfı artık stilize edilmiş metinleri (HTML veya Android stilli dizeler olarak) desteklemektedir. newHtmlText() kullanarak ClipData reklam öğesine HTML biçimli metin ekleyebilirsiniz.

Renderscript

Renderscript hesaplama işlevi aşağıdaki özelliklerle geliştirildi:

  • Tek bir komut dosyasında birden çok çekirdek desteği.
  • Yeni bir komut dosyası API'sinde işlemler için filtrelenmiş örnekleyicilerle ayırmadan okuma desteği rsSample.
  • #pragma bölgesinde farklı FP hassasiyeti düzeyleri için destek.
  • Bir işlem komut dosyasından RS nesnelerinden ek bilgileri sorgulama desteği.
  • Çok sayıda performans iyileştirmesi.

İşlem Renderscript'leriniz için gereken kayan nokta hassasiyetini tanımlamak için yeni pragmalar da mevcuttur. Bu sayede, tam IEEE 754-2008 standardıyla mümkün olmayacak hızlı vektör matematik işlemleri gibi NEON benzeri işlemleri CPU yolunda etkinleştirebilirsiniz.

Not: Deneysel Renderscript grafik motoru kullanımdan kaldırılmıştır.

Animasyonlar

Etkinlik başlatma animasyonları

Artık yakınlaştırma animasyonlarını veya kendi özel animasyonlarınızı kullanarak bir Activity başlatabilirsiniz. İstediğiniz animasyonu belirtmek için ActivityOptions API'lerini kullanarak startActivity() gibi etkinlik başlatan yöntemlere iletebileceğiniz bir Bundle oluşturun.

ActivityOptions sınıfı, etkinliğiniz açıldığında göstermek isteyebileceğiniz her animasyon türü için farklı bir yöntem içerir:

makeScaleUpAnimation()
Etkinlik penceresini ekrandaki belirli bir başlangıç konumundan ve belirtilen başlangıç boyutundan büyüten bir animasyon oluşturur. Örneğin, Android 4.1'deki ana ekran bir uygulamayı açarken bunu kullanır.
makeThumbnailScaleUpAnimation()
Etkinlik penceresini belirtilen bir konumdan başlayarak ölçeklendiren bir animasyon ve sağlanan bir küçük resim oluşturur. Örneğin, Android 4.1'deki Son Uygulamalar penceresi, bir uygulamaya dönerken bunu kullanır.
makeCustomAnimation()
Kendi kaynaklarınız tarafından tanımlanan bir animasyon oluşturur. Bu animasyonlardan biri etkinlik açılışı, diğeri durdurulan etkinlik için ayrı ayrı tanımlanır.

Zaman animatörü

Yeni TimeAnimator, animasyonun her karesinde sizi bilgilendiren TimeAnimator.TimeListener ile basit bir geri çağırma mekanizması sunar. Bu Animatörde süre, interpolasyon veya nesne değer ayarı yoktur. İşleyicinin geri çağırması, önceki animasyon karesinden bu yana geçen toplam süre ve geçen süre de dahil olmak üzere her kare için bilgi alır.

Kullanıcı Arayüzü

Bildirimler

Android 4.1'de daha büyük içerik bölgeleri, büyük resim önizlemeleri, birden fazla işlem düğmesi ve yapılandırılabilir öncelik ile bildirimler oluşturabilirsiniz.

Bildirim stilleri

Yeni setStyle() yöntemi, bildiriminiz için her biri daha geniş bir içerik bölgesi sunan üç yeni stilden birini belirlemenize olanak tanır. Geniş içerik bölgenizin stilini belirtmek için setStyle() öğesine aşağıdaki nesnelerden birini iletin:

Notification.BigPictureStyle
Büyük boyutlu resim eki içeren bildirimler için.
Notification.BigTextStyle
Tek bir e-posta gibi çok fazla metin içeren bildirimler için kullanılır.
Notification.InboxStyle
Bir dize listesi (ör. birden çok e-postadan snippet'ler) içeren bildirimler için.
Bildirim işlemleri

Artık bildiriminizde normal veya daha büyük stil kullanılması fark etmeksizin, bildirim mesajının alt kısmında görünen en fazla iki işlem düğmesi destekleniyor.

İşlem düğmesi eklemek için addAction() numaralı telefonu arayın. Bu yöntem üç bağımsız değişken alır: simge için çekilebilir bir kaynak, düğme için metin ve perfrom işlemi için işlemi tanımlayan PendingIntent.

Öncelikler

Artık önceliği setPriority() ile ayarlayarak bildiriminizin listedeki sırasını etkilemesinin sisteme ne kadar önemli olduğu konusunda ipucu verebilirsiniz. Bunu, Notification sınıfında PRIORITY_* sabitleriyle tanımlanan beş farklı öncelik düzeyinden birini geçirebilirsiniz. Varsayılan değer PRIORITY_DEFAULT'dir. İki düzey daha yüksek, iki alt düzey mevcuttur.

Yüksek öncelikli bildirimler, kullanıcıların genellikle hızlı bir şekilde yanıt vermek istedikleri öğelerdir (ör. yeni bir anlık mesaj, kısa mesaj veya yaklaşan etkinlik hatırlatıcısı). Düşük öncelikli bildirimler, süresi dolan takvim etkinlikleri veya uygulama tanıtımları gibi şeylerdir.

Sistem kullanıcı arayüzü kontrolleri

Android 4.0 (Ice Cream Sandwich) sistem, kullanıcı arayüzü öğelerinin görünürlüğünü kontrol etmek için sistem çubuğunun görünümünü karartma veya cep telefonlarında tamamen kaybolma gibi yeni işaretler ekledi. Android 4.1, sistem kullanıcı arayüzü öğelerinin görünümünü ve bunlarla ilişkili etkinlik düzeninizi, setSystemUiVisibility() çağrısı yaparak ve aşağıdaki işaretleri ileterek daha iyi kontrol edebilmenizi sağlayan birkaç bayrak daha ekler:

SYSTEM_UI_FLAG_FULLSCREEN
Kritik olmayan sistem kullanıcı arayüzünü (ör. durum çubuğu) gizler. Etkinliğiniz, işlem çubuğunu yer paylaşımı modunda kullanıyorsa (android:windowActionBarOverlay özelliğini etkinleştirerek) bu işaret, işlem çubuğunu da gizler. Bunu, ikisini birden gizlerken ve gösterirken eşgüdümlü bir animasyonla yapar.
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
Etkinlik düzeninizi, sistem kullanıcı arayüzü öğeleri hâlâ görünür olsa bile SYSTEM_UI_FLAG_FULLSCREEN özelliğini etkinleştirdiğinizde kullanılabilen ekran alanını kullanacak şekilde ayarlar. Düzeninizin bazı bölümleri sistem kullanıcı arayüzü tarafından kapsanacak olsa da, uygulamanız sistem kullanıcı arayüzünü sık sık SYSTEM_UI_FLAG_FULLSCREEN ile gizleyip gösteriyorsa bu yöntem, sistem kullanıcı arayüzü her gizlendiğinde veya göründüğünde düzeninizin yeni düzen sınırlarına ayarlanmasını önleyeceğinden faydalıdır.
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
Etkinlik düzeninizi, sistem kullanıcı arayüzü öğeleri hâlâ görünür olsa bile, SYSTEM_UI_FLAG_HIDE_NAVIGATION (Android 4.0'da eklenmiş) özelliğini etkinleştirdiğinizde kullanılabilen ekran alanını kullanacak şekilde ayarlar. Düzeninizin bazı bölümleri gezinme çubuğu tarafından üst üste yer alsa da, uygulamanız gezinme çubuğunu sık sık SYSTEM_UI_FLAG_HIDE_NAVIGATION ile gizleyip gösteriyorsa bu özellik kullanışlıdır. Çünkü bu, gezinme çubuğu her gizlendiğinde veya göründüğünde düzeninizin yeni düzen sınırlarına ayarlanmasını önler.
SYSTEM_UI_FLAG_LAYOUT_STABLE
Bir görünümde fitSystemWindows() çağrısı yaptığınızda, tanımlanan sınırların kullanılabilir ekran alanıyla tutarlı kalmasını sağlamak için SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN ve/veya SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION kullanıyorsanız bu işareti ekleyebilirsiniz. Yani bu işaret ayarlandığında fitSystemWindows(), tüm sistem kullanıcı arayüzü gizlendikten sonra bile sistem kullanıcı arayüzü öğelerinin görünürlüğü değişmiyormuş gibi davranır.

İlgili diğer sistem kullanıcı arayüzü işaretleri hakkında daha fazla bilgi edinmek için Android 4.0'da eklenenler hakkında bilgi edinin.

Uzaktan görüntülemeler

GridLayout ve ViewStub artık taşınabilir görünümler olduğundan, bunları uygulama widget'larınızın ve bildirim özel düzenlerinizin düzenlerinde kullanabilirsiniz.

Yazı tipi aileleri

Android 4.1, toplam 10 varyant için Roboto yazı tipi stilinin birkaç varyantını daha ekler ve bunların tümü uygulamalar tarafından kullanılabilir. Uygulamalarınız artık hem hafif hem de yoğunlaştırılmış varyantların tamamına erişebilir.

Mevcut Roboto yazı tipi varyantlarının tamamı şunlardır:

  • Normal
  • İtalik
  • Kalın
  • Kalın-italik
  • Hafif
  • Açık-italik
  • Yoğunlaştırılmış normal
  • Daraltılmış italik
  • Daraltılmış kalın
  • Daraltılmış kalın-italik

Bunlardan herhangi birini yeni fontFamily özelliğiyle birlikte textStyle özelliğiyle birlikte uygulayabilirsiniz.

fontFamily için desteklenen değerler:

  • Normal Roboto için "sans-serif"
  • Roboto Light için "sans-serif-light"
  • Roboto Condensed için "sans-serif-condensed"

Ardından, "bold" ve "italic" değerlerini kalın ve/veya italik şeklinde uygulayabilirsiniz.textStyle Her ikisini de şu şekilde uygulayabilirsiniz: android:textStyle="bold|italic".

Ayrıca Typeface.create() kullanabilirsiniz. Örneğin, Typeface.create("sans-serif-light", Typeface.NORMAL).

Giriş Çerçevesi

Birden fazla giriş cihazı

Yeni InputManager sınıfı, şu anda bağlı olan giriş cihazı grubunu sorgulamanıza ve yeni bir cihaz eklendiğinde, değiştirildiğinde veya kaldırıldığında bildirim almak için kaydolmanıza olanak tanır. Bu, özellikle birden çok oyuncuyu destekleyen bir oyun oluşturuyorsanız ve kaç kumandanın bağlı olduğunu ve kumanda sayısında değişiklik olduğunu tespit etmek istiyorsanız yararlıdır.

getInputDeviceIds() çağrısı yaparak bağlı tüm giriş cihazlarını sorgulayabilirsiniz. Bu işlem, her biri farklı bir giriş cihazının kimliği olan bir tam sayı dizisi döndürür. Ardından, belirtilen giriş cihazı kimliği için InputDevice edinmek üzere getInputDevice() yöntemini çağırabilirsiniz.

Yeni giriş cihazları bağlandığında, değiştirildiğinde veya bağlantıları kesildiğinde bilgilendirilmek istiyorsanız InputManager.InputDeviceListener arayüzünü uygulayın ve registerInputDeviceListener() ile kaydedin.

Giriş denetleyicileri için titreşim

Bağlı giriş cihazlarının kendi titreşim özellikleri varsa artık InputDevice üzerinde getVibrator() çağrısı yaparak mevcut Vibrator API'lerini kullanarak bu cihazların titreşimini kontrol edebilirsiniz.

İzinler

Yeni izinler şunlardır:

READ_EXTERNAL_STORAGE
Harici depolama alanına korumalı okuma erişimi sağlar. Varsayılan olarak Android 4.1'de tüm uygulamaların okuma erişimi vardır. Bu ayar, gelecekteki bir sürümde uygulamaların bu izni kullanarak açıkça okuma erişimi istemesini gerektirecek şekilde değiştirilecek. Uygulamanız zaten yazma erişimi istiyorsa otomatik olarak okuma erişimi de alır. Okuma erişimi kısıtlamasını açmaya yönelik yeni bir geliştirici seçeneği var. Bu seçenek sayesinde geliştiriciler, uygulamalarını Android'in ileride nasıl davranacağına göre test edebilir.
android.Manifest.permission.READ_USER_DICTIONARY
Bir uygulamanın, kullanıcı sözlüğünü okumasına izin verir. Bu işlev yalnızca IME veya Ayarlar uygulaması gibi bir sözlük düzenleyici tarafından gerekli kılınmalıdır.
READ_CALL_LOG
Uygulamanın, gelen ve giden aramalarla ilgili bilgiler içeren sistemin çağrı günlüğünü okumasına izin verir.
WRITE_CALL_LOG
Bir uygulamanın, sisteme ait telefonunuzda depolanan çağrı kaydını değiştirmesine izin verir
android.Manifest.permission.WRITE_USER_DICTIONARY
Bir uygulamanın, kullanıcının kelime sözlüğüne yazmasına izin verir.

Cihaz Özellikleri

Android 4.1, kullanıcı arayüzünü televizyon ekranında görüntülemeye ayrılmış cihazlar için yeni bir özellik beyanı içeriyor: FEATURE_TELEVISION. Uygulamanızın televizyon arayüzü gerektirdiğini beyan etmek için manifest dosyanızda <uses-feature> öğesiyle bu özelliği beyan edin:

<manifest ... >
    <uses-feature android:name="android.hardware.type.television"
                  android:required="true" />
    ...
</manifest>

Bu özellik, "televizyonu" tipik bir oturma odası televizyonu deneyimi olarak tanımlar: Kullanıcının uzakta oturduğu büyük ekranda görüntülenir. En yaygın giriş biçimi d-pad gibi bir şeydir ve genellikle dokunarak veya fare/işaretçi cihazıyla değildir.