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()
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.
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ği
rsSample
. #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ızSYSTEM_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ızSYSTEM_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/veyaSYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
kullanıyorsanız bir görünümdefitSystemWindows()
'ı ç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ığındafitSystemWindows()
, 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.