Android 4.1 API'leri

API Düzeyi: 16

Android 4.1 (JELLY_BEAN), daha iyi performans ve gelişmiş 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'lere giriş sunulmaktadır.

Bir uygulama geliştiricisi olarak Android 4.1, 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 platformu olarak SDK Yöneticisi'nden kullanımınıza sunulur. Uygulamanızı Android 4.1'de derleyip test etmek için sistem görüntüsünü ve platformu en kısa sürede indirmelisiniz.

Uygulamanızı Android 4.1 çalıştıran cihazlar için daha iyi optimize etmek amacıyla targetSdkVersion dosyanızı "16" olarak ayarlamanız, bir Android 4.1 sistem resmine yüklemeniz, test etmeniz ve ardından bu değişikliği içeren bir güncelleme yayınlamanız gerekir.

Android 4.1'de API'leri kullanırken minSdkVersion tarafından desteklenmeyen API'leri çalıştırmadan önce sistem API düzeyini kontrol eden koşullar ekleyerek eski sürümleri de destekleyebilirsiniz. Geriye dönük uyumluluğu sağlama hakkında daha fazla bilgi edinmek için Geriye Dönük Kullanıcı Arayüzü Oluşturma konusunu okuyun.

API düzeylerinin işleyiş şekli hakkında daha fazla bilgiyi API düzeyi nedir? başlıklı makalede bulabilirsiniz.

Uygulama Bileşenleri

Yalıtılmış hizmetler

<service> etiketinde android:isolatedProcess="true" belirterek Service'inizi, kendi izinleri olmayan kendi izole kullanıcı kimliği işlemi altında çalıştırabilirsiniz.

Bellek yönetimi

TRIM_MEMORY_RUNNING_LOW ve TRIM_MEMORY_RUNNING_CRITICAL gibi yeni ComponentCallbacks2 sabitleri, sistem onLowMemory()'ı çağırmadan önce ön plan işlemlerine 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(), içerik sağlayıcının çökmesi durumunda uygulamanızın kilitlenmemesi için "istikrarsız" olabilecek bir ContentProviderClient'a erişmenize olanak tanır. Ayrı bir uygulamada içerik sağlayıcılarla etkileşime geçtiğinizde kullanışlıdır.

Animasyonlu Duvar Kağıtları

Kullanıcıları uygulamanızdan çıkıp Ana ekran duvar kağıdı seçicisinde gezinmeye zorlamadan canlı duvar kağıdınızı kolayca seçmelerine yardımcı olmak için canlı duvar kağıdı önizleme etkinliğini doğrudan başlatan yeni intent protokolü.

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

Uygulama yığınında gezinme

Android 4.1, yukarı gezinme için uygun tasarım kalıplarının uygulanmasını çok daha kolay hale getirir. Tek yapmanız gereken, manifesto dosyanızdaki her <activity> öğesine android:parentActivityName eklemektir. Sistem, kullanıcı işlem çubuğundaki yukarı düğmesine bastığında (aynı zamanda geçerli etkinliği de sonlandırırken) uygun etkinliği açmak için bu bilgileri kullanır. Bu nedenle, her etkinlik için android:parentActivityName bildirirseniz işlem çubuğundaki uygulama simgesinde tıklama etkinliklerini işlemek için onOptionsItemSelected() yöntemine ihtiyacınız olmaz. Artık sistem bu etkinliği işler ve uygun etkinliği devam ettirir ya da oluşturur.

Bu özellikle, kullanıcının bir bildirim veya farklı bir uygulamadan gelen bir intent gibi "derinlemesine" bir intent aracılığıyla uygulamanızın etkinliklerinden birine girdiği senaryolar için güçlüdür (Uygulamalar Arasında Gezinme ile ilgili tasarım kılavuzunda açıklandığı gibi). Kullanıcı, etkinliğinizi bu şekilde girdiğinde, uygulamanızda doğal olarak kullanıcı yukarı doğru ilerledikçe devam ettirilebilecek bir grup etkinlik bulunmayabilir. Ancak etkinlikleriniz için android:parentActivityName özelliğini sağladığınızda sistem, uygulamanızın halihazırda bir üst etkinlik arka yığınına sahip olup olmadığını algılar ve yoksa tüm üst etkinlikleri içeren sentetik bir arka yığın oluşturur.

Not: Kullanıcı uygulamanızda derin bir etkinliğe girdiğinde ve uygulamanız için yeni bir görev oluşturduğunda sistem aslında üst etkinlik grubunu göreve ekler. Bu nedenle, Geri düğmesine basıldığında üst etkinlikler grubu içinde de geri gidilir.

Sistem, uygulamanız için sentetik bir arka yığını oluşturduğunda her üst etkinliğin yeni bir örneğini oluşturmak amacıyla temel bir Intent oluşturur. Bu nedenle, kullanıcı her bir etkinlikte doğal bir şekilde gezinmiş olsaydı beklediğiniz şekilde üst etkinlikler için kayıtlı 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 bilgileri eksik olur ve kullanıcı yığında geri gittiğinde bu bilgileri sunmanız gerekir. Örneğin, kullanıcı bir albümü bir müzik uygulamasında görüntülüyorsa yukarı gittikten sonra, kullanıcı seçili bir müzik türündeki tüm albümlerin listelendiği bir etkinliğe yönlendirilebilir. Bu durumda, grubun oluşturulması gerekiyorsa ana etkinliğin, kullanıcı gerçekten ilgili etkinlikten gelmiş gibi doğru listeyi gösterebilmesi için mevcut albümün türü hakkında bilgilendirilmesi gerekir. Bu tür bilgileri sentetik bir üst etkinliğe iletmek için onPrepareNavigateUpTaskStack() yöntemini geçersiz kılmanız gerekir. Bu sayede, ebeveyn etkinliklerini sentezlemek için sistemin oluşturduğu bir TaskStackBuilder nesnesi elde edersiniz. TaskStackBuilder, sistemin her bir üst etkinliği oluşturmak için kullandığı Intent nesnelerini içerir. onPrepareNavigateUpTaskStack() uygulamanızda, uygun bağlamı belirlemek ve uygun kullanıcı arayüzünü görüntülemek için üst etkinliğin kullanabileceği ek veriler eklemek üzere uygun Intent öğesini değiştirebilirsiniz.

Sistem TaskStackBuilder'ü 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ı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ın daha karmaşık olması durumunda, yukarı gezinme davranışını yönetmenize ve sentetik geri yığınını tamamen özelleştirmenize olanak tanıyan başka API'ler de mevcuttur. 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)
Geçerli etkinliği tamamlamak ve sağlanan Intent ile belirtilen etkinliğe gitmek için bu çağrıyı yapın. Etkinlik arka yığınta mevcutsa ancak en yakın üst öğe değilse mevcut etkinlik ile intent ile belirtilen etkinlik arasındaki diğer tüm etkinlikler de sonlandırılır.
getParentActivityIntent()
Mevcut etkinliğin mantıksal üst öğesini başlatacak Intent öğesini almak için bunu çağırın.
shouldUpRecreateTask(Intent)
Yukarı gezinmek için sentetik bir geri yığın oluşturulup oluşturulmayacağını sorgulamak üzere bu işlevi çağırın. Sentetik bir yığın oluşturulması gerekiyorsa doğru, uygun yığın zaten mevcutsa yanlış değerini döndürür.
finishAffinity()
Mevcut etkinliği ve mevcut etkinliğe zincirlenmiş, 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ı gezinme sırasında sentetik bir geri yığın oluşturduğunuzda bu yöntemi çağırmanız gerekir.
onCreateNavigateUpTaskStack
Yapay görev yığınının nasıl oluşturulduğunu tam olarak kontrol etmeniz gerekiyorsa bunu geçersiz kılın. Yalnızca arka yığınınızın intent'lerine ek veri eklemek istiyorsanız onPrepareNavigateUpTaskStack()
yerine onPrepareNavigateUpTaskStack()
değerini geçersiz kılmanız gerekir.

Bununla birlikte, çoğu uygulamanın bu API'leri kullanması veya onPrepareNavigateUpTaskStack() öğesini uygulaması gerekmez ancak her bir <activity> öğesine android:parentActivityName ekleyerek doğru davranışı sağlayabilir.

Multimedya

Medya codec'leri

MediaCodec sınıfı, medyanızı kodlamak ve kodlarını çözmek için düşük düzey medya codec'lerine erişim sağlar. Medyayı kodlamak için createEncoderByType()'u, medyanın kodunu çözmek için de createDecoderByType()'yi ç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ü (ör. "video/3gpp" veya "audio/vorbis") alır.

Oluşturulan MediaCodec örneğiyle, medya biçimi veya içeriğin şifrelenmiş olup olmadığı gibi özellikleri belirtmek için configure()'u çağırabilirsiniz.

Medyanızı ister kodlama ister kodunu çözüyor olun, MediaCodec oluşturulduktan sonra işlemin geri kalanı aynıdır. Önce giriş ByteBuffer nesnesi dizisi almak için getInputBuffers()'ü, çıkış ByteBuffer nesnesi dizisi almak için getOutputBuffers()'yi çağırın.

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

Çıkış arabelleği için de aynı şekilde, sonuçları alacağınız ByteBuffer öğesinin dizin konumunu almak üzere dequeueOutputBuffer() işlevini çağırın. ByteBuffer'teki çıkışı okuduktan sonra releaseOutputBuffer()'ü çağırarak sahipliği bırakın.

Normal queueInputBuffer() yerine MediaCrypto API'leriyle birlikte queueSecureInputBuffer()'ü çağırarak kodeklere şifrelenmiş medya verilerini işleyebilirsiniz.

Kodeklerin nasıl kullanılacağı hakkında daha fazla bilgi için MediaCodec dokümanlarına bakın.

Ses kaydı geldiğinde ses kaydet

Yeni startRecording() yöntemi, MediaSyncEvent tarafından tanımlanan bir işarete göre ses kaydına başlamanıza olanak tanır. MediaSyncEvent, bir ses oturumunu (ör. MediaPlayer tarafından tanımlanan) belirtir ve tamamlandığında ses kaydediciyi kaydı başlatmasını tetikler. Örneğin, bu işlevi kullanarak kayıt oturumunun başlangıcını belirten bir ses tonu çalabilirsiniz. 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 kanallarını işler. Bant içi metin parçaları, MP4 veya 3GPP medya kaynağında metin parçası olarak gelir. Bant dışı metin parçaları, addTimedTextSource() yöntemi aracılığıyla harici metin kaynağı olarak eklenebilir. Tüm harici albüm kapaklı video kaynakları eklendikten sonra, bir veri kaynağındaki tüm mevcut parçaların yenilenen listesini almak için getTrackInfo() çağrılmalıdır.

Kanalı MediaPlayer ile kullanmak üzere ayarlamak için kullanmak istediğiniz kanalın dizin konumunu kullanarak selectTrack() yöntemini çağırmanız gerekir.

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

Ses efektleri

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

  • AcousticEchoCanceler özelliğine sahip Akustik Yankı İptal Edici (AEC), yakalanan ses sinyalinden uzak taraftan alınan sinyalin katkısını kaldırır.
  • AutomaticGainControl ile Otomatik Kazanç Kontrolü (AGC), yakalanan sinyalin çıkışını otomatik olarak normalize eder.
  • NoiseSuppressor ile Gürültü Azaltıcı (NS) yakalanan sinyaldeki arka plan gürültüsünü giderir.

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

Not: Tüm cihazların bu efektleri desteklediği garanti edilmez. Bu nedenle, her zaman ilgili ses efekti sınıfında isAvailable()'yi çağırarak kullanılabilirliği kontrol etmeniz gerekir.

Aralıksız oynatma

Artık iki ayrı MediaPlayer nesnesi arasında kesintisiz oynatma yapabilirsiniz. İlk MediaPlayer tamamlanmadan önce herhangi bir zamanda setNextMediaPlayer() numarasını arayın ve Android, ilk oynatıcı durduğu anda ikinci oynatıcıyı başlatmaya çalışır.

Medya yönlendiricisi. MediaRouter, MediaRouteActionProvider ve MediaRouteButton adlı yeni API'ler, 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 Camera.AutoFocusMoveCallback, otomatik odaklama hareketindeki değişiklikleri dinlemenize olanak tanır. Arayüzünüzü setAutoFocusMoveCallback() ile kaydedebilirsiniz. Ardından, 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 odağın hareket etmeye mi başladığını yoksa hareket etmeyi mi durdurduğunu bildirir.

Kamera sesleri

MediaActionSound sınıfı, kamera veya diğer medya işlemleri tarafından oluşturulan standart sesleri üretmek için basit bir API grubu sağlar. Özel bir fotoğraf veya video kamerası oluştururken uygun sesi çalmak için bu API'leri kullanmanız gerekir.

Ses çalmak için bir MediaActionSound nesnesi oluşturun, load()'yi çağırarak istediğiniz sesi önceden yükleyin ve uygun zamanda play()'yi çağırın.

Bağlantı

Android Beam

Android Beam™ artık Bluetooth üzerinden büyük veri aktarımını desteklemektedir. Yeni setBeamPushUris()yöntemi veya yeni geri çağırma arayüzü NfcAdapter.CreateBeamUrisCallback ile aktarılacak verileri tanımladığınızda Android, daha hızlı aktarım hızları elde etmek için veri aktarımını Bluetooth'a veya başka bir alternatif aktarım aracına aktarır. Bu yöntem ö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. Uygulamanızın Bluetooth üzerinden aktarımlardan yararlanması için ek işlem yapması gerekmez.

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

Geri çağırma arayüzü kullanıldığında sistem, kullanıcı Android Beam ile paylaşım yaptığında arayüzün createBeamUris() yöntemini çağırır. Böylece, paylaşım sırasında paylaşılacak URI'leri tanımlayabilirsiniz. Paylaşılacak URI'ler etkinlik içindeki kullanıcı bağlamına göre değişebiliyorsa bu yöntem faydalıdır. Paylaşılacak URI'ler değişmezse ve bunları önceden güvenli bir şekilde tanımlayabiliyorsanız setBeamPushUris() çağrısı faydalıdır.

Ağ hizmeti keşfi

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

Yeni android.net.nsd paketi, 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 kaydettirmek için öncelikle 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 öğesini uygulamanız ve NsdServiceInfo ile registerService() öğesine aktarmanız gerekir.

Ağdaki hizmetleri keşfetmek için NsdManager.DiscoveryListener öğesini uygulayın ve discoverServices() adlı kullanıcıya iletin.

NsdManager.DiscoveryListener'ünüz bulunan hizmetlerle ilgili geri aramalar aldığında, resolveService()'u çağırarak hizmeti çözmeniz gerekir. Bu sırada, resolveService()'a, bulunan hizmetle ilgili bilgileri içeren bir NsdServiceInfo nesnesi alan NsdManager.ResolveListener uygulaması göndererek bağlantıyı başlatabilirsiniz.

Kablosuz P2P hizmet keşfi

Android 4.1'de, kablosuz P2P API'leri WifiP2pManager içinde ilişkilendirme öncesi hizmet keşfini desteklemek için geliştirildi. Bu sayede, bir cihaza bağlanmadan önce yakındaki cihazları kablosuz P2P kullanarak keşfedip hizmetlere göre filtreleyebilirsiniz. Ağ Hizmeti Keşfi ise mevcut bir bağlı ağdaki (ör. yerel kablosuz ağ) bir hizmeti keşfetmenize olanak tanır.

Diğer cihazların uygulamanızı bulup bağlanabilmesi için uygulamanızı kablosuz ağ üzerinden hizmet olarak yayınlamak üzere addLocalService() işlevini, uygulama hizmetlerinizi açıklayan bir WifiP2pServiceInfo nesnesi ile çağırın.

Kablosuz ağ üzerinden yakın cihazların keşfini başlatmak için öncelikle Bonjour mu yoksa Upnp mi kullanacağınıza karar vermeniz gerekir. Bonjour'u kullanmak için önce setDnsSdResponseListeners() ile geri arama dinleyicileri ayarlayın. Bu işlem için hem WifiP2pManager.DnsSdServiceResponseListener hem de WifiP2pManager.DnsSdTxtRecordListener gerekir. Upnp'yi kullanmak için setUpnpServiceResponseListener() işlevini çağırın. Bu işlem WifiP2pManager.UpnpServiceResponseListener alır.

Yerel cihazlarda hizmetleri keşfetmeye başlamadan önce addServiceRequest() adresini de çağırmanız gerekir. Bu yönteme ilettiğiniz WifiP2pManager.ActionListener başarılı bir geri arama aldığında discoverServices()'ı arayarak yerel cihazlardaki hizmetleri keşfetmeye başlayabilirsiniz.

Yerel hizmetler keşfedildiğinde, Bonjour veya Upnp'yi kullanmaya kaydolup kaydolmadığınıza bağlı olarak WifiP2pManager.DnsSdServiceResponseListener veya WifiP2pManager.UpnpServiceResponseListener adresine geri arama alırsınız. 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 şu anda ücretli 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ıza paraya mal olabilecek veri kullanımını yönetmeye yardımcı olabilir ve işlemlerin hemen mi yoksa daha sonra mı (ör. cihaz kablosuz ağa bağlandığında) gerçekleştirileceği konusunda bilinçli kararlar alabilirsiniz.

Erişilebilirlik

Erişilebilirlik hizmet 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 yapılan eklemeler sayesinde onGesture() ve diğer giriş etkinliklerini kullanarak karmaşık hareketler gibi daha fazla giriş etkinliğini izleyip yanıtlayan hizmetler oluşturabilirsiniz.

Erişilebilirlik hizmetleri, kullanıcı adına performAction ve setMovementGranularities tuşlarını kullanarak metni tıklama, kaydırma ve metin içinde gezinme gibi işlemleri 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() kullanarak odaklanılabilir öğeleri ve giriş widget'larını bulup setAccessibilityFocused() ile odağı ayarlayarak gezinme şemalarını özelleştirebilirsiniz.

Daha erişilebilir widget'lar

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

Kopyalama ve Yapıştırma

Intent'lerle 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 aktarma amacı kullanıldığında (örneğin, birden fazla doküman paylaşırken) yararlı olur. Bu şekilde sağlanan content: URI'leri, okuma veya yazma erişimi sunmak için intent'in işaretlerine de uyar. Böylece intent'deki birden fazla URI'ye erişim izni verebilirsiniz. ACTION_SEND veya ACTION_SEND_MULTIPLE amacı başlatılırken, amaçta sağlanan URI'lar artık alıcının erişim izni alabilmesi için artık otomatik olarak ClipData öğesine yayılıyor.

HTML ve dize stilleri için destek

ClipData sınıfı artık stilize metni (HTML veya Android stilize dizeleri olarak) desteklemektedir. newHtmlText() ile ClipData öğesine HTML stilinde metin ekleyebilirsiniz.

Renderscript

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

  • Tek bir komut dosyasında birden fazla çekirdek desteği.
  • Yeni bir komut dosyası API'sinde, Compute'tan filtrelenmiş örnekleyicilerle ayırmadan okuma desteğirsSample.
  • #pragma sürümünde farklı FP hassasiyet seviyeleri için destek.
  • Bir Compute komut dosyasındaki RS nesnelerindeki ek bilgileri sorgulama desteği.
  • Çok sayıda performans iyileştirmesi.

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

Not: Deneysel Renderscript grafik motoru artık kullanımdan kaldırıldı.

Animasyon

Etkinlik başlatma animasyonları

Artık yakınlaştırma animasyonlarını veya kendi özel animasyonlarınızı kullanarak Activity başlatabilirsiniz. İstediğiniz animasyonu belirtmek için ActivityOptions API'lerini kullanarak bir Bundle oluşturun. Ardından bu Bundle'yi startActivity() gibi bir etkinliği başlatan yöntemlerden herhangi birine 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()
Ekrandaki belirli bir başlangıç konumundan ve belirli bir başlangıç boyutundan itibaren etkinlik penceresini büyüten bir animasyon oluşturur. Örneğin, Android 4.1'deki ana ekran, uygulama açarken bu yöntemi kullanır.
makeThumbnailScaleUpAnimation()
Belirli bir konumdan ve sağlanan küçük resimden başlayarak etkinlik penceresini ö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: Bir animasyon, etkinliğin açılması için, diğer animasyon ise etkinliğin durdurulması için kullanılır.

Zaman animatörü

Yeni TimeAnimator, animasyondaki her karede sizi bilgilendiren TimeAnimator.TimeListener ile basit bir geri çağırma mekanizması sağlar. Bu Animatörde süre, interpolasyon veya nesne değer ayarı yapılmaz. İşleyicinin geri çağırması, her kare için toplam geçen süre ve bir önceki animasyon karesinden bu yana 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 içeren bildirimler oluşturabilirsiniz.

Bildirim stilleri

Yeni setStyle() yöntemi, bildiriminiz için her biri daha büyük bir içerik bölgesi sunan üç yeni stilden birini belirtmenize olanak tanır. Büyük içerik bölgenizin stilini belirtmek için setStyle() 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çin.
Notification.InboxStyle
Birden fazla e-postadaki snippet'ler gibi, dizelerin bir listesini içeren bildirimler için.
Bildirim işlemleri

Artık bildiriminiz normal veya daha büyük stilde kullanılsın fark etmeksizin bildirim mesajının alt kısmında iki işlem düğmesi gösterilebilir.

İşlem düğmesi eklemek için addAction() işlevini çağırın. Bu yöntem üç bağımsız değişken alır: simge için çizilebilir bir kaynak, düğme için metin ve gerçekleştirilecek işlemi tanımlayan bir PendingIntent.

Öncelikler

Artık setPriority() ile önceliği ayarlayarak bildiriminizin listedeki sırasını etkilemek için bildiriminizin ne kadar önemli olduğunu sisteme bildirebilirsiniz. Bu değeri, Notification sınıfındaki PRIORITY_* sabitleriyle tanımlanan beş farklı öncelik seviyesinden birini iletebilirsiniz. Varsayılan değer PRIORITY_DEFAULT'tür ve iki seviye daha yüksek ve iki seviye daha düşük değer vardır.

Yüksek öncelikli bildirimler, kullanıcıların genellikle hızlı bir şekilde yanıtlamak istediği bildirimlerdir (ör. yeni bir anlık mesaj, kısa mesaj veya yaklaşan etkinlik hatırlatıcısı). Düşük öncelikli bildirimler arasında süresi dolmuş takvim etkinlikleri veya uygulama promosyonları yer alır.

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 yeni işaretler ekledi. Örneğin, sistem çubuğunun görünümünü karartmak veya cep telefonlarında tamamen kaybolmasını sağlamak için bu işaretleri kullanabilirsiniz. Android 4.1, setSystemUiVisibility() işlevini çağırıp aşağıdaki işaretçileri ileterek sistem kullanıcı arayüzü öğelerinin görünümünü ve bunlarla ilgili etkinlik düzeninizi daha fazla kontrol etmenize olanak tanıyan birkaç işaretçi daha ekler:

SYSTEM_UI_FLAG_FULLSCREEN
Kritik olmayan sistem kullanıcı arayüzünü (durum çubuğu gibi) gizler. Etkinliğiniz, eylem çubuğunu yer paylaşımı modunda kullanıyorsa (android:windowActionBarOverlay etkinleştirilerek) bu işaret, eylem çubuğunu da gizler ve bunu ikisini de gizlerken ve gösterirken koordineli 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'ı etkinleştirdiğinizde kullanılabilen aynı ekran alanını kullanacak şekilde ayarlar. Uygulamanız SYSTEM_UI_FLAG_FULLSCREEN ile sistem kullanıcı arayüzünü sık sık gizleyip gösteriyorsa bu, düzeninizin sistem kullanıcı arayüzü her gizlendiğinde veya göründüğünde yeni düzen sınırlarına göre ayarlanmasını önlediğinden kullanışlı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'ta eklendi) etkinleştirdiğinizde kullanılabilen aynı ekran alanını kullanacak şekilde ayarlar. Uygulamanız SYSTEM_UI_FLAG_HIDE_NAVIGATION ile gezinme çubuğunu sık sık gizleyip gösteriyorsa bu özellik faydalıdır. Çünkü bu durumda, gezinme çubuğu her gizlendiğinde veya göründüğünde düzeninizin yeni düzen sınırlarına göre ayarlanmasını önler.
SYSTEM_UI_FLAG_LAYOUT_STABLE
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN ve/veya SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION kullanıyorsanız bir görünümde fitSystemWindows()'ı çağırdığınızda tanımlanan sınırların mevcut ekran alanıyla tutarlı kalmasını sağlamak için bu işareti ekleyebilirsiniz. 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şaretçileri hakkında daha fazla bilgi edinmek için Android 4.0'a eklenen işaretçileri okuyun.

Uzaktan görüntüleme

GridLayout ve ViewStub artık uzaktan taşınabilir görünümler olduğundan bunları uygulama widget'larınız ve bildirim özel düzenleriniz için düzenlerde kullanabilirsiniz.

Yazı tipi aileleri

Android 4.1, Roboto yazı tipi stilinin toplam 10 varyantını ekler. Bu varyantları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.

Kullanılabilir Roboto yazı tipi varyantlarının tamamı şunlardır:

  • Normal
  • İtalik
  • Kalın
  • Kalın-italik
  • Hafif
  • Açık italik
  • Daraltılmış normal
  • Daraltılmış italik
  • Daraltılmış kalın
  • Kalın italik

Bunlardan herhangi birini, textStyle özelliğiyle birlikte yeni fontFamily özelliğiyle 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 textStyle değerleri "bold" ve "italic" ile kalın ve/veya italik uygulayabilirsiniz. Her ikisini de şu şekilde uygulayabilirsiniz: android:textStyle="bold|italic".

Typeface.create() simgesini de 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ı 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 özellik, özellikle birden fazla oyuncuyu destekleyen bir oyun geliştiriyorsanız ve kaç tane denetleyicinin bağlı olduğunu ve denetleyici sayısında ne zaman değişiklik olduğunu algılamak istiyorsanız yararlıdır.

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

Yeni giriş cihazları bağlandığında, değiştirildiğinde veya bağlantısı kesildiğinde bildirim almak 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 mevcut Vibrator API'lerini kullanarak bu cihazların titreşimini kontrol edebilirsiniz. Bunun için InputDevice üzerinde getVibrator() öğesini çağırmanız yeterlidir.

İzinler

Aşağıdakiler yeni izinlerdir:

READ_EXTERNAL_STORAGE
Harici depolamaya korumalı okuma erişimi sağlar. Android 4.1'de varsayılan olarak tüm uygulamalar okuma erişimine sahiptir. Bu durum, gelecekteki bir sürümde değiştirilerek uygulamaların bu izni kullanarak açıkça okuma erişimi istemesi zorunlu kılınacaktır. Uygulamanız zaten yazma erişimi istiyorsa otomatik olarak okuma erişimi de alır. Geliştiricilerin uygulamalarını Android'in gelecekte nasıl davranacağına göre test edebilmesi için okuma erişimi kısıtlamasını etkinleştirmeye yönelik yeni bir geliştirici seçeneği sunulmaktadır.
android.Manifest.permission.READ_USER_DICTIONARY
Uygulamaların kullanıcı sözlüğünü okumasına izin verir. Bu işlem yalnızca bir IME veya Ayarlar uygulaması gibi bir sözlük düzenleyici tarafından gerekli olmalıdır.
READ_CALL_LOG
Uygulamaların, gelen ve giden aramalarla ilgili bilgileri içeren sistem çağrı kaydını okumasına izin verir.
WRITE_CALL_LOG
Uygulamaların, telefonunuzda kayıtlı sistem arama 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ülemek için özel olarak tasarlanmış cihazlar için yeni bir özellik beyanı içerir: FEATURE_TELEVISION. Uygulamanızın 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, "televizyon"u tipik bir oturma odası televizyon deneyimi olarak tanımlar: Kullanıcının uzakta oturduğu büyük bir ekranda gösterilir ve girişin baskın biçimi, genellikle dokunma veya fare/işaretçi cihaz yerine d-pad gibi bir şeydir.