Android 4.2 API'leri

API Düzeyi: 17

Android 4.2 (JELLY_BEAN_MR1) kullanıcılar ve uygulama için yeni özellikler sunan Jelly Bean sürümünün güncellemesidir. birlikte çalışır. Bu dokümanda, geliştiriciler için en dikkate değer ve faydalı yeni API'ler tanıtılmaktadır.

Uygulama geliştirici olarak, Android 4.2 sistem imajını ve SDK platformunu SDK Yöneticisi'nden en kısa sürede indirmeniz gerekir. Şu durumda: Uygulamanızı test etmek için Android 4.2 çalıştıran bir cihazınız yoksa Android 4.2 sistemini kullanın görselini kullanarak uygulamanızı Android emülatöründe test edebilirsiniz. Ardından, en son API'leri kullanmaya başlamak için uygulamalarınızı Android 4.2 platformuna göre derleyin.

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

Siz API'leri Android 4.2'de kullanabilir ve çalıştırmadan önce sistem API düzeyini kontrol eden kodunuza koşullar minSdkVersion cihazınızın desteklemediği API'ler. Şu konu hakkında daha fazla bilgi edinmek için: geriye dönük uyumluluğu koruma için Geriye Dönük Uyumlu Oluşturma başlıklı makaleyi okuyun Kullanıcı arayüzleri.

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

Önemli davranış değişiklikleri

Daha önce Android için bir uygulama yayınladıysanız aşağıdakilere dikkat edin Uygulamanızın davranışını etkileyebilecek değişiklikler:

  • İçerik sağlayıcılar artık varsayılan olarak dışa aktarılmaz. Diğer bir deyişle, android:exported özelliği için artık “false". Diğer uygulamaların sağlayıcıya erişebiliyorsanız artık android:exported="true" özelliğini açık bir şekilde ayarlamanız gerekir.

    Bu değişiklik yalnızca android:targetSdkVersion veya android:minSdkVersion değerini 17 ya da daha yüksek bir değere ayarlarsanız geçerli olur. Aksi takdirde varsayılan değer yine “true" olur hatta Android 4.2 ve sonraki sürümlerde bile kullanılabilir.

  • Uygulamanız ACCESS_COARSE_LOCATION iznini istiyor ancak ACCESS_FINE_LOCATION iznini istemiyorsa kullanıcı konumu sonuçları, Android'in önceki sürümlerine kıyasla daha az doğru olabilir.

    Uygulamanız şunlar için izin istediğinde kullanıcıların gizlilik beklentilerini karşılamak: yaklaşık konum (tam konum değil) olduğunda sistem, kullanıcıya yaklaşık konum tahmini sağlamaz bir şehir bloğundan daha doğrudur.

  • Settings.System tarafından tanımlanan bazı cihaz ayarları artık salt okunur. Uygulamanız, Settings.System politikasında tanımlanan ve Settings.Global hizmetine taşınan ayarları yazmaya çalışırsa Android 4.2 ve sonraki sürümlerde çalışırken yazma işlemi sessiz bir şekilde başarısız olur.

    android:targetSdkVersion ve android:minSdkVersion değeriniz 17'den düşük olsa bile uygulamanız, , Android 4.2 ve sonraki sürümlerde çalışırken Settings.Global konumuna taşındı.

  • Uygulamanızda WebView kullanılıyorsa Android 4.2, uygulamanızın Böylece JavaScript'i uygulamanıza daha güvenli bir şekilde bağlayabilmek için Android kodu. Örneğin targetSdkVersion için artık @JavascriptInterface ek açıklamasını eklemek istediğiniz herhangi bir yönteme eklemeniz JavaScript'inizde kullanılabilir olmasını ister (yöntem ayrıca herkese açık olmalıdır). Lütfen not, söz konusu yönteme WebView içindeki bir web sayfası tarafından erişilemiyorsa . targetSdkVersion değerini 16 veya daha düşük bir değere ayarlarsanız ek açıklama zorunlu değildir ancak ek güvenlik için hedef sürümünüzü güncellemenizi ve ek açıklamayı eklemenizi öneririz.

    Bağlama hakkında daha fazla bilgi edinin. JavaScript kodu için Android kodu.

Daydream

Daydream, Android cihazlar için geliştirilmiş yeni etkileşimli ekran koruyucu modudur. Otomatik olarak etkinleştirilir Cihaz bir yuvaya takıldığında veya yuvaya takılıyken boşta kaldığında şarj cihazı (ekranı kapatmak yerine). Daydream, her seferinde bir rüya gösterir. Bu rüya, dokunulduğunda kaybolan tamamen görsel ve pasif bir görüntü veya giriş etkinliklerinin tamamına duyarlı ve etkileşimli bir görüntü olabilir. Uygulamanızın işleminde çalışan ve görünümler, düzenler ve animasyonlar da dahil olmak üzere Android kullanıcı arayüzü araç setine tam erişimi olan rüyalarınız, canlı duvar kağıtlarından veya uygulama widget'larından daha esnek ve güçlüdür.

DreamService alt sınıfını uygulayarak Daydream için bir hayal oluşturabilirsiniz. DreamService API'leri, Activity API'lerine benzer şekilde tasarlanmıştır. Şunun için kullanıcı arayüzünü belirtmek için: öğesini tamamladıktan sonra herhangi bir noktada setContentView() adresine bir düzen kaynağı kimliği veya View onAttachedToWindow() gibi bir pencereden geri arama.

DreamService sınıfı, yaşam döngüsü boyunca başka önemli geri çağırma işlemleri sağlar. temel Service API'lerine ek olarak onDreamingStarted(), onDreamingStopped() ve onDetachedFromWindow() gibi yöntemler kullanabilirsiniz. DreamService'yi uygulamanızdan başlatamazsınız. Bu işlem sistem tarafından otomatik olarak başlatılır.

Rüyanız etkileşimliyse daha fazla ayrıntı veya kontrol için kullanıcıyı uygulamanızın tam kullanıcı arayüzüne göndermek üzere rüyadan bir etkinlik başlatabilirsiniz. Kullanıcının görebileceği şekilde hayali sonlandırmak için finish() öğesini kullanabilirsiniz. yeni Etkinlik'e dokunun.

Daydream'inizi sistemde kullanılabilir hale getirmek için manifest dosyanızda DreamService öğenizi <service> öğesiyle beyan edin. Ardından "android.service.dreams.DreamService" işlemini içeren bir intent filtresi eklemeniz gerekir. Örnek:

<service android:name=".MyDream" android:exported="true"
    android:icon="@drawable/dream_icon" android:label="@string/dream_label" >
    <intent-filter>
        <action android:name="android.service.dreams.DreamService" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</service>

DreamService'te kullanabileceğiniz diğer faydalı yöntemler:

  • setInteractive(boolean), hayal, kullanıcı girişinden hemen sonra giriş etkinliklerini veya çıkışları alır. Hayalim kullanıcı rüyadan çıkmak için Geri veya Ana Ekran düğmelerini kullanabilir veya Rüyayı durdurmak için finish().
  • Tamamen etkileyici bir ekran istiyorsanız durum çubuğunu gizlemek için setFullscreen() öğesini çağırabilirsiniz.
  • Hafif uyku modu başlamadan önce, kullanıcıya boşta kalma zaman aşımının işaretleneceğini bildirmek için ekran kararır yaklaşıyor. setScreenBright(true) numarasını aradığınızda, ekranı normal parlaklığına ayarlayabilirsiniz.

Daha fazla bilgi için DreamService belgelerini inceleyin.

İkincil Ekranlar

Android artık bağlı olan ek ekranlarda uygulamanızın benzersiz içerikler göstermesine olanak tanıyor veya kablosuz bağlantı üzerinden kullanıcının cihazına bağlayabilirsiniz. İkincil ekran için benzersiz içerik oluşturmak üzere Presentation sınıfını genişletin ve onCreate() geri çağırma işlevini uygulayın. onCreate() içinde, setContentView()'ü çağırarak ikincil ekran için kullanıcı arayüzünüzü belirtin. Dialog sınıfının bir uzantısı olan Presentation sınıfı, uygulamanızın ikincil ekranda benzersiz bir kullanıcı arayüzü gösterebileceği bölgeyi sağlar.

Presentation'ünüzü gösterebileceğiniz ikincil ekranları algılamak için DisplayManager veya MediaRouter API'lerini kullanın. DisplayManager API'leri tüm verileri numaralandırmanıza aynı anda bağlanabilecek birden fazla ekran varsa sistemin varsayılan ekranına hızlıca erişmek için MediaRouter tercih etmelisiniz. en iyi uygulamaları paylaşacağız.

Sununuzun varsayılan görüntülemesini almak için MediaRouter.getSelectedRoute() işlevini çağırın ve ROUTE_TYPE_LIVE_VIDEO parametresini iletin. Bu işlev, sistemin video sunumları için şu anda seçili olan yolunu açıklayan bir MediaRouter.RouteInfo nesnesi döndürür. MediaRouter.RouteInfo boş değilse şunu çağırın: Bağlı ekranı temsil eden Display değerini almak için getPresentationDisplay().

Daha sonra Display nesnesini ileterek sununuzu görüntüleyebilirsiniz Presentation sınıfınız için bir oluşturucusuna ekleyin. Sununuz artık ikincil ekranda görünür.

Yeni bir ekranın çalışma zamanında bağlandığını algılamak için MediaRouter.SimpleCallback örneği oluşturun. Bu örnekte, sistem yeni bir sunu ekranı bağlandığında çağıracağı onRoutePresentationDisplayChanged() geri çağırma yöntemini uygulayın. Ardından MediaRouter.SimpleCallback öğesini, ROUTE_TYPE_LIVE_VIDEO rota türüyle birlikte MediaRouter.addCallback() öğesine aktararak kaydedin. Bir çağrı aldığınızda onRoutePresentationDisplayChanged(), yukarıda belirtildiği gibi MediaRouter.getSelectedRoute() adlı kişiyi aramanız yeterlidir.

Presentation içindeki kullanıcı arayüzünü daha da optimize etmek için ikincil ekranlara göre arasında android:presentationTheme özelliğini belirterek <style> üzerine konuşacağız.

Kullanıcının cihazına bağlı ekranların genellikle daha büyük ekran boyutuna ve muhtemelen farklı bir ekran yoğunluğuna sahip olduğunu unutmayın. Ekran özellikleri farklı olabileceğinden, özellikle bu tür daha büyük ekranlar için optimize edilmiş kaynaklar sağlamanız gerekir. İhtiyacınız varsa Presentation cihazınızdan ek kaynak istemek için getContext().getResources() numaralı telefonu arayarak ekrana karşılık gelen Resources nesnesini alın. Bu da uygulamanıza en uygun kaynakları ikincil ekranın ekran boyutu ve yoğunluğu.

Daha fazla bilgi ve bazı kod örnekleri için Presentation sınıf dokümanlarına bakın.

Kilit Ekranı Widget'ları

Android artık kullanıcıların kilit ekranına uygulama widget'ları eklemesine izin veriyor. Uygulama widget'ınızı kilit ekranında kullanılabilir hale getirmek için XML dosyanıza AppWidgetProviderInfo değerini belirten android:widgetCategory özelliğini ekleyin. Bu özellik iki değeri destekler: home_screen ve keyguard. Kullanıcılarınhome_screen uygulama widget'ını ana ekrana taşıyın. Uygulama widget'ınızın kilit ekranında da kullanılabilmesini istiyorsanız keyguard değerini ekleyin:

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:widgetCategory="keyguard|home_screen">
</appwidget-provider>

Ayrıca, kilit ekranındayken uygulama widget'ınız için bir başlangıç düzeni android:initialKeyguardLayout özelliği için değer ekleyebilirsiniz. Bu, uygulama widget'ınız başlatılıp düzeni güncelleyene kadar hemen görünebilecek bir düzen sağlaması açısından android:initialLayout ile aynı şekilde çalışır.

Kilit ekranı için uygulama widget'ları oluşturma hakkında daha fazla bilgi için Uygulama Widget'ları kılavuzuna bakın.

Birden fazla kullanıcı

Android artık tabletler gibi paylaşılabilir cihazlarda birden fazla kullanıcı alanına izin veriyor. Bir cihazdaki her kullanıcının kendi hesapları, uygulamaları, sistem ayarları, dosyaları ve kullanıcıyla ilişkili diğer verileri vardır.

Uygulama geliştirici olarak, uygulamanızın tek bir cihazda birden fazla kullanıcıyla düzgün çalışması için farklı bir işlem yapmanız gerekmez. Bir cihazda kaç kullanıcı olursa olsun, uygulamanızın belirli bir kullanıcı için kaydettiği veriler, uygulamanızın diğer kullanıcılar için kaydettiği verilerden ayrı tutulur. Sistem, hangi kullanıcı verilerinin veri içeren kullanıcı işlemine ait olduğunu Uygulamanız çalışıyor ve uygulamanızın yalnızca bu kullanıcının verilerine erişmesine izin veriyor ve Diğer kullanıcıların verilerine erişme.

Çok kullanıcılı bir ortamda veri kaydetme

Uygulamanız kullanıcı tercihlerini kaydettiğinde, veritabanı oluşturduğunda veya kullanıcının dahili veya harici depolama alanında yer alırsa bu verilere yalnızca ilgili kullanıcı olarak çalıştırıldığı sırada erişilebilir.

Uygulamanızın çok kullanıcılı bir ortamda düzgün şekilde çalıştığından emin olmak için sabit kodlanmış yollar kullanarak dahili uygulama dizininize veya harici depolama konumunuza başvurmayın. Bunun yerine her zaman uygun API'leri kullanın:

Belirli bir kullanıcının verilerini kaydetmek için bu API'lerden hangisini kullanırsanız kullanın, veriler yine de erişilebilir hale getirebilirsiniz. Uygulamanızın bakış açısından her kullanıcı tamamen ayrı bir cihazda çalışır.

Çok kullanıcılı ortamda kullanıcıları tanımlama

Uygulamanız, analiz toplamak veya başka bir hesap oluşturmak gibi benzersiz kullanıcıları tanımlamak istiyorsa ilişkilendirmelerini not etmek için, Google Cloud'u tanımlamak üzere benzersiz yükleme sayısı. UygulamanızUUID kaç tanesine bakıldığından bağımsız olarak her kullanıcıyı izlemek için benzersiz bir kimlik alacağınızdan uygulamanızı tek bir cihaza yüklemesini sağlar. Alternatif olarak, şuradan getirilen bir yerel jeton kaydedebilirsiniz: veya Google Cloud Messaging tarafından sağlanan kayıt kimliğini kullanın.

Uygulamanız donanım cihaz tanımlayıcılarından birini (ör. kablosuz MAC adresi veya SERIAL numarası) isterse bu tanımlayıcıların kullanıcıya değil donanıma bağlı olması nedeniyle her kullanıcı için aynı değeri sağlayacağını unutmayın. Uygulama Yüklemelerini Tanımlama blog yayınında da belirtildiği gibi, bu tanımlayıcıların neden olduğu diğer sorunlar da cabası.

Yeni Global Ayarlar

Sistem ayarları, Settings.Global ürününün eklenmesiyle birden fazla kullanıcıyı destekleyecek şekilde güncellendi. Bu ayar koleksiyonu salt okunur olduklarından Settings.Secure ayarlarına benzer, ancak genel olarak şuralarda geçerlidir: cihazdaki tüm kullanıcı alanları.

Mevcut bazı ayarlar Settings.System veya Settings.Secure konumundan buraya taşındı. Uygulamanız şu anda daha önce Settings.System içinde tanımlanan ayarlarda değişiklik yapılıyor (AIRPLANE_MODE_ON gibi) kullanıyorsanız, Android 4.2 veya sonraki sürümleri çalıştıran cihazlarda bu ayarlar kullanılabiliyorsa Settings.Global klasörüne taşındı. Şuradaki ayarları okumaya devam edebilirsiniz: Ayarlar artık güvenli olarak kabul edilmediğinden Settings.Global bu değişikliği yapmaya çalıştığınızda işlem sessizce başarısız olur ve sistem, Sistem günlüğü.

RTL Düzen Desteği

Android artık sorunsuz şekilde kullanıcı arayüzleri oluşturmanıza olanak tanıyan çeşitli API'ler sunuyor. Sağdan sola (RTL) kullanıcı arayüzleri ve okuma kullanan dilleri desteklemek için düzen yönünü dönüştürme yönlendirme için kullanabilirsiniz.

Uygulamanızda RTL düzenlerini desteklemeye başlamak için manifest dosyanızda android:supportsRtl özelliğini <application> öğesine ayarlayın. ve “true" olarak ayarladım. Bunu etkinleştirdiğinizde sistem, uygulamanızı RTL düzenleriyle görüntülemek için çeşitli RTL API'lerini etkinleştirir. Örneğin, işlem çubuğunda simge ve başlık sağ tarafta, işlem düğmeleri ise solda gösterilir. Ayrıca, çerçeve tarafından sağlanan View sınıflarıyla oluşturduğunuz tüm düzenler de tersine çevrilir.

Uygulamanızın RTL düzeniyle gösterildiğindeki görünümünü daha da optimize etmeniz gerekiyorsa iki temel optimizasyon düzeyi vardır:

  1. Sol ve sağa yönlü düzen özelliklerini başlangıç ve bitiş odaklı düzene dönüştür özellikler.

    Örneğin, android:layout_marginStart kullanın (android:layout_marginRight yerine android:layout_marginLeft ve android:layout_marginEnd).

    RelativeLayout sınıfı, ilgili düzeni de sağlar. özellikleri, örneğin android:layout_alignParentStart - android:layout_alignParentLeft ve android:layout_toStartOf yerine android:layout_toLeftOf.

  2. Bunun yerine RTL düzenleri için tam optimizasyon sağlamak üzere RTL düzenleri için tamamen ayrı ldrtl kaynak niteleyiciyi kullanan düzen dosyaları (ldrtl, Edit-direction-right-to-left}). Örneğin, varsayılan düzen dosyalarınızı res/layout/, RTL için optimize edilmiş düzenlerinizi ise res/layout-ldrtl/ klasörüne kaydedebilirsiniz.

    ldrtl niteleyicisi, çekilebilir kaynaklar için idealdir. Böylece Okuma yönüne karşılık gelen yöne bakan grafikler

RTL düzenleri desteklemek için çerçevede çeşitli API'ler mevcuttur. Örneğin, özel görünümler için uygun davranışları uygulayabilmeniz amacıyla View sınıfında ve mevcut düzen yönünü sorgulamak için Configuration sınıfında.

Not: SQlite kullanıyorsanız ve "yalnızca sayı" olan tablo veya sütun adlarınız varsa dikkatli olun: String.format(String, Object...) kullanmanız, cihazınız Arapça yerel ayarına ayarlanmışsa sayıların Arapça eşdeğerlerine dönüştürüldüğü hatalara neden olabilir. Sayıların doğru olduğundan emin olmak için String.format(Locale,String,Object...) kullanmanız gerekir korunduğundan emin olun. Ayrıca,String.format("%d", int) Şunun için String.valueOf(int): biçimlendirme sayıları.

İç içe yerleştirilmiş parçalar

Artık parçaları parçaların içine yerleştirebilirsiniz. Bu, dinamik ve yeniden kullanılabilir kullanıcı arayüzü bileşenlerini, kendisi de dinamik ve yeniden kullanılabilir olan bir kullanıcı arayüzü bileşenine yerleştirmek istediğiniz çeşitli durumlarda yararlıdır. Örneğin, sola ve sağa kaydırılan ve ekran alanının büyük bir kısmını kaplayan parçalar oluşturmak için ViewPager simgesini kullanıyorsanız artık her bir parça sayfasına parça ekleyebilirsiniz.

Bir parçayı iç içe yerleştirmek için, parça eklemek istediğiniz Fragment üzerinde getChildFragmentManager()'yi çağırmanız yeterlidir. Bu işlem, normalde üst düzey etkinlikten yaptığınız gibi parça işlemleri oluşturmak için kullanabileceğiniz bir FragmentManager döndürür. Örneğin, aşağıda örnek dosya içinden bir parça ekleyen mevcut bir Fragment sınıfı:

Kotlin

val videoFragment = VideoPlayerFragment()
childFragmentManager.beginTransaction().apply {
    add(R.id.video_fragment, videoFragment)
    commit()
}

Java

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

İç içe yerleştirilmiş bir parçanın içinden, şunu çağırarak üst parçaya bir başvuru alabilirsiniz: getParentFragment()

Android Destek Kitaplığı artık iç içe yerleştirilmiş parçaları da desteklediği için Android 1.6 ve sonraki sürümlerde iç içe yerleştirilmiş parça tasarımları uygulayabilirsiniz.

Not: Bir düzen <fragment> içeriyorsa bu düzeni bir parçaya genişletemezsiniz. İç içe yerleştirilmiş parçalar yalnızca parçasına dinamik bir şekilde uyar.

Renderscript

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

Komut dosyası yerleşiklikleri

Aşağıdakiler gibi yaygın işlemleri sizin için uygulayan Renderscript'in yerleşik komut dosyası içsel özelliklerini kullanabilirsiniz:

Komut dosyası içsel özelliğini kullanmak için komut dosyasının bir örneğini oluşturmak üzere her içsel özelliğin statik create() yöntemini çağırın. Ardından, müsait set() hattını arayın. her komut dosyasının doğasında vardır. Son olarak, forEach() yöntemini kullanabilirsiniz.

Komut Dosyası Grupları

ScriptGroup, ilgili Renderscript komut dosyalarını birbirine bağlamanıza ve tek bir çağrıyla yürütmenize olanak tanır.

Tüm komut dosyalarını gruba eklemek için ScriptGroup.Builder kullanın addKernel() numaralı telefonu arayarak. Tüm komut dosyalarını ekledikten sonra addConnection()'ü çağırarak komut dosyaları arasında bağlantılar oluşturun. Bağlantıları ekleme işlemini tamamladığınızda create() adlı kuruluşu arayın komut dosyası grubunu oluşturun. Komut dosyası grubunu yürütmeden önce, setInput(Script.KernelID, Allocation) yöntemiyle çalıştırılacak giriş Allocation ve ilk komut dosyasını belirtin ve sonucun yazılacağı çıkış Allocation dosyasını ve setOutput() ile çalıştırılacak son komut dosyasını sağlayın. Son olarak, Komut dosyası grubunu çalıştırmak için execute().

Filterscript

Filtre komut dosyası, mevcut Renderscript API'lerinde, ortaya çıkan kodun daha çeşitli işlemcilerde (CPU'lar, GPU'lar ve DSP'ler) çalışmasını sağlayan kısıtlamalar tanımlar. Filtre komut dosyası oluşturmak için .fs dosyası oluşturun dosyalarını kullanarak .rs dosyalarını çalıştırabilir ve #pragma rs_fp_relaxed öğesini Renderscript çalışma zamanına komut dosyalarınızın yüksek düzeyde IEEE 754-2008 kayan nokta kesinliği gerektirmediğini bildirir. Bu hassasiyet, normalleştirme için sıfıra yuvarlamaya ve sıfıra doğru yuvarlamaya olanak tanır. Ayrıca, Filterscript komut dosyalarınız 32 bit yerleşik türleri kullanmamalı ve Filterscript, root() işlevinin varsayılan imzasını tanımlayan işaretçileri desteklemediğinden __attribute__((kernel)) özelliğini kullanarak özel bir kök işlev belirtmelidir.

Not: Platformda filterscript desteği mevcuttur ancak geliştirici desteği, SDK Araçları Sürüm 21.0.1'de sunulacaktır.

Android 4.2'deki tüm API değişikliklerinin ayrıntılı görünümü için API Farklılıkları Raporu'na bakın.