Android 4.1 API'leri

API Düzeyi: 16

Android 4.1 (JELLY_BEAN), daha yüksek 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 önemli ve kullanışlı yeni API'ler tanıtılmaktadır.

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

Uygulamanızı Android 4.1 çalıştıran cihazlar için daha iyi optimize etmek amacıyla targetSdkVersion öğenizi "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.

Hem Android 4.1'de API'leri kullanabilir hem de kodunuza minSdkVersion tarafından desteklenmeyen API'leri yürütmeden önce sistem API düzeyini kontrol eden koşullar ekleyerek eski sürümleri destekleyebilirsiniz. Geriye dönük uyumluluğu koruma hakkında daha fazla bilgi edinmek için Geriye Doğru Uyumlu Kullanıcı Arayüzleri Oluşturma konusuna 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, ön plan işlemlerine, sistem onLowMemory() çağrısından önce bellek durumu hakkında daha fazla bilgi sağlar.

Yeni getMyMemoryState(ActivityManager.RunningAppProcessInfo) yöntemi, genel bellek durumunu almanızı sağlar.

İçerik sağlayıcılar

Yeni bir yöntem olan acquireUnstableContentProviderClient(), "kararsız" olabilecek bir ContentProviderClient özelliğine erişmenizi sağlar. İçerik sağlayıcı çöktüğünde uygulamanız kilitlenmez. Bu özellik, içerik sağlayıcılarla ayrı bir uygulamada etkileşimde bulunurken yararlıdır.

Animasyonlu Duvar Kağıtları

Animasyonlu duvar kağıdı önizleme etkinliğini doğrudan başlatmak için yeni intent protokolü. Böylece kullanıcıların uygulamanızdan ayrılmak ve Ana ekran duvar kağıdı seçicisinde 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() işlemini ACTION_CHANGE_LIVE_WALLPAPER ile bir Intent ve animasyonlu duvar kağıdınızı ComponentName ile EXTRA_LIVE_WALLPAPER_COMPONENT içinde dize olarak belirten ek bir öğe çağırın.

Uygulama yığınında gezinme

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

Bu, özellikle kullanıcının bir bildirim veya farklı bir uygulamadan gelen niyet gibi bir "ayrıntılı inceleme" amacıyla 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 etkinlik yığını olmayabilir. Ancak etkinlikleriniz için android:parentActivityName özelliğini sağladığınızda sistem, uygulamanızın halihazırda ebeveyn etkinlikleri içeren bir geri yığın içerip içermediğini tespit eder ve yoksa tüm ebeveyn etkinliklerini içeren sentetik bir geri yığın oluşturur.

Not: Kullanıcı, uygulamanıza derin bir etkinlik girdiğinde ve bu, uygulamanız için yeni bir görev oluşturduğunda, sistem aslında ebeveyn etkinlikleri yığınını göreve ekler. Benzer şekilde, Geri düğmesine basıldığında üst etkinlikler grubu arasında da geri 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 olmaz. Üst etkinliklerden herhangi biri normalde kullanıcının bağlamına bağlı bir kullanıcı arayüzü gösteriyorsa bu bağlam bilgileri eksik olur ve kullanıcı yığında geri döndüğünde bu bilgileri sunmanız gerekir. Örneğin, kullanıcı bir müzik uygulamasında bir albümü görüntülüyorsa, yukarı çıktığında belirli bir müzik türündeki tüm albümlerin listelendiği bir etkinliğe yönlendirilirsiniz. Bu durumda, grubun oluşturulması gerekiyorsa ebeveynin kullanıcı gerçekten bu etkinlikten gelmiş gibi uygun listeyi görüntüleyebilmesi için üst etkinliğe mevcut albümün hangi türe ait olduğunu bildirmeniz gerekir. Bu tür bilgileri sentetik bir üst etkinliğe iletmek için onPrepareNavigateUpTaskStack() yöntemini geçersiz kılmanız gerekir. Bu işlem, üst etkinlikleri sentezlemek için sistemin oluşturduğu bir TaskStackBuilder nesnesini sağlar. TaskStackBuilder, sistemin her bir üst etkinliği oluşturmak için kullandığı Intent nesneyi içerir. onPrepareNavigateUpTaskStack() uygulamasında, üst etkinliğin uygun bağlamı belirlemek ve uygun kullanıcı arayüzünü görüntülemek için kullanabileceği ekstra veriler eklemek amacıyla uygun Intent öğesini değiştirebilirsiniz.

Sistem TaskStackBuilder öğesini oluşturduğunda, üst etkinlikleri oluşturmak için kullanılan Intent nesnelerini etkinlik ağacının üst tarafından başlayarak mantıksal sırasına göre 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 istiyorsanız ö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ı yönetmenize ve sentetik arka yığını tamamen özelleştirmenize olanak tanıyan birkaç API daha 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 gösterilen etkinliğe gitmek için bu işlevi çağırın. Etkinlik arka yığında mevcutsa ancak en yakın üst öğe değilse geçerli etkinlik ile amaçla 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 geri yığı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 mevcutsa false değerini döndürür.
finishAffinity()
Mevcut etkinliği ve mevcut etkinliğe bağlı aynı görev benzeşimine sahip tüm üst etkinlikleri bitirmek için bu parametreyi çalıştırın. onNavigateUp() gibi varsayılan davranışları geçersiz kılarsanız Yukarı gezinmesinin ardından sentetik bir geri yığın oluştururken bu yöntemi çağırmanız gerekir.
onCreateNavigateUpTaskStack
Sentetik görev grubunun nasıl oluşturulduğunu tam olarak kontrol etmeniz gerekiyorsa bunu geçersiz kılın. Yalnızca arka yığınınızın amaçlarına biraz ekstra veri eklemek istiyorsanız bunun yerine onPrepareNavigateUpTaskStack() değerini geçersiz kılmanız gerekir

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

Multimedya

Medya codec'leri

MediaCodec sınıfı, medyanızı kodlama ve kodunu çözmeniz 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, kodlamak veya kodunu çözmek istediğiniz medya türü için bir MIME türü alır (ör. "video/3gpp" veya "audio/vorbis").

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

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

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

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

Normal queueInputBuffer() yerine MediaCrypto API'leriyle birlikte queueSecureInputBuffer() yöntemini çağırarak 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ına başlamanıza olanak tanır. MediaSyncEvent bir ses oturumu (MediaPlayer tarafından tanımlanan gibi) belirtir. Bu oturum tamamlandığında ses kaydedicinin kayda başlamasını tetikler. Örneğin, bu işlevi bir kayıt oturumunun başlangıcını ve kayıt otomatik olarak başladığını belirten bir ses tonu çalmak için kullanabilirsiniz. Böylece tonu ve kaydın başlangıcını manuel olarak senkronize etmeniz gerekmez.

Zamanlanmış metin parçaları

MediaPlayer artık hem bant içi hem de bant dışı metin parçalarını işliyor. Bant içi metin parçaları MP4 veya 3GPP medya kaynağında metin parçası olarak gelir. Bant dışı metin parçaları, addTimedTextSource() yöntemiyle harici metin kaynağı olarak eklenebilir. Tüm harici metin kanalı kaynakları eklendikten sonra, bir veri kaynağındaki mevcut tüm kanalların yeni 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() adlı CSS'ye iletin.

Ses efektleri

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

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

Bu ön işlemci efektlerini, AudioEffect alt sınıflarından birini kullanarak bir 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 zamanda setNextMediaPlayer() yöntemini çağırın. Android, ilk oynatıcı durduğu anda ikinci oynatıcıyı 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 Camera.AutoFocusMoveCallback arayüzü, otomatik odak hareketinde yapılan değişiklikleri dinlemenize olanak tanır. Arayüzünüzü setAutoFocusMoveCallback() ile kaydedebilirsiniz. Daha sonra, kamera sürekli otomatik odaklama modundayken (FOCUS_MODE_CONTINUOUS_VIDEO veya FOCUS_MODE_CONTINUOUS_PICTURE) onAutoFocusMoving() numaralı telefona bir çağrı alırsınız. Bu çağrı, otomatik odaklamanı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 çıkarı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 nesnesi örneklendirmeniz yeterlidir. İstediğiniz sesi önceden yüklemek için load() çağrısı yapın, ardından uygun zamanda play() işlevini çağırın.

Bağlantı

Android Beam

Android BeamTM artık Bluetooth üzerinden büyük yük aktarımlarını destekliyor. 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 özellik, özellikle resim ve ses dosyaları gibi büyük boyutlu dosyalar için faydalıdır ve cihazlar arasında görünür bir eşleştirme yapılmasını gerektirmez. Bluetooth üzerinden yapılan 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 sırasında paylaşılacak URI'leri tanımlayabilirsiniz. Bu, paylaşılacak URI'ler etkinlikteki kullanıcı bağlamına göre değişebiliyorsa faydalıdır. Ancak setBeamPushUris() çağrısı, paylaşılacak URI'ler değişmediğinde ve bunları önceden güvenli bir şekilde tanımlayabileceğiniz durumlarda yararlıdır.

Ağ hizmeti keşfi

Android 4.1, kablosuz ağ üzerinden eş cihazların sunduğu hizmetleri (ör. mobil cihazlar, yazıcılar, kameralar, medya oynatıcılar ve yerel ağa kayıtlı olan diğer cihazlar) bulup bağlanmanıza olanak tanıyan çoklu yayın DNS tabanlı hizmet keşfi için 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 hizmetinizin çeşitli özelliklerini setServiceName(), setServiceType() ve setPort() gibi yöntemlerle tanımlamanız gerekir.

Ardından, NsdManager.RegistrationListener kodunu uygulamanız ve NsdServiceInfo ile registerService() hizmetine iletmeniz gerekir.

Ağdaki hizmetleri keşfetmek için NsdManager.DiscoveryListener işlemini uygulayıp discoverServices() hizmetine geçirin.

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

Kablosuz P2P hizmet keşfi

Wi-Fi P2P API'leri, 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) bir hizmeti 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() hizmetini kullanarak uygulama hizmetlerinizi açıklayan WifiP2pServiceInfo nesnesini gönderin.

Yakındaki cihazları kablosuz ağ üzerinden keşfetmek için öncelikle 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 alan geri çağırma işleyicileri ayarlayın. Upnp'yi kullanmak için setUpnpServiceResponseListener() yöntemini çağırı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 geçirdiğiniz WifiP2pManager.ActionListener başarılı bir geri arama aldığında discoverServices() numaralı telefonu arayarak yerel cihazlarda hizmetleri keşfetmeye başlayabilirsiniz.

Yerel hizmetler keşfedildiğinde, Bonjour veya Upnp kullanmak için kaydolmuş olmanıza bağlı olarak WifiP2pManager.DnsSdServiceResponseListener ya da WifiP2pManager.UpnpServiceResponseListener numarasına geri arama yapılır. 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 etmenize olanak tanır. 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 ve işlemleri şimdi mi yoksa daha sonra mı gerçekleştireceğinize (örneğin, cihazın kablosuz ağa ne zaman bağlanacağı) karar vermenize yardımcı olabilirsiniz.

Erişilebilirlik

Erişilebilirlik hizmeti API'leri

Erişilebilirlik hizmeti API'lerinin erişimi, Android 4.1'de önemli ölçüde artırılmıştır. Bu sayede artık AccessibilityEvent, AccessibilityNodeInfo ve AccessibilityRecord sınıflarına yapılan eklemelerle onGesture() kullanarak karmaşık hareketler ve diğer giriş etkinlikleri gibi daha fazla giriş etkinliğini izleyen ve bunlara yanıt veren hizmetler geliştirebilirsiniz.

Erişilebilirlik hizmetleri ayrıca kullanıcı adına performAction ve setMovementGranularities kullanarak tıklama, kaydırma ve metinde adım adım ilerleme gibi işlemler de 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

Android uygulaması oluştururken artık findFocus() ve focusSearch() ile odaklanılabilir öğeleri ve giriş widget'larını bularak gezinme şemalarını özelleştirebilirsiniz. Ayrıca, setAccessibilityFocused() kullanarak odağı ayarlayabilirsiniz.

Daha erişilebilir widget'lar

Yeni android.view.accessibility.AccessibilityNodeProvider sınıfı, karmaşık özel görünümleri erişilebilirlik hizmetlerinde öne çıkarmanıza olanak tanır. Böylece bu görünümler, bilgileri daha erişilebilir bir şekilde sunabilir. 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 anlamlı 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ına olanak tanır.

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'sını 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, okuma veya yazma erişimi sağlamak için niyetin bayraklarını da dikkate alarak bir amaçtaki birden fazla URI'ye erişim izni vermenizi sağlar. Bir ACTION_SEND veya ACTION_SEND_MULTIPLE niyeti başlatırken amaçta sağlanan URI'lar artık otomatik olarak ClipData'ye yayılır. Böylece alıcı, bunlara erişim izni verebilir.

HTML ve dize stilleri için destek

ClipData sınıfı artık stil verilmiş metinleri (HTML veya Android stilli dizeler olarak) desteklemektedir. newHtmlText() öğelerini kullanarak ClipData reklam grubuna HTML stili metin ekleyebilirsiniz.

Renderscript

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

  • Tek bir komut dosyası içinde birden çok çekirdek desteği.
  • Yeni bir komut dosyası API'sinde işlemden filtrelenmiş örnekleyicilerle ayırmadan okuma desteği rsSample.
  • #pragma içinde farklı FP hassasiyeti seviyeleri için destek.
  • Compute komut dosyasından RS nesnelerinden ek bilgileri sorgulama desteği.
  • Çok sayıda performans iyileştirmesi.

Compute Renderscript'lerinizin gerektirdiği kayan nokta hassasiyetini tanımlamak için yeni pragma'lar da mevcuttur. Bu sayede tam IEEE 754-2008 standardıyla mümkün olmayacak olan, CPU yolunda hızlı vektör matematik işlemleri gibi NEON benzeri işlemleri etkinleştirebilirsiniz.

Not: Deneysel Renderscript grafik altyapısı 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 bir Bundle oluşturun. Ardından startActivity() gibi etkinlik başlatan yöntemlere iletebilirsiniz.

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 yukarı ölçekleyen bir animasyon oluşturur. Örneğin, Android 4.1'in ana ekranı bir uygulamayı açarken bunu kullanır.
makeThumbnailScaleUpAnimation()
Etkinlik penceresini belirtilen bir konumdan ve sağlanan bir küçük resimden başlayarak ölçeklendiren bir animasyon 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 geçerlidir.

Zaman animatörü

Yeni TimeAnimator, animasyonun her karesinde sizi bilgilendiren TimeAnimator.TimeListener ile basit bir geri çağırma mekanizması sunar. Bu Animatör'de süre, interpolasyon veya nesne değer ayarı yoktur. İşleyicinin geri çağırma işlevi, her bir kare için, önceki animasyon karesinden bu yana geçen toplam süre ve geçen süre de dahil olmak üzere 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 belirtmenize 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 resim eki içeren bildirimler için.
Notification.BigTextStyle
Tek bir e-posta gibi çok fazla metin içeren bildirimler içindir.
Notification.InboxStyle
Bir dize listesi (ör. birden çok e-postadan snippet'ler) içeren bildirimler için.
Bildirim işlemleri

Artık bildiriminizde ister normal ister daha büyük olsun, 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 gerçekleştirilecek işlemi tanımlayan bir PendingIntent.

Öncelikler

Artık önceliği setPriority() ile ayarlayarak bildiriminizin listedeki sırasını etkilemesi için sisteme ipucu verebilirsiniz. Bunu, Notification sınıfındaki PRIORITY_* sabit değerleri tarafından tanımlanan beş farklı öncelik düzeyinden birini geçirebilirsiniz. Varsayılan olarak PRIORITY_DEFAULT, iki üst düzey ve iki alt düzey vardır.

Yüksek öncelikli bildirimler, kullanıcıların genellikle hızlı bir şekilde yanıtlamak istedikleri yeni bir anlık mesaj, kısa mesaj veya yaklaşan etkinlik hatırlatıcısı gibi şeylerdir. 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ü karartmak veya cep telefonlarında tamamen kaybolmasını sağlamak gibi yeni işaretler ekledi. Android 4.1'de, setSystemUiVisibility() yöntemini çağırıp aşağıdaki işaretleri ileterek sistem kullanıcı arayüzü öğelerinin görünümünü ve bunlarla ilişkili etkinlik düzeninizi daha iyi kontrol edebilmenizi sağlayan birkaç bayrak daha eklendi:

SYSTEM_UI_FLAG_FULLSCREEN
Kritik olmayan sistem kullanıcı arayüzünü (ör. durum çubuğu) gizler. Etkinliğiniz, yer paylaşımı modunda işlem çubuğunu kullanıyorsa (android:windowActionBarOverlay'i etkinleştirerek) bu işaret, işlem çubuğunu da gizler ve bunu, ikisini birlikte gizlerken ve gösterirken koordine 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 kaplanıyor olsa da uygulamanız sistem kullanıcı arayüzünü sık sık gizleyip SYSTEM_UI_FLAG_FULLSCREEN ile gösteriyorsa bu özellik yararlıdır. Çünkü bu özellik, sistem kullanıcı arayüzü her gizlendiğinde veya her göründüğünde düzeninizin yeni düzen sınırlarına ayarlanmasını önler.
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 eklenen) ö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 binse de 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
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN ve/veya SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION kullanıyorsanız bu işareti ekleyerek 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ğlayabilirsiniz. Yani bu işaret ayarlandığında fitSystemWindows(), tüm sistem kullanıcı arayüzünü gizledikten sonra bile sistem kullanıcı arayüzü öğelerinin görünürlüğü değişmemiş gibi davranır.

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

Uzaktan görünümler

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'in, Roboto yazı tipi stilinin birkaç varyantını da ekleyerek toplam 10 varyant ekledik 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 tam grubuna erişebilir.

Kullanabileceğiniz 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
  • Sıkıştırılmış italik
  • Sıkıştırılmış kalın
  • Sıkıştırılmış kalın italik

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

fontFamily için desteklenen değerler şunlardır:

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

Ardından textStyle değerleriyle "bold" ve "italic" değerlerini kalın ve/veya italik olarak uygulayabilirsiniz. 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ş cihazlarını sorgulamanıza ve yeni bir cihaz eklendiğinde, değiştirildiğinde veya kaldırıldığında bildirim almak üzere kaydolmanıza olanak tanır. Bu, özellikle birden fazla 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 faydalı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 almak üzere getInputDevice() yöntemini çağırabilirsiniz.

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

Giriş denetleyicileri için titreş

Bağlı giriş cihazlarının kendi titreşim özellikleri varsa artık InputDevice üzerinden getVibrator() yöntemini çağırarak 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. Android 4.1'de varsayılan olarak 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 isterse otomatik olarak okuma erişimi de alır. Geliştiricilerin uygulamalarını Android'in gelecekteki davranışına göre test etmeleri için okuma erişimi kısıtlamasını etkinleştirmeye yönelik yeni bir geliştirici seçeneği var.
android.Manifest.permission.READ_USER_DICTIONARY
Bir uygulamanın, kullanıcı sözlüğünü okumasına izin verir. Bu işlem yalnızca IME veya Ayarlar uygulaması gibi bir sözlük düzenleyici tarafından gerekli kılınmalıdır.
READ_CALL_LOG
Uygulamaların, sistemin gelen ve giden aramalarla ilgili bilgileri içeren çağrı günlüğünü okumasına izin verir.
WRITE_CALL_LOG
Uygulamaların, sistemin telefonunuzda depolanan çağrı kaydını değiştirmesine izin verir
android.Manifest.izni.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 bir televizyon arayüzü gerektirdiğini beyan etmek için bu özelliği manifest dosyanızda <uses-feature> öğesiyle 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 bir ekranda görüntülenir ve en yaygın giriş biçimi d-pad'dir ve genellikle dokunma veya fare/işaretçi cihaz kullanılmaz.