API Düzeyi: 16
Android 4.1 (JELLY_BEAN
)
daha iyi performans ve iyileştirilmiş kullanıcı deneyimi
sunan, platformun bir ilerlemesidir. Kullanıcılar ve uygulama geliştiriciler için yeni özellikler ekler. Bu belgede, uygulama geliştiriciler için en göze çarpan ve kullanışlı yeni API'ler tanıtılmaktadır.
Uygulama geliştirici olarak Android 4.1'i, Android emülatöründe çalıştırabileceğiniz bir sistem görüntüsü ve uygulamanızı oluşturmak için kullanabileceğiniz bir SDK platformunda çalıştırabileceğiniz bir sistem görüntüsü olarak SDK Yöneticisi'nden edinebilirsiniz. Uygulamanızı Android 4.1'de oluşturup test etmek için en kısa sürede sistem görüntüsünü ve platformu indirmeniz gerekir.
Uygulamanızı Android 4.1 çalıştıran cihazlar için daha iyi optimize etmek istiyorsanız targetSdkVersion
özelliğini "16"
olarak ayarlamanız, bir Android 4.1 sistem görüntüsüne yüklemeniz, test etmeniz ve ardından bu değişikliği içeren bir güncelleme yayınlamanız gerekir.
Kodunuza, minSdkVersion
tarafından desteklenmeyen API'leri yürütmeden önce sistem API düzeyini kontrol eden koşullar ekleyerek eski sürümleri desteklerken Android 4.1'de API'leri kullanabilirsiniz.
Geriye dönük uyumluluğu sağlama hakkında daha fazla bilgi için Geriye Doğru Uyumlu Kullanıcı Arayüzü Oluşturma bölümüne bakın.
API düzeylerinin işleyiş şekli hakkında daha fazla bilgiyi API Düzeyi nedir? bölümünde bulabilirsiniz.
Uygulama Bileşenleri
Yalıtılmış hizmetler
<service>
etiketinde android:isolatedProcess="true"
belirtildiğinde Service
, kendi izni olmayan kendi izole kullanıcı kimliği işlemi altında çalışır.
Bellek yönetimi
TRIM_MEMORY_RUNNING_LOW
ve TRIM_MEMORY_RUNNING_CRITICAL
gibi yeni ComponentCallbacks2
sabitleri, sistem onLowMemory()
yöntemini çağırmadan önce ön plan işlemlerinde bellek durumu hakkında daha fazla bilgi sağlar.
Yeni getMyMemoryState(ActivityManager.RunningAppProcessInfo)
yöntemi, genel bellek durumunu almanıza olanak tanır.
İçerik sağlayıcılar
Yeni bir yöntem olan acquireUnstableContentProviderClient()
, "kararsız" olabilecek bir ContentProviderClient
özelliğine erişmenize olanak tanır. Böylece içerik sağlayıcı devre dışı bıraktığında uygulamanız kilitlenmez. Ayrı bir uygulamada içerik sağlayıcılarla etkileşim kurarken bu özellik kullanışlıdır.
Animasyonlu Duvar Kağıtları
Animasyonlu duvar kağıdı önizleme etkinliğini doğrudan başlatan yeni intent protokolü, kullanıcıların uygulamanızdan ayrılmak ve Ana Ekran duvar kağıdı seçicide gezinmek zorunda kalmadan animasyonlu duvar kağıdınızı kolayca seçmelerine yardımcı olabilirsiniz.
Animasyonlu duvar kağıdı seçiciyi başlatmak için startActivity()
öğesini, ACTION_CHANGE_LIVE_WALLPAPER
ile Intent
ve EXTRA_LIVE_WALLPAPER_COMPONENT
içinde dize olarak belirten animasyonlu duvar kağıdı ComponentName
ile birlikte çağırın.
Uygulama yığınında gezinme
Android 4.1, Yukarı gezinme için doğru tasarım modellerini uygulamayı çok daha kolay hale getirir.
Tek yapmanız gereken, manifest dosyanızdaki her bir <activity>
öğesine android:parentActivityName
kodunu eklemektir. Sistem, kullanıcı işlem çubuğundaki Yukarı düğmesine bastığında (geçerli etkinliği de bitirirken) uygun etkinliği açmak için bu bilgileri kullanır. Dolayısıyla, her etkinlik için android:parentActivityName
özelliğini beyan ederseniz işlem çubuğunun uygulama simgesinde tıklama etkinliklerini işlemek için onOptionsItemSelected()
yöntemine ihtiyacınız yoktur. Sistem artık bu etkinliği işler ve uygun etkinliği devam ettirir veya oluşturur.
Bu, özellikle kullanıcının bildirim veya farklı bir uygulamadan gelen niyet gibi "ayrıntılı" bir niyetiyle uygulamanızın etkinliklerinden birine girdiği senaryolar için güçlüdür (Uygulamalar Arasında Gezinme tasarım kılavuzunda açıklandığı gibi). Kullanıcı, etkinliğinize bu şekilde girdiğinde uygulamanızda doğal olarak kullanıcı yukarı çıktıkça devam ettirilebilecek bir arka etkinlik grubu bulunmayabilir. Ancak, etkinlikleriniz için android:parentActivityName
özelliğini sağladığınızda sistem, uygulamanızın halihazırda bir üst öğe etkinliği yığını içerip içermediğini tespit eder ve yoksa tüm ebeveyn etkinliklerini içeren sentetik bir arka yığın oluşturur.
Not: Kullanıcı, uygulamanıza derin bir etkinlik girdiğinde ve bu işlem uygulamanız için yeni bir görev oluşturduğunda, sistem aslında üst etkinlikler yığınını göreve ekler. Aynı şekilde, Geri düğmesine basıldığında üst etkinlik yığını arasında da gezinme yapılır.
Sistem, uygulamanız için sentetik bir arka yığın oluşturduğunda her ebeveyn etkinliğinin yeni bir örneğini oluşturmak için temel bir Intent
oluşturur. Dolayısıyla, üst etkinlikler için kullanıcının her bir etkinlikte doğal olarak gezinmesini beklediğiniz şekilde kaydedilmiş bir durum yoktur. Üst etkinliklerden herhangi biri normalde kullanıcının bağlamına bağlı bir kullanıcı arayüzü gösteriyorsa bu bağlam bilgisi eksik olur ve kullanıcı yığında geri döndüğünde bunu sunmanız gerekir. Örneğin, kullanıcı bir müzik uygulamasında bir albümü görüntülüyorsa sayfayı yukarı çıkardığında belirli bir müzik türündeki tüm albümleri listeleyen bir etkinliğe yönlendirilir. Bu durumda, yığının oluşturulması gerekiyorsa ebeveynin uygun listeyi, kullanıcı gerçekten bu etkinlikten gelmiş gibi görüntüleyebilmesi için ebeveyn etkinliğine mevcut albümün hangi türe ait olduğunu bildirmeniz gerekir. Bu tür bilgileri sentetik bir üst etkinliğe göndermek için onPrepareNavigateUpTaskStack()
yöntemini geçersiz kılmanız gerekir. Bu işlem size, üst etkinlikleri sentezlemek için sistemin oluşturduğu bir TaskStackBuilder
nesnesi sağlar. TaskStackBuilder
, sistemin her bir üst etkinliği oluşturmak için kullandığı Intent
nesneyi içerir. onPrepareNavigateUpTaskStack()
uygulamanızda, uygun Intent
öğesini değiştirerek üst etkinliğin uygun bağlamı belirlemek ve uygun kullanıcı arayüzünü görüntülemek için kullanabileceği ekstra veriler ekleyebilirsiniz.
Sistem TaskStackBuilder
öğesini oluşturduğunda, üst etkinlikleri oluşturmak için kullanılan Intent
nesnelerini etkinlik ağacının en üstünden başlayarak mantıksal sıralarıyla ekler. Dolayısıyla, dahili diziye eklenen son Intent
geçerli etkinliğin doğrudan üst öğesidir. Etkinliğin üst öğesi için Intent
değerini değiştirmek isterseniz önce getIntentCount()
ile dizinin uzunluğunu belirleyin ve bu değeri editIntentAt()
öğesine iletin.
Uygulama yapınız daha karmaşıksa Yukarı gezinmenin davranışını işlemenize ve sentetik arka yığını tamamen özelleştirmenize olanak tanıyan başka API'ler de vardır. Size ek kontrol sağlayan API'lerden bazıları şunlardır:
onNavigateUp()
- Kullanıcı Yukarı düğmesine bastığında özel bir işlem gerçekleştirmek için bunu geçersiz kılın.
navigateUpTo(Intent)
- Mevcut etkinliği tamamlamak ve sağlanan
Intent
ile belirtilen etkinliğe gitmek için bunu çağırın. Etkinlik arka yığında mevcutsa ancak en yakın üst öğe değilse geçerli etkinlik ile amaç için belirtilen etkinlik arasındaki diğer tüm etkinlikler de tamamlanır. getParentActivityIntent()
- Geçerli etkinliğin mantıksal üst öğesini başlatacak
Intent
öğesini almak için bunu çağırın. shouldUpRecreateTask(Intent)
- Yukarı gitmek için sentetik bir arka yığının oluşturulması gerekip gerekmediğini sorgulamak amacıyla bunu çağırın. Sentetik bir yığın oluşturulması gerekiyorsa true (doğru), uygun yığın zaten varsa false (yanlış) değerini döndürür.
finishAffinity()
- Mevcut etkinliği ve mevcut etkinliğe bağlı aynı görev yakınlığına sahip tüm üst etkinlikleri bitirmek için bunu çağırın.
onNavigateUp()
gibi varsayılan davranışları geçersiz kılarsanız Yukarı gezinmesinde sentetik bir geri yığın oluşturduğunuzda bu yöntemi çağırmanız gerekir. onCreateNavigateUpTaskStack
- Sentetik görev yığınının nasıl oluşturulduğunu tamamen kontrol etmeniz gerekiyorsa bunu geçersiz kılın. Yalnızca arka yığınınızın amaçlarına biraz ek veriler eklemek istiyorsanız bunun yerine
onPrepareNavigateUpTaskStack()
politikasını geçersiz kılmanız gerekir.
Ancak çoğu uygulamanın bu API'leri kullanması veya onPrepareNavigateUpTaskStack()
uygulaması gerekmez ancak her <activity>
öğesine android:parentActivityName
ekleyerek doğru davranışı elde edebilir.
Multimedya
Medya codec'leri
MediaCodec
sınıfı, medyanızı kodlama ve kodunu çözmek için alt düzey medya codec'lerine erişim sağlar. Medyayı kodlamak için createEncoderByType()
veya medya kodunu çözmek için createDecoderByType()
yöntemini çağırarak bir MediaCodec
örneği oluşturabilirsiniz. Bu yöntemlerin her biri, "video/3gpp"
veya "audio/vorbis"
gibi kodlamak veya kodunu çözmek istediğiniz medya türü için bir MIME türü alır.
Bir MediaCodec
örneği oluşturulduğunda, medya biçimi gibi özellikleri veya içeriğin şifrelenmiş olup olmadığını belirtmek için configure()
yöntemini çağırabilirsiniz.
Medyanızı kodluyor veya kodunu çözerken, MediaCodec
oluşturulduktan sonra sürecin geri kalanı aynıdır. İlk olarak, bir giriş ByteBuffer
nesnesi dizisi almak için getInputBuffers()
ve bir çıkış ByteBuffer
nesneleri dizisi almak için getOutputBuffers()
çağrısı yapın.
Kodlamaya veya kodu çözmeye hazır olduğunuzda, kaynak medyanızı beslemek için kullanmanız gereken ByteBuffer
öğesinin dizin konumunu (giriş arabellekleri dizisinden) almak için dequeueInputBuffer()
yöntemini çağırın. ByteBuffer
öğesini kaynak medyanızla doldurduktan sonra queueInputBuffer()
yöntemini çağırarak arabelleğin sahipliğini serbest bırakın.
Benzer şekilde, çıkış arabelleği için sonuçları alacağınız ByteBuffer
dizininin konumunu almak için dequeueOutputBuffer()
yöntemini çağırın. ByteBuffer
çıktısını okuduktan sonra releaseOutputBuffer()
yöntemini çağırarak sahipliği iptal edin.
Normal queueInputBuffer()
yerine MediaCrypto
API'leriyle birlikte queueSecureInputBuffer()
çağrısı yaparak codec'lerdeki şifrelenmiş medya verilerini işleyebilirsiniz.
Codec'lerin kullanımı hakkında daha fazla bilgi için MediaCodec
dokümanlarına bakın.
İşaret sırasında ses kaydedin
Yeni startRecording()
yöntemi, MediaSyncEvent
tarafından tanımlanan işarete göre ses kaydı başlatmanıza olanak tanıyor.
MediaSyncEvent
, bir ses oturumu (MediaPlayer
tarafından tanımlanan gibi) belirtir. Bu oturum, tamamlandığında ses kaydedicinin kayda başlamasını tetikler. Örneğin, bir kayıt oturumunun başlangıcını belirten bir ses tonu çalmak için bu işlevi kullanabilir ve kayıt otomatik olarak başlar. Böylece tonu ve kaydın başlangıcını manuel olarak senkronize etmenize gerek kalmaz.
Zamanlanmış metin parçaları
MediaPlayer
artık hem bant içi hem de bant dışı metin parçalarını işleyebilir.
Bant içi metin parçaları, MP4 veya 3GPP medya kaynağı içinde metin parçası olarak gelir. Bant dışı metin parçaları, addTimedTextSource()
yöntemiyle harici metin kaynağı olarak eklenebilir. Tüm harici metin parçası kaynakları eklendikten sonra, bir veri kaynağındaki kullanılabilir tüm parçaların yenilenmiş listesini almak için getTrackInfo()
çağrılmalıdır.
Parçayı MediaPlayer
ile kullanılacak şekilde ayarlamak için kullanmak istediğiniz parçanın dizin konumunu kullanarak selectTrack()
çağrısı yapmanız gerekir.
Metin parçası oynatılmaya hazır olduğunda bildirim almak için MediaPlayer.OnTimedTextListener
arayüzünü uygulayın ve setOnTimedTextListener()
ekibine iletin.
Ses efektleri
AudioEffect
sınıfı artık ses kaydederken ek ses ön işleme türlerini desteklemektedir:
AcousticEchoCanceler
özellikli Akustik Yankı İptal Edici (AEC), uzak taraftan alınan sinyalin katkısını yakalanan ses sinyalinden kaldırır.AutomaticGainControl
ile Otomatik Kazanç Kontrolü (AGC), yakalanan sinyalin çıkışını otomatik olarak normalleştirir.NoiseSuppressor
özellikli Gürültü Çözücü (NS), yakalanan sinyalden arka plan gürültüsünü kaldırır.
Bu ön işlemci efektlerini, AudioEffect
alt sınıflarından birini kullanarak AudioRecord
ile yakalanan sese uygulayabilirsiniz.
Not: Bu efektlerin tüm cihazlarda destekleneceği garanti edilmez. Bu nedenle, her zaman önce ilgili ses efekti sınıfında isAvailable()
çağrısı yaparak kullanılabilirliği kontrol etmeniz gerekir.
Boşluksuz oynatma
Artık iki ayrı MediaPlayer
nesnesi arasında boşluksuz oynatma gerçekleştirebilirsiniz. İlk MediaPlayer
bitmeden önce herhangi bir anda setNextMediaPlayer()
numaralı telefonu arayın. Android, ilk oyuncu durduğu anda ikinci oyuncuyu başlatmaya çalışır.
Kamera
Otomatik odaklama hareketi
Yeni arayüz olan Camera.AutoFocusMoveCallback
, otomatik odak
hareketinde yapılan değişiklikleri dinlemenizi sağlar. Arayüzünüzü setAutoFocusMoveCallback()
hizmetine kaydedebilirsiniz. Daha sonra, kamera sürekli otomatik odaklama modundayken (FOCUS_MODE_CONTINUOUS_VIDEO
veya FOCUS_MODE_CONTINUOUS_PICTURE
)
onAutoFocusMoving()
numaralı telefona bir çağrı alacaksınız. Bu çağrı, otomatik
odağın hareket etmeye başlayıp başlamadığını veya hareket etmeyi bıraktığını bildirir.
Kamera sesleri
MediaActionSound
sınıfı, kamera veya diğer medya işlemleri tarafından yapılan standart sesleri üretmek için basit bir API seti sağlar. Bu API'leri, özel bir fotoğraf makinesi veya video kamera oluştururken uygun sesi çalmak için kullanmanız gerekir.
Ses çalmak için bir MediaActionSound
nesnesini örneklendirmeniz yeterlidir. İstediğiniz sesin önceden yüklenmesi için load()
çağrısı yapın, ardından uygun zamanda play()
işlevini çağırın.
Bağlantı
Android Beam
Android IşınlamaTM artık Bluetooth üzerinden büyük yük aktarımlarını desteklemektedir. Aktarılacak verileri yeni setBeamPushUris()
yöntemi veya yeni geri çağırma arayüzü NfcAdapter.CreateBeamUrisCallback
ile tanımladığınızda Android, daha yüksek aktarım hızları elde etmek için veri aktarımını Bluetooth'a veya başka bir alternatif aktarıma dağıtır. Bu, özellikle resim ve ses dosyaları gibi büyük
yükler için kullanışlıdır ve cihazlar arasında görünür bir eşleme gerektirmez. Bluetooth üzerinden aktarımlardan yararlanmak için uygulamanızın başka bir işlem yapmasına gerek yoktur.
setBeamPushUris()
yöntemi, uygulamanızdan aktarmak istediğiniz verileri belirten Uri
nesne dizisi alır. Alternatif olarak, setBeamPushUrisCallback()
yöntemini çağırarak etkinliğiniz için belirtebileceğiniz NfcAdapter.CreateBeamUrisCallback
arayüzünü uygulayabilirsiniz.
Geri çağırma arayüzünü kullanırken, kullanıcı Android Beam ile bir paylaşım gerçekleştirdiğinde sistem arayüzün createBeamUris()
yöntemini çağırır. Böylece paylaşım anında paylaşılacak URI'leri tanımlayabilirsiniz.
Bu, paylaşılacak URI'lar etkinlikteki kullanıcı bağlamına bağlı olarak değişebilecekse yararlı olur. Paylaşılacak URI'lar değişmediğinde ve bunları önceden güvenli bir şekilde tanımlayabileceğiniz durumlarda setBeamPushUris()
çağrısının kullanılması yararlı olur.
Ağ hizmeti keşfi
Android 4.1, kablosuz ağ üzerinden eş cihazlar tarafından sunulan hizmetleri (örneğin, mobil cihazlar, yazıcılar, kameralar, medya oynatıcılar ve yerel ağda kayıtlı olan diğer hizmetler) bulup bağlanmanıza olanak tanıyan, çoklu yayın DNS tabanlı hizmet keşfine yönelik destek sunar.
android.net.nsd
adlı yeni paket, hizmetlerinizi yerel ağda yayınlamanıza, ağdaki yerel cihazları keşfetmenize ve cihazlara bağlanmanıza olanak tanıyan yeni API'leri içerir.
Hizmetinizi kaydetmek için önce bir NsdServiceInfo
nesnesi oluşturmanız ve setServiceName()
, setServiceType()
ve setPort()
gibi yöntemlerle hizmetinizin çeşitli özelliklerini tanımlamanız gerekir.
Ardından, NsdManager.RegistrationListener
işlemini uygulamanız ve NsdServiceInfo
cihazınızla registerService()
hizmetine iletmeniz gerekir.
Ağdaki hizmetleri keşfetmek için NsdManager.DiscoveryListener
işlevini uygulayın ve discoverServices()
hizmetine iletin.
NsdManager.DiscoveryListener
hizmetiniz bulunan hizmetlerle ilgili geri çağırmalar aldığında resolveService()
yöntemini çağırarak hizmeti çözümlemeniz ve bunu, keşfedilen hizmetle ilgili bilgi içeren bir NsdServiceInfo
nesnesi alan NsdManager.ResolveListener
uygulamasını iletmeniz gerekir. Böylece, bağlantıyı başlatabilirsiniz.
Kablosuz P2P hizmet keşfi
Wi-Fi P2P API'ler, WifiP2pManager
içinde ilişkilendirme öncesi hizmet keşfini desteklemek için Android 4.1'de geliştirilmiştir. Bu sayede, bir ağa bağlanmadan önce kablosuz P2P kullanan hizmetlere göre yakındaki cihazları keşfedip filtreleyebilirsiniz. Network Service Discovery ise mevcut bir bağlı ağdaki (yerel kablosuz ağ gibi) hizmetleri keşfetmenize olanak tanır.
Diğer cihazların uygulamanızı keşfedip bağlanabilmesi amacıyla uygulamanızı kablosuz bağlantı üzerinden hizmet olarak yayınlamak için addLocalService()
yöntemini, uygulama hizmetlerinizi açıklayan WifiP2pServiceInfo
nesnesiyle arayın.
Yakındaki cihazları kablosuz ağ üzerinden keşfetmeyi başlatmak için önce Bonjour mu yoksa Upnp kullanarak mı iletişim kuracağınıza karar vermeniz gerekir. Bonjour'u kullanmak için önce setDnsSdResponseListeners()
ile hem WifiP2pManager.DnsSdServiceResponseListener
hem de WifiP2pManager.DnsSdTxtRecordListener
gerektiren geri çağırma dinleyicileri ayarlayın. Upnp'yi kullanmak için setUpnpServiceResponseListener()
numaralı telefonu arayın. Bu işlem WifiP2pManager.UpnpServiceResponseListener
sürer.
Yerel cihazlarda hizmetleri keşfetmeye başlamadan önce addServiceRequest()
numaralı telefonu aramanız da gerekir. Bu yönteme ilettiğiniz WifiP2pManager.ActionListener
başarılı bir geri arama aldığında, discoverServices()
yöntemini çağırarak yerel cihazlarda hizmetleri keşfetmeye başlayabilirsiniz.
Yerel hizmetler keşfedildiğinde, Bonjour veya Upnp kullanmak üzere kaydolmuş olup olmadığınıza bağlı olarak WifiP2pManager.DnsSdServiceResponseListener
veya WifiP2pManager.UpnpServiceResponseListener
sizi geri arar. Her iki durumda da alınan geri çağırma, eş cihazı temsil eden bir WifiP2pDevice
nesnesi içerir.
Ağ kullanımı
Yeni isActiveNetworkMetered()
yöntemi, cihazın o anda sayaçlı bir ağa bağlı olup olmadığını kontrol etmenizi sağlar. Yoğun ağ işlemleri gerçekleştirmeden önce bu durumu kontrol ederek, kullanıcılarınızın parasına mal olabilecek veri kullanımını yönetmeye yardımcı olabilir ve işlemleri şimdi mi yoksa daha sonra mı gerçekleştireceğinize (örneğin, cihazın kablosuz ağa bağlandığı zaman) bilinçli kararlar verebilirsiniz.
Erişilebilirlik
Erişilebilirlik hizmeti API'leri
Erişilebilirlik hizmeti API'lerinin erişimi, Android 4.1'de önemli ölçüde artırıldı. Artık AccessibilityEvent
, AccessibilityNodeInfo
ve AccessibilityRecord
sınıflarına eklemeler yaparak onGesture()
ve diğer giriş etkinliklerini kullanarak karmaşık hareketler gibi daha fazla giriş etkinliğini izleyen ve yanıt veren hizmetler derlemenize olanak tanır.
Erişilebilirlik hizmetleri ayrıca kullanıcı adına tıklama, kaydırma ve metinde adım adım ilerleme gibi işlemleri performAction
ve setMovementGranularities
ile gerçekleştirebilir. performGlobalAction()
yöntemi, hizmetlerin Geri, Ana Sayfa ve Son Uygulamalar ile Bildirimler'i açma gibi işlemleri gerçekleştirmesine de olanak tanır.
Özelleştirilebilir uygulamada gezinme
Bir Android uygulaması oluştururken artık findFocus()
ve focusSearch()
ile odaklanabilir öğeleri ve giriş widget'larını bularak gezinme şemalarını özelleştirebilir ve setAccessibilityFocused()
ile odağı ayarlayabilirsiniz.
Daha erişilebilir widget'lar
Yeni android.view.accessibility.AccessibilityNodeProvider
sınıfı, erişilebilirlik hizmetlerine karmaşık özel görünümler sunarak bilgileri daha erişilebilir bir şekilde sunmanızı sağlar. android.view.accessibility.AccessibilityNodeProvider
, takvim ızgarası gibi gelişmiş içeriğe sahip bir kullanıcı widget'ının, erişilebilirlik hizmetleri için widget'ın düzen yapısından tamamen ayrı bir mantıksal semantik yapı sunmasına olanak tanır. Bu anlamsal yapı, erişilebilirlik hizmetlerinin, görme engelli kullanıcılar için daha yararlı bir etkileşim modeli sunmasını sağlar.
Kopyala ve Yapıştır
Amaçlarla kopyalama ve yapıştırma
Artık setClipData()
yöntemini kullanarak bir ClipData
nesnesini Intent
ile ilişkilendirebilirsiniz.
Bu, özellikle birden fazla content:
URI'sini başka bir uygulamaya aktarmak için niyet kullanırken (örneğin, birden fazla belge paylaşırken) faydalıdır. Bu şekilde sağlanan content:
URI'leri de okuma veya yazma erişimi sağlamak için niyetin bayraklarına uyar ve amaçtaki birden fazla URI'ye erişim izni vermenizi sağlar. Bir ACTION_SEND
veya ACTION_SEND_MULTIPLE
niyeti başlatırken, alıcının erişim izni verebilmesi için amaçta sağlanan URI'lar artık otomatik olarak ClipData
'a iletilir.
HTML ve dize stilleri için destek
ClipData
sınıfı artık stilize edilmiş metinleri (HTML veya Android stilli dizeler olarak) desteklemektedir. newHtmlText()
kullanarak ClipData
reklam öğesine HTML biçimli metin ekleyebilirsiniz.
Renderscript
Renderscript hesaplama işlevi aşağıdaki özelliklerle geliştirildi:
- Tek bir komut dosyasında birden çok çekirdek desteği.
- Yeni bir komut dosyası API'sinde işlemler için filtrelenmiş örnekleyicilerle ayırmadan okuma desteği
rsSample
. #pragma
bölgesinde farklı FP hassasiyeti düzeyleri için destek.- Bir işlem komut dosyasından RS nesnelerinden ek bilgileri sorgulama desteği.
- Çok sayıda performans iyileştirmesi.
İşlem Renderscript'leriniz için gereken kayan nokta hassasiyetini tanımlamak için yeni pragmalar da mevcuttur. Bu sayede, tam IEEE 754-2008 standardıyla mümkün olmayacak hızlı vektör matematik işlemleri gibi NEON benzeri işlemleri CPU yolunda etkinleştirebilirsiniz.
Not: Deneysel Renderscript grafik motoru kullanımdan kaldırılmıştır.
Animasyonlar
Etkinlik başlatma animasyonları
Artık yakınlaştırma animasyonlarını veya kendi özel animasyonlarınızı kullanarak bir Activity
başlatabilirsiniz. İstediğiniz animasyonu belirtmek için ActivityOptions
API'lerini kullanarak startActivity()
gibi etkinlik başlatan yöntemlere iletebileceğiniz bir Bundle
oluşturun.
ActivityOptions
sınıfı, etkinliğiniz açıldığında göstermek isteyebileceğiniz her animasyon türü için farklı bir yöntem içerir:
makeScaleUpAnimation()
- Etkinlik penceresini ekrandaki belirli bir başlangıç konumundan ve belirtilen başlangıç boyutundan büyüten bir animasyon oluşturur. Örneğin, Android 4.1'deki ana ekran bir uygulamayı açarken bunu kullanır.
makeThumbnailScaleUpAnimation()
- Etkinlik penceresini belirtilen bir konumdan başlayarak ölçeklendiren bir animasyon ve sağlanan bir küçük resim oluşturur. Örneğin, Android 4.1'deki Son Uygulamalar penceresi, bir uygulamaya dönerken bunu kullanır.
makeCustomAnimation()
- Kendi kaynaklarınız tarafından tanımlanan bir animasyon oluşturur. Bu animasyonlardan biri etkinlik açılışı, diğeri durdurulan etkinlik için ayrı ayrı tanımlanır.
Zaman animatörü
Yeni TimeAnimator
, animasyonun her karesinde sizi bilgilendiren TimeAnimator.TimeListener
ile basit bir geri çağırma mekanizması sunar. Bu Animatörde süre, interpolasyon veya nesne değer ayarı yoktur. İşleyicinin geri çağırması, önceki animasyon karesinden bu yana geçen toplam süre ve geçen süre de dahil olmak üzere her kare için bilgi alır.
Kullanıcı Arayüzü
Bildirimler
Android 4.1'de daha büyük içerik bölgeleri, büyük resim önizlemeleri, birden fazla işlem düğmesi ve yapılandırılabilir öncelik ile bildirimler oluşturabilirsiniz.
Bildirim stilleri
Yeni setStyle()
yöntemi, bildiriminiz için her biri daha geniş bir içerik bölgesi sunan üç yeni stilden birini belirlemenize olanak tanır. Geniş içerik bölgenizin stilini belirtmek için setStyle()
öğesine aşağıdaki nesnelerden birini iletin:
Notification.BigPictureStyle
- Büyük boyutlu resim eki içeren bildirimler için.
Notification.BigTextStyle
- Tek bir e-posta gibi çok fazla metin içeren bildirimler için kullanılır.
Notification.InboxStyle
- Bir dize listesi (ör. birden çok e-postadan snippet'ler) içeren bildirimler için.
Bildirim işlemleri
Artık bildiriminizde normal veya daha büyük stil kullanılması fark etmeksizin, bildirim mesajının alt kısmında görünen en fazla iki işlem düğmesi destekleniyor.
İşlem düğmesi eklemek için addAction()
numaralı telefonu arayın. Bu yöntem üç bağımsız değişken alır: simge için çekilebilir bir kaynak, düğme için metin ve perfrom işlemi için işlemi tanımlayan PendingIntent
.
Öncelikler
Artık önceliği setPriority()
ile ayarlayarak bildiriminizin listedeki sırasını etkilemesinin sisteme ne kadar önemli olduğu konusunda ipucu verebilirsiniz. Bunu, Notification
sınıfında PRIORITY_*
sabitleriyle tanımlanan beş farklı öncelik düzeyinden birini geçirebilirsiniz. Varsayılan değer PRIORITY_DEFAULT
'dir. İki düzey daha yüksek, iki alt düzey mevcuttur.
Yüksek öncelikli bildirimler, kullanıcıların genellikle hızlı bir şekilde yanıt vermek istedikleri öğelerdir (ör. yeni bir anlık mesaj, kısa mesaj veya yaklaşan etkinlik hatırlatıcısı). Düşük öncelikli bildirimler, süresi dolan takvim etkinlikleri veya uygulama tanıtımları gibi şeylerdir.
Sistem kullanıcı arayüzü kontrolleri
Android 4.0 (Ice Cream Sandwich) sistem, kullanıcı arayüzü öğelerinin görünürlüğünü kontrol etmek için sistem çubuğunun görünümünü karartma veya cep telefonlarında tamamen kaybolma gibi yeni işaretler ekledi.
Android 4.1, sistem kullanıcı arayüzü öğelerinin görünümünü ve bunlarla ilişkili etkinlik düzeninizi, setSystemUiVisibility()
çağrısı yaparak ve aşağıdaki işaretleri ileterek daha iyi kontrol edebilmenizi sağlayan birkaç bayrak daha ekler:
SYSTEM_UI_FLAG_FULLSCREEN
- Kritik olmayan sistem kullanıcı arayüzünü (ör. durum çubuğu) gizler.
Etkinliğiniz, işlem çubuğunu yer paylaşımı modunda kullanıyorsa (
android:windowActionBarOverlay
özelliğini etkinleştirerek) bu işaret, işlem çubuğunu da gizler. Bunu, ikisini birden gizlerken ve gösterirken eşgüdümlü bir animasyonla yapar. SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- Etkinlik düzeninizi, sistem kullanıcı arayüzü öğeleri hâlâ görünür olsa bile
SYSTEM_UI_FLAG_FULLSCREEN
özelliğini etkinleştirdiğinizde kullanılabilen ekran alanını kullanacak şekilde ayarlar. Düzeninizin bazı bölümleri sistem kullanıcı arayüzü tarafından kapsanacak olsa da, uygulamanız sistem kullanıcı arayüzünü sık sıkSYSTEM_UI_FLAG_FULLSCREEN
ile gizleyip gösteriyorsa bu yöntem, sistem kullanıcı arayüzü her gizlendiğinde veya göründüğünde düzeninizin yeni düzen sınırlarına ayarlanmasını önleyeceğinden faydalıdır. SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- Etkinlik düzeninizi, sistem kullanıcı arayüzü öğeleri hâlâ görünür olsa bile,
SYSTEM_UI_FLAG_HIDE_NAVIGATION
(Android 4.0'da eklenmiş) özelliğini etkinleştirdiğinizde kullanılabilen ekran alanını kullanacak şekilde ayarlar. Düzeninizin bazı bölümleri gezinme çubuğu tarafından üst üste yer alsa da, uygulamanız gezinme çubuğunu sık sı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
- Bir görünümde
fitSystemWindows()
çağrısı yaptığınızda, tanımlanan sınırların kullanılabilir ekran alanıyla tutarlı kalmasını sağlamak içinSYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
ve/veyaSYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
kullanıyorsanız bu işareti ekleyebilirsiniz. Yani bu işaret ayarlandığındafitSystemWindows()
, tüm sistem kullanıcı arayüzü gizlendikten sonra bile sistem kullanıcı arayüzü öğelerinin görünürlüğü değişmiyormuş gibi davranır.
İlgili diğer sistem kullanıcı arayüzü işaretleri hakkında daha fazla bilgi edinmek için Android 4.0'da eklenenler hakkında bilgi edinin.
Uzaktan görüntülemeler
GridLayout
ve ViewStub
artık taşınabilir görünümler olduğundan, bunları uygulama widget'larınızın ve bildirim özel düzenlerinizin düzenlerinde kullanabilirsiniz.
Yazı tipi aileleri
Android 4.1, toplam 10 varyant için Roboto yazı tipi stilinin birkaç varyantını daha ekler ve bunların tümü uygulamalar tarafından kullanılabilir. Uygulamalarınız artık hem hafif hem de yoğunlaştırılmış varyantların tamamına erişebilir.
Mevcut Roboto yazı tipi varyantlarının tamamı şunlardır:
- Normal
- İtalik
- Kalın
- Kalın-italik
- Hafif
- Açık-italik
- Yoğunlaştırılmış normal
- Daraltılmış italik
- Daraltılmış kalın
- Daraltılmış kalın-italik
Bunlardan herhangi birini yeni fontFamily
özelliğiyle birlikte textStyle
özelliğiyle birlikte uygulayabilirsiniz.
fontFamily
için desteklenen değerler:
- Normal Roboto için
"sans-serif"
- Roboto Light için
"sans-serif-light"
- Roboto Condensed için
"sans-serif-condensed"
Ardından, "bold"
ve "italic"
değerlerini kalın ve/veya italik
şeklinde uygulayabilirsiniz.textStyle
Her ikisini de şu şekilde uygulayabilirsiniz: android:textStyle="bold|italic"
.
Ayrıca Typeface.create()
kullanabilirsiniz.
Örneğin, Typeface.create("sans-serif-light", Typeface.NORMAL)
.
Giriş Çerçevesi
Birden fazla giriş cihazı
Yeni InputManager
sınıfı, şu anda bağlı olan giriş cihazı grubunu sorgulamanıza ve yeni bir cihaz eklendiğinde, değiştirildiğinde veya kaldırıldığında bildirim almak için kaydolmanıza olanak tanır. Bu, özellikle birden çok oyuncuyu destekleyen bir oyun oluşturuyorsanız ve kaç kumandanın bağlı olduğunu ve kumanda sayısında değişiklik olduğunu tespit etmek istiyorsanız yararlıdır.
getInputDeviceIds()
çağrısı yaparak bağlı tüm giriş cihazlarını sorgulayabilirsiniz. Bu işlem, her biri farklı bir giriş cihazının kimliği olan bir tam sayı dizisi döndürür. Ardından, belirtilen giriş cihazı kimliği için InputDevice
edinmek üzere getInputDevice()
yöntemini çağırabilirsiniz.
Yeni giriş cihazları bağlandığında, değiştirildiğinde veya bağlantıları kesildiğinde bilgilendirilmek istiyorsanız InputManager.InputDeviceListener
arayüzünü uygulayın ve registerInputDeviceListener()
ile kaydedin.
Giriş denetleyicileri için titreşim
Bağlı giriş cihazlarının kendi titreşim özellikleri varsa artık InputDevice
üzerinde getVibrator()
çağrısı yaparak mevcut Vibrator
API'lerini kullanarak bu cihazların titreşimini kontrol edebilirsiniz.
İzinler
Yeni izinler şunlardır:
READ_EXTERNAL_STORAGE
- Harici depolama alanına korumalı okuma erişimi sağlar. Varsayılan olarak Android 4.1'de tüm uygulamaların okuma erişimi vardır. Bu ayar, gelecekteki bir sürümde uygulamaların bu izni kullanarak açıkça okuma erişimi istemesini gerektirecek şekilde değiştirilecek. Uygulamanız zaten yazma erişimi istiyorsa otomatik olarak okuma erişimi de alır. Okuma erişimi kısıtlamasını açmaya yönelik yeni bir geliştirici seçeneği var. Bu seçenek sayesinde geliştiriciler, uygulamalarını Android'in ileride nasıl davranacağına göre test edebilir.
- android.Manifest.permission.READ_USER_DICTIONARY
- Bir uygulamanın, kullanıcı sözlüğünü okumasına izin verir. Bu işlev yalnızca IME veya Ayarlar uygulaması gibi bir sözlük düzenleyici tarafından gerekli kılınmalıdır.
READ_CALL_LOG
- Uygulamanın, gelen ve giden aramalarla ilgili bilgiler içeren sistemin çağrı günlüğünü okumasına izin verir.
WRITE_CALL_LOG
- Bir uygulamanın, sisteme ait telefonunuzda depolanan çağrı kaydını değiştirmesine izin verir
- android.Manifest.permission.WRITE_USER_DICTIONARY
- Bir uygulamanın, kullanıcının kelime sözlüğüne yazmasına izin verir.
Cihaz Özellikleri
Android 4.1, kullanıcı arayüzünü televizyon ekranında görüntülemeye ayrılmış cihazlar için yeni bir özellik beyanı içeriyor: FEATURE_TELEVISION
. Uygulamanızın televizyon arayüzü gerektirdiğini beyan etmek için manifest dosyanızda <uses-feature>
öğesiyle bu özelliği beyan edin:
<manifest ... > <uses-feature android:name="android.hardware.type.television" android:required="true" /> ... </manifest>
Bu özellik, "televizyonu" tipik bir oturma odası televizyonu deneyimi olarak tanımlar: Kullanıcının uzakta oturduğu büyük ekranda görüntülenir. En yaygın giriş biçimi d-pad gibi bir şeydir ve genellikle dokunarak veya fare/işaretçi cihazıyla değildir.