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 belgede, projenin en önemli ve en önemli geliştiriciler için yararlı yeni API'ler.

Uygulama geliştirici olarak Android 4.2 sistem görüntüsü ve SDK platformunu şuradan indirmeniz gerekir: SDK Manager'ı en kısa sürede güncelleyin. Ş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 yeni API'leri kullanmaya başlamak için uygulamalarınızı Android 4.2 platformunda derleyin.

Uygulamanızı Android 4.2 çalıştıran cihazlar için daha iyi optimize etmek üzere targetSdkVersion özelliğini şu şekilde ayarlamalısınız: "17", Android 4.2 sistem görüntüsüne yükleyin, test edip bu değişikliği içeren bir güncelleme yayınlayın.

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 nedir? Düzey mi?

Ö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ılmıyor. 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.

  • Android'in önceki sürümleriyle karşılaştırıldığında kullanıcı konumu sonuçlarının doğruluğu daha düşük olabilir Uygulamanız ACCESS_COARSE_LOCATION iznini istiyor ancak , ACCESS_FINE_LOCATION iznini istemiyor.

    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 tanımlandı 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 . Örneğin targetSdkVersion değeri 16 veya altına düştüğünde ek açıklama gerekmez ancak hedef sürümünüzü güncellemenizi öneririz. ve daha fazla güvenlik için ek açıklama ekleyin.

    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örüntüler ve bu, Dokunulduğunda kapanan veya etkileşimli ve duyarlı olabilen, tamamen görsel, pasif bir ekran olmalıdır. tüm giriş etkinlikleri paketine otomatik olarak geçiş yapar. Hayalleriniz, uygulamanızın sürecinde çalışır ve aşağıdakilere tam erişim elde eder: görünüm, düzenler ve animasyonları içeren Android kullanıcı arayüzü araç seti sayesinde daha esnek animasyonlu duvar kağıtlarından veya uygulama widget'larından daha güçlü.

DreamService alt sınıfını uygulayarak Daydream için bir hayal oluşturabilirsiniz. DreamService API'ler: Activity ile benzer olacak ş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. Şuradan bir DreamService başlatamazsınız: uygulama. Sistem tarafından otomatik olarak başlatılır.

Hayaliniz etkileşimliyse, rüyanızdan bir etkinlik başlatabilir ve kullanıcıyı ilgili uygulamanızın tam kullanıcı arayüzünde daha fazla ayrıntı veya kontrol sağlayabilirsiniz. Kullanıcının görebileceği şekilde hayali sonlandırmak için finish() öğesini kullanabilirsiniz. yeni Etkinlik'e dokunun.

Hayal gücünüzü sistemde kullanılabilir hale getirmek için DreamService öğenizi <service> öğesiyle bildirin manifest dosyanıza ekleyin. Daha sonra, "android.service.dreams.DreamService" işlemine sahip 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 ürününde başka yararlı yöntemler de vardır dikkat etmeniz gereken bazı konular:

  • 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 belgelerine bakın.

İ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 bir ekran için benzersiz içerik oluşturmak isterseniz Presentation öğesini genişletin sınıfını kullanın ve onCreate() geri çağırmasını uygulayın. Şu süre içinde: onCreate(), ikincil ekran için kullanıcı arayüzünüzü belirtin setContentView() numaralı telefonu arayarak. Dialog sınıfının bir uzantısı olarak Presentation sınıfı, uygulamanızın ikincil görüntülü reklam.

Presentation gösterebileceğiniz ikincil ekranları algılamak için DisplayManager veya MediaRouter kullanın API'ler. 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üsünü almak için MediaRouter.getSelectedRoute() numaralı telefonu arayıp iletebilirsiniz ROUTE_TYPE_LIVE_VIDEO. Bu komut, sistemin seçili olan rotasını açıklayan bir MediaRouter.RouteInfo nesnesi döndürür. en iyi uygulamaları paylaşacağız. 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 görünür.

Yeni bir ekran bağlandığını çalışma zamanında algılamak için onRoutePresentationDisplayChanged() geri çağırma yöntemini uyguladığınız bir MediaRouter.SimpleCallback örneği oluşturun. Yeni bir ekran bağlandığında sistem bu yöntemi çağırır. sunu ekranı bağlandı. Ardından, MediaRouter.SimpleCallback rotasını ROUTE_TYPE_LIVE_VIDEO rota türüyle birlikte MediaRouter.addCallback() adresine ileterek 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 farklı bir ekran yoğunluğuna sahip olabilir. Ekran özellikleri farklı olabileceğinden, Özellikle bu tür daha büyük ekranlar için optimize edilmiş kaynaklar sağlar. İ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 belgeleri.

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, AppWidgetProviderInfo öğesini belirten XML dosyanıza 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 kilitte de kullanılabilir olmasını istiyorsanız ekranına 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, android:initialLayout ile aynı şekilde çalışır. Çünkü Uygulama widget'ınız başlatılana kadar hemen görünebilecek ve kullanı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 Çok Kullanıcı

Android artık tabletler gibi paylaşılabilir cihazlarda birden fazla kullanıcı alanına izin veriyor. Bir web sitesindeki her kullanıcı cihazın kendi hesapları, uygulamaları, sistem ayarları, dosyaları ve diğer öğeleri verileri de kapsar.

Uygulama geliştirici olarak, uygulamanızın çalışması için farklı bir şey yapmanız gerekmez aynı cihazda birden fazla kullanıcıyla düzgün şekilde çalışır. Bir platformda kaç kullanıcı olursa olsun söz konusu cihaz için uygulamanızın belirli bir kullanıcı için kaydettiği veriler, uygulamanızın kaydettiği verilerden ayrı tutulur. kullanıcılar için neden budur. 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ı ortamda verileri 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 bir şekilde davrandığından emin olmak için sabit kodlu yolları kullanarak dahili uygulama dizini veya harici depolama konumunu izleme ve onun 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 açısından her kullanıcı tamamen ayrı bir cihazda saklamanıza olanak tanı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 (WiFi MAC gibi) birini isterse SERIAL numarası gibi) her biri için aynı değeri sağlar. çünkü bu tanımlayıcılar kullanıcıya değil, donanıma bağlıdır. Diğerlerinden bahsetmiyorum. Burada değinildiği gibi, bu tanımlayıcıların tanıttığı Uygulama Yüklemeleri konulu blog yayınından daha fazla bilgi edinebilirsiniz.

Yeni Genel 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. Bu özellik etkinleştirildiğinde sistem, şunları yapmak için çeşitli RTL API'lerini etkinleştirir: uygulamanızı RTL düzenleriyle gösterin. Örneğin, işlem çubuğunda simge ve başlık gösterilir. için de soldan sağa işlem düğmeleri ve çerçeve tarafından sağlanan View sınıfları da geri alınır.

Sağdan sola düzeniyle gösterildiğinde uygulamanızın görünümünü daha da optimize etmeniz gerekirse İki 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-ldrtl/ içinde res/layout/ ve RTL için optimize edilmiş düzenleriniz.

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

RTL düzenlerini desteklemek için çerçeve genelinde View sınıfını kullanarak özel etiketler için doğru davranışları uygulayabilirsiniz. görünümleri ve Configuration içinde de geçerli düzen yönünü sorgulamak için kullanılır.

Not: SQlite kullanıyorsanız ve "yalnızca sayı", olmak Dikkatli: String.format(String, Object...) kullanmak, rakamların cihazınız Arapça yerel ayarına ayarlanmışsa Arapçadaki eşdeğerlerine dönüştürülecektir. 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ı.

İç İçe Yerleştirilmiş Parçalar

Artık parçaları parçaların içine yerleştirebilirsiniz. Bu, çalışma düzenindeki çeşitli Dinamik ve yeniden kullanılabilir kullanıcı arayüzü bileşenlerini, kendi başına bir kullanıcı arayüzü bileşenine yerleştirmek istediğiniz dinamik ve tekrar kullanılabilir. Örneğin, ViewPager kullanarak hızlıca sola ve sağa kaydırarak ekran alanının çoğunu kaplayan parçalar oluşturabilirsiniz. parçaları her bir parça sayfasına ekleyin.

Bir parçayı iç içe yerleştirmek için üzerinde getChildFragmentManager() komutunu çağırmanız yeterlidir parça eklemek istediğiniz Fragment öğesini seçin. Bu işlem, üst düzey etkinlikten normalde yaptığınız gibi kullanabileceğiniz bir FragmentManager döndürür. parça işlemleri oluşturmak için kullanılı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 desteklemektedir, böylece iç içe yerleştirilmiş parçaları parça tasarımlarını kullanın.

Not: Bu düzen söz konusu olduğunda, düzeni parçaya şişiremezsiniz bir <fragment> içerir. İç 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:

Konuşma metni unsurları

Bu komut dosyalarını kullanarak yaygın işlemlerdir, örneğin:

Yerleşik bir komut dosyası kullanmak için her bir yerleşik komut dosyasının statik create() yöntemini çağırın komut dosyasının bir örneğini oluşturun. 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 öğeleri, ilgili Renderscript'i birbirine zincirlemenize olanak tanır tek bir çağrıyla yürütür.

Tüm komut dosyalarını gruba eklemek için ScriptGroup.Builder kullanın addKernel() numaralı telefonu arayarak. Planınızı komut dosyalarını ekledikten sonra, komut dosyalarını addConnection() çağırarak yapabilirsiniz. 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 girişi belirtin Allocation ve ilk komut dosyası, setInput(Script.KernelID, Allocation) yöntemini kullanıp çıktıyı Allocation burada sonucun ve nihai komut dosyasının setOutput() ile çalıştır. Son olarak, Komut dosyası grubunu çalıştırmak için execute().

Filtre komut dosyası

Filtre komut dosyası, mevcut Renderscript API'lerinde elde edilen kodun çalıştırılmasına olanak tanıyan kısıtlamaları tanımlar daha çeşitli işlemcilerde (CPU, GPU ve DSP) kullanılabilir. 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, denorlar için sıfıra yuvarlama ve sıfıra yuvarlamaya olanak tanır. Ayrıca, Filterscript komut dosyaları, 32 bit yerleşik türleri kullanmamalı ve __attribute__((kernel)) özelliği, root() işlevinin varsayılan imzasını tanımlar.

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.