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.
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 gizleyipSYSTEM_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ıkSYSTEM_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/veyaSYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
kullanıyorsanız bu işareti ekleyerek bir görünümdefitSystemWindows()
ç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ığı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ş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.