Bilgi mimarisi

Android 8.0, ayarların düzenlenme şeklini basitleştirmek ve kullanıcıların Android cihazlarını özelleştirmek için ayarları hızlıca bulmasını kolaylaştırmak amacıyla Ayarlar uygulaması için yeni bir bilgi mimarisi kullanıma sundu. Android 9, daha fazla ayar işlevi ve daha kolay uygulama sunmak için bazı iyileştirmeler yaptı.

Örnekler ve kaynak

Ayarlar'daki çoğu sayfa şu anda yeni çerçeve kullanılarak uygulanmaktadır. DisplaySettings:packages/apps/Settings/src/com/android/settings/DisplaySettings.java iyi bir örnektir.

Önemli bileşenlerin dosya yolları aşağıda listelenmiştir:

  • CategoryKey: packages/SettingsLib/src/com/android/settingslib/drawer/CategoryKey.java
  • DashboardFragmentRegistry: packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
  • DashboardFragment: packages/apps/Settings/src/com/android/settings/dashboard/DashboardFragment.java
  • AbstractPreferenceController: frameworks/base/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
  • BasePreferenceController (Android 9'da kullanıma sunuldu): packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java

Uygulama

Cihaz üreticilerinin, mevcut Ayarlar bilgi mimarisini uyarlamaları ve iş ortaklarına özgü özellikleri barındırmak için gerektiğinde ek ayar sayfaları eklemeleri önerilir. Tercihleri eski sayfadan (SettingsPreferencePage olarak uygulanır) yeni bir sayfaya (DashboardFragment kullanılarak uygulanır) taşımak karmaşık olabilir. Eski sayfadaki tercih muhtemelen bir PreferenceController ile uygulanmamıştır.

Bu nedenle, eski bir sayfadaki tercihleri yeni bir sayfaya taşırken yeni DashboardFragment içinde örneklemeden önce bir PreferenceController oluşturmanız ve kodu denetleyiciye taşımanız gerekir. PreferenceController'ün gerektirdiği API'ler adlarında açıklanır ve Javadoc'da belgelenir.

Her PreferenceController için bir birim testi eklemeniz önemle tavsiye edilir. Değişiklik AOSP'ye gönderiliyorsa birim testi gerekir. Robolectric tabanlı testlerin nasıl yazılacağı hakkında daha fazla bilgi edinmek için packages/apps/Settings/tests/robotests/README.md readme dosyasını inceleyin.

Eklenti tarzı bilgi mimarisi

Her ayar öğesi bir Tercih olarak uygulanır. Bir tercih, bir sayfadan diğerine kolayca taşınabilir.

Birden fazla ayarın taşınmasını kolaylaştırmak için Android 8.0, ayar öğelerini içeren eklenti tarzı bir ana makine parçasını kullanıma sundu. Ayarlar öğeleri, eklenti tarzı denetleyiciler olarak modellenmiştir. Bu nedenle, ayarlar sayfası tek bir ana makine parçası ve birden fazla ayar denetleyicisi tarafından oluşturulur.

DashboardFragment

DashboardFragment, eklenti tarzı tercih kontrol cihazlarının ana makinesidir. Parça, PreferenceFragment öğesinden devralınır ve hem statik tercih listelerini hem de dinamik tercih listelerini genişletmek ve güncellemek için kancalara sahiptir.

Statik tercihler

Statik tercih listesi, XML'de <Preference> etiketi kullanılarak tanımlanır. DashboardFragment uygulaması, görüntülenecek statik tercih listesini içeren XML dosyasını tanımlamak için getPreferenceScreenResId() yöntemini kullanır.

Dinamik tercihler

Dinamik öğe, harici veya dahili bir etkinliğe yönlendiren amaca sahip bir karoyu temsil eder. Genellikle intent, farklı bir ayar sayfasına yönlendirir. Örneğin, Ayarlar ana sayfasındaki "Google" ayar öğesi dinamik bir öğedir. Dinamik öğeler AndroidManifest'te (aşağıda ele alınmıştır) tanımlanır ve bir FeatureProvider ( DashboardFeatureProvider olarak tanımlanır) aracılığıyla yüklenir.

Dinamik ayarlar, statik olarak yapılandırılmış ayarlardan daha ağırdır. Bu nedenle, normalde geliştiriciler bu ayarı statik olarak uygulamalıdır. Ancak dinamik ayar, aşağıdakilerden herhangi biri geçerli olduğunda yararlı olabilir:

  • Bu ayar doğrudan Ayarlar uygulamasında uygulanmaz (ör. OEM/Operatör uygulamaları tarafından uygulanan bir ayarı yerleştirme).
  • Ayar, Ayarlar ana sayfasında görünür.
  • Bu ayar için zaten bir Etkinliğiniz var ve ek statik yapılandırmayı uygulamak istemiyorsunuz.

Bir etkinliği dinamik ayar olarak yapılandırmak için aşağıdakileri yapın:

  • Etkinliğe intent filtresi ekleyerek etkinliği dinamik ayar olarak işaretleyin.
  • Ayarlar uygulamasına hangi kategoriye ait olduğunu söyleyin. Kategori, CategoryKey içinde tanımlanan bir sabittir.
  • İsteğe bağlı: Ayar görüntülenirken özet metni ekleyin.

DisplaySettings için Ayarlar uygulamasından alınan bir örneği burada bulabilirsiniz.

<activity android:name="Settings$DisplaySettingsActivity"
                   android:label="@string/display_settings"
                   android:icon="@drawable/ic_settings_display">
             <!-- Mark the activity as a dynamic setting -->
              <intent-filter>
                     <action android:name="com.android.settings.action.IA_SETTINGS" />
              </intent-filter>
             <!-- Tell Settings app which category it belongs to -->
              <meta-data android:name="com.android.settings.category"
                     android:value="com.android.settings.category.ia.homepage" />
             <!-- Add a summary text when the setting is displayed -->
              <meta-data android:name="com.android.settings.summary"
                     android:resource="@string/display_dashboard_summary"/>
             </activity>

Oluşturma sırasında, parça hem statik XML'den hem de AndroidManifest içinde tanımlanan dinamik ayarlardan tercihler listesi ister. PreferenceController'ler Java kodunda veya XML'de tanımlanmış olsun, DashboardFragment her ayarın işlem mantığını PreferenceController aracılığıyla yönetir (aşağıda ele alınmıştır). Ardından, kullanıcı arayüzünde karma bir liste olarak gösterilir.

PreferenceController

Bu bölümde açıklandığı gibi, PreferenceController'ü Android 9 ve Android 8.x'te uygulama arasında farklılıklar vardır.

Android 9 sürümünde PreferenceController

PreferenceController, görüntüleme, güncelleme, arama dizine ekleme vb. dahil olmak üzere tercihle etkileşime geçecek tüm mantığı içerir.

PreferenceController öğesinin arayüzü BasePreferenceController olarak tanımlanır. Örneğin, packages/apps/Settings/src/com/android/settings/core/ BasePreferenceController.java

BasePreferenceController kapsamında, her biri Ayarlar uygulamasının varsayılan olarak desteklediği belirli bir kullanıcı arayüzü stiliyle eşlenen birkaç alt sınıf bulunur. Örneğin, TogglePreferenceController'te kullanıcının açma/kapatma düğmesine dayalı bir tercih kullanıcı arayüzüyle nasıl etkileşim kurması gerektiğini doğrudan eşleyen bir API vardır.

BasePreferenceController, getAvailabilityStatus(), displayPreference(), handlePreferenceTreeClicked(), vb. API'lere sahiptir. Her API'nin ayrıntılı dokümanları arayüz sınıfındadır.

BasePreferenceController (ve TogglePreferenceController gibi alt sınıflarının) uygulanmasına ilişkin bir kısıtlama, oluşturucu imzasının aşağıdakilerden biriyle eşleşmesi gerektiğidir:

  • public MyController(Context context, String key) {}
  • public MyController(Context context) {}

Kontrol paneli, parçaya bir tercih yüklerken görüntüleme süresinden önce PreferenceController eklemek için bir yöntem sağlar. Yükleme sırasında, gelecekte ilgili tüm etkinliklerin kontrolöre gönderilmesi için kontrolör parçaya bağlanır.

DashboardFragment, ekranda PreferenceController'lerin listesini tutar. onCreate() yönteminde, getAvailabilityStatus() yöntemi için tüm denetleyiciler çağrılır ve bu yöntem true döndürürse görüntüleme mantığını işlemek için displayPreference() çağrılır. getAvailabilityStatus(), Ayarlar çerçevesine arama sırasında hangi öğelerin kullanılabileceğini bildirmek için de önemlidir.

Android 8.x sürümlerindeki PreferenceController

PreferenceController; görüntüleme, güncelleme, arama dizine ekleme vb. dahil olmak üzere tercihle etkileşimde bulunacak tüm mantığı içerir.

Tercih etkileşimlerine karşılık olarak, PreferenceController arayüzünde isAvailable(), displayPreference(), handlePreferenceTreeClicked() vb. API'ler bulunur. Her bir API ile ilgili ayrıntılı belgeler arayüz sınıfında bulunabilir.

Kontrol paneli, parçaya bir tercih yüklerken görüntüleme süresinden önce PreferenceController eklemek için bir yöntem sağlar. Yükleme sırasında, gelecekte ilgili tüm etkinliklerin kontrolöre gönderilmesi için kontrolör parçaya bağlanır.

DashboardFragment, PreferenceControllers listesini ekranda tutar. onCreate() yönteminde, isAvailable() yöntemi için tüm denetleyiciler çağrılır ve doğru döndürülürse görüntüleme mantığını işlemek için displayPreference() çağrılır.

DashboardFragment'i kullanma

Bir tercihi A sayfasından B sayfasına taşıma

Tercih, orijinal sayfanın tercih XML dosyasında statik olarak listelenmişse Android sürümünüz için aşağıdaki Statik taşıma prosedürünü uygulayın. Aksi takdirde, Android sürümünüz için Dinamik taşıma prosedürünü uygulayın.

Android 9'da statik taşıma

  1. Orijinal sayfa ve hedef sayfanın tercih XML dosyalarını bulun. Bu bilgileri sayfanın getPreferenceScreenResId() yönteminden bulabilirsiniz.
  2. Tercihi orijinal sayfanın XML'inden kaldırın.
  3. Tercihi, hedef sayfanın XML'sine ekleyin.
  4. Orijinal sayfanın Java uygulamasından bu tercihe ait PreferenceController değerini kaldırın. Genellikle createPreferenceControllers() içinde Denetleyici doğrudan XML'de tanımlanabilir.

    Not: Tercih için PreferenceController olmayabilir.

  5. Hedef sayfanın createPreferenceControllers() alanında PreferenceController nesnesi oluşturun. PreferenceController eski sayfada XML'de tanımlanmışsa yeni sayfa için de XML'de tanımlayın.

Android 9'da dinamik taşıma

  1. Orijinal ve hedef sayfanın hangi kategoride olduğunu bulun. Bu bilgileri DashboardFragmentRegistry bölümünde bulabilirsiniz.
  2. Taşımanız gereken ayarı içeren AndroidManifest.xml dosyasını açın ve bu ayarı temsil eden Etkinlik girişini bulun.
  3. com.android.settings.category için etkinliğin meta veri değerini yeni sayfanın kategori anahtarına ayarlayın.

Android 8.x sürümlerinde statik taşıma

  1. Orijinal sayfa ve hedef sayfanın tercih XML dosyalarını bulun.
  2. Bu bilgileri sayfanın getPreferenceScreenResId() yönteminden bulabilirsiniz.
  3. Orijinal sayfanın XML'inden tercihi kaldırın.
  4. Tercihi hedef sayfanın XML'ine ekleyin.
  5. Orijinal sayfanın Java uygulamasında bu tercih için PreferenceController değerini kaldırın. Genellikle getPreferenceControllers() içindedir.
  6. Not: Tercih için PreferenceController olmayabilir.

  7. Hedef sayfanın getPreferenceControllers() alanında PreferenceController nesnesi oluşturun.

Android 8.x sürümlerinde dinamik taşıma

  1. Orijinal ve hedef sayfanın barındırdığı kategoriyi bulun. Bu bilgileri DashboardFragmentRegistry adresinde bulabilirsiniz.
  2. Taşımanız gereken ayarı içeren AndroidManifest.xml dosyasını açın ve bu ayarı temsil eden Etkinlik girişini bulun.
  3. Etkinliğin com.android.settings.category için meta veri değerini değiştirin, değer noktasını yeni sayfanın kategori anahtarına ayarlayın.

Sayfada yeni tercih oluşturma

Tercih, orijinal sayfanın tercih XML dosyasında statik olarak listelenmişse aşağıdaki statik prosedürü uygulayın. Aksi takdirde dinamik prosedürü uygulayın.

Statik tercih oluşturma

  1. Sayfa için tercih edilen XML dosyalarını bulun. Bu bilgiyi sayfanın getPreferenceScreenResId() yönteminde bulabilirsiniz.
  2. XML'e yeni bir Tercih öğesi ekleyin. Benzersiz bir android:key içerdiğinden emin olun.
  3. Sayfanın getPreferenceControllers() yönteminde bu tercih için bir PreferenceController tanımlayın.
    • Android 8.x ve isteğe bağlı olarak Android 9'da, sayfanın createPreferenceControllers() yönteminde bu tercih için bir PreferenceController örneği oluşturun.

      Bu tercih başka yerlerde zaten mevcutsa bunun için bir PreferenceController olabilir. Yeni bir PreferenceController oluşturmadan yeniden kullanabilirsiniz.

    • Android 9'dan itibaren, tercihin yanında XML olarak PreferenceController belirtmeyi seçebilirsiniz. Örnek:
      <Preference
              android:key="reset_dashboard"
              android:title="@string/reset_dashboard_title"
              settings:controller="com.android.settings.system.ResetPreferenceController"/>

Dinamik tercih oluşturma

  1. Orijinal ve hedef sayfanın hangi kategoride olduğunu bulun. Bu bilgileri DashboardFragmentRegistry adresinde bulabilirsiniz.
  2. AndroidManifest'te yeni etkinlik oluşturma
  3. Ayarı tanımlamak için yeni etkinliğe gerekli meta verileri ekleyin. com.android.settings.category için meta veri değerini 1. adımda tanımlanan değere ayarlayın.

Yeni sayfa oluştur

  1. DashboardFragment öğesinden devralınacak yeni bir parça oluşturun.
  2. DashboardFragmentRegistry içinde kategorisini tanımlayın.

    Not: Bu adım isteğe bağlıdır. Bu sayfada dinamik tercihlere ihtiyacınız yoksa kategori anahtarı sağlamanız gerekmez.

  3. Bu sayfa için gereken ayarları ekleme adımlarını uygulayın. Daha fazla bilgi için Uygulama bölümüne bakın.

Doğrulama

  • Ayarlar'da Robolectric testlerini çalıştırın. Mevcut ve yeni tüm testler geçmelidir.
  • Ayarlar'ı derleyip yükleyin, ardından değiştirilmekte olan sayfayı manuel olarak açın. Sayfa hemen güncellenir.