Kiến trúc thông tin

Android 8.0 đã giới thiệu kiến ​​trúc thông tin mới cho ứng dụng Cài đặt nhằm đơn giản hóa cách sắp xếp cài đặt và giúp người dùng dễ dàng tìm thấy cài đặt nhanh chóng hơn để tùy chỉnh thiết bị Android của họ. Android 9 đã giới thiệu một số cải tiến nhằm cung cấp thêm chức năng Cài đặt và triển khai dễ dàng hơn.

Ví dụ và nguồn

Hầu hết các trang trong Cài đặt hiện đang được triển khai bằng khung mới. Một ví dụ điển hình là DisplaySettings: packages/apps/Settings/src/com/android/settings/DisplaySettings.java

Đường dẫn tệp cho các thành phần quan trọng được liệt kê bên dưới:

  • 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
  • Tóm tắtPreferenceController : frameworks/base/packages/SettingsLib/src/com/android/settingslib/core/AbstractPreferenceController.java
  • BasePreferenceController (được giới thiệu trong Android 9): packages/apps/Settings/src/com/android/settings/core/BasePreferenceController.java

Thực hiện

Các nhà sản xuất thiết bị được khuyến khích điều chỉnh cấu trúc thông tin Cài đặt hiện có và chèn các trang cài đặt bổ sung nếu cần để phù hợp với các tính năng dành riêng cho đối tác. Việc di chuyển tùy chọn từ trang cũ (được triển khai dưới dạng SettingsPreferencePage ) sang trang mới (được triển khai bằng DashboardFragment ) có thể phức tạp. Tùy chọn từ trang kế thừa có thể không được triển khai bằng PreferenceController .

Vì vậy, khi di chuyển tùy chọn từ trang cũ sang trang mới, bạn cần tạo PreferenceController và di chuyển mã vào bộ điều khiển trước khi khởi tạo nó trong DashboardFragment mới. Các API mà PreferenceController yêu cầu được mô tả bằng tên của chúng và được ghi lại bằng Javadoc.

Bạn nên thêm một bài kiểm tra đơn vị cho mỗi PreferenceController . Nếu thay đổi được gửi tới AOSP thì cần phải thực hiện kiểm tra đơn vị. Để biết thêm thông tin về cách viết các bài kiểm tra dựa trên Robolectric, hãy xem packages/apps/Settings/tests/robotests/README.md .

Kiến trúc thông tin kiểu plugin

Mỗi mục cài đặt được triển khai dưới dạng Tùy chọn. Tùy chọn có thể dễ dàng được chuyển từ trang này sang trang khác.

Để giúp di chuyển nhiều cài đặt dễ dàng hơn, Android 8.0 đã giới thiệu một đoạn máy chủ kiểu plugin chứa các mục cài đặt. Các mục cài đặt được mô hình hóa dưới dạng bộ điều khiển kiểu plugin. Do đó, một trang cài đặt được xây dựng bởi một đoạn máy chủ duy nhất và nhiều bộ điều khiển cài đặt.

Bảng điều khiểnĐoạn

DashboardFragment là nơi lưu trữ các bộ điều khiển tùy chọn kiểu plugin. Đoạn kế thừa từ PreferenceFragment và có các móc nối để mở rộng và cập nhật cả danh sách tùy chọn tĩnh và danh sách tùy chọn động.

Tùy chọn tĩnh

Danh sách tùy chọn tĩnh được xác định trong XML bằng thẻ <Preference> . Việc triển khai DashboardFragment sử dụng phương thức getPreferenceScreenResId() để xác định tệp XML nào chứa danh sách tùy chọn tĩnh cần hiển thị.

Tùy chọn động

Mục động đại diện cho một ô có mục đích, dẫn đến Hoạt động bên ngoài hoặc bên trong. Thông thường, mục đích sẽ dẫn đến một trang cài đặt khác. Ví dụ: mục cài đặt "Google" trong trang chủ Cài đặt là mục động. Các mục động được xác định trong AndroidManifest (được thảo luận bên dưới) và được tải thông qua FeatureProvider (được định nghĩa là DashboardFeatureProvider ).

Cài đặt động nặng hơn cài đặt được định cấu hình tĩnh, vì vậy thông thường các nhà phát triển nên triển khai cài đặt dưới dạng cài đặt tĩnh. Tuy nhiên, cài đặt động có thể hữu ích khi bất kỳ điều nào sau đây là đúng:

  • Cài đặt này không được triển khai trực tiếp trong ứng dụng Cài đặt (chẳng hạn như đưa vào cài đặt do ứng dụng OEM/Nhà cung cấp dịch vụ triển khai).
  • Cài đặt sẽ xuất hiện trên trang chủ Cài đặt.
  • Bạn đã có Hoạt động cho cài đặt và không muốn triển khai cấu hình tĩnh bổ sung.

Để định cấu hình Hoạt động dưới dạng cài đặt động, hãy làm như sau:

  • Đánh dấu hoạt động là cài đặt động bằng cách thêm bộ lọc ý định vào hoạt động.
  • Cho ứng dụng Cài đặt biết nó thuộc danh mục nào. Danh mục này là một hằng số, được xác định trong CategoryKey .
  • Tùy chọn: Thêm văn bản tóm tắt khi cài đặt được hiển thị.

Đây là một ví dụ được lấy từ ứng dụng Cài đặt cho DisplaySettings .

<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>

Tại thời điểm kết xuất, đoạn sẽ yêu cầu danh sách Tùy chọn từ cả cài đặt XML tĩnh và động được xác định trong AndroidManifest . Cho dù PreferenceController được xác định bằng mã Java hay XML, DashboardFragment vẫn quản lý logic xử lý của từng cài đặt thông qua PreferenceController (được thảo luận bên dưới). Sau đó, chúng được hiển thị trong giao diện người dùng dưới dạng danh sách hỗn hợp.

Bộ điều khiển ưu tiên

Có sự khác biệt giữa việc triển khai PreferenceController trong Android 9 và Android 8.x, như được mô tả trong phần này.

PreferenceController trong bản phát hành Android 9

PreferenceController chứa tất cả logic để tương tác với tùy chọn, bao gồm hiển thị, cập nhật, lập chỉ mục tìm kiếm, v.v.

Giao diện của PreferenceController được định nghĩa là BasePreferenceController . Ví dụ: xem mã trong packages/apps/Settings/src/com/android/settings/core/ BasePreferenceController.java

Có một số lớp con của BasePreferenceController , mỗi lớp ánh xạ tới một kiểu giao diện người dùng cụ thể mà ứng dụng Cài đặt hỗ trợ theo mặc định. Ví dụ: TogglePreferenceController có API ánh xạ trực tiếp tới cách người dùng nên tương tác với giao diện người dùng tùy chọn dựa trên chuyển đổi.

BasePreferenceController có các API như getAvailabilityStatus() , displayPreference() , handlePreferenceTreeClicked(), v.v. Tài liệu chi tiết cho từng API có trong lớp giao diện.

Một hạn chế trong việc triển khai BasePreferenceController (và các lớp con của nó như TogglePreferenceController ) là chữ ký của hàm tạo phải khớp với một trong những điều sau:

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

Trong khi cài đặt tùy chọn cho đoạn, trang tổng quan cung cấp phương thức để đính kèm PreferenceController trước thời gian hiển thị. Tại thời điểm cài đặt, bộ điều khiển được kết nối với đoạn để tất cả các sự kiện liên quan trong tương lai đều được gửi đến bộ điều khiển.

DashboardFragment giữ một danh sách PreferenceController trên màn hình. Tại onCreate() của đoạn, tất cả các bộ điều khiển đều được gọi cho phương thức getAvailabilityStatus() và nếu nó trả về true, displayPreference() sẽ được gọi để xử lý logic hiển thị. getAvailabilityStatus() cũng rất quan trọng để cho khung Cài đặt biết những mục nào có sẵn trong quá trình tìm kiếm.

PreferenceController trong các bản phát hành Android 8.x

PreferenceController chứa tất cả logic để tương tác với tùy chọn, bao gồm hiển thị, cập nhật, lập chỉ mục tìm kiếm. vân vân.

Tương ứng với các tương tác tùy chọn, giao diện của PreferenceController có các API isAvailable() , displayPreference() , handlePreferenceTreeClicked() v.v. Tài liệu chi tiết về từng API có thể được tìm thấy trong lớp giao diện.

Trong khi cài đặt tùy chọn cho đoạn, trang tổng quan cung cấp phương thức để đính kèm PreferenceController trước thời gian hiển thị. Tại thời điểm cài đặt, bộ điều khiển được kết nối với đoạn để tất cả các sự kiện liên quan trong tương lai đều được gửi đến bộ điều khiển.

DashboardFragment giữ một danh sách PreferenceControllers trên màn hình. Tại onCreate() của đoạn, tất cả các bộ điều khiển đều được gọi cho phương thức isAvailable() và nếu nó trả về true, thì displayPreference() sẽ được gọi để xử lý logic hiển thị.

Sử dụng DashboardFragment

Di chuyển tùy chọn từ trang A sang B

Nếu tùy chọn được liệt kê tĩnh trong tệp XML tùy chọn của trang gốc, hãy làm theo quy trình Di chuyển tĩnh cho bản phát hành Android của bạn bên dưới. Nếu không, hãy làm theo quy trình Di chuyển động cho bản phát hành Android của bạn.

Di chuyển tĩnh trong Android 9

  1. Tìm các tệp XML ưu tiên cho trang gốc và trang đích. Bạn có thể tìm thấy thông tin này từ phương thức getPreferenceScreenResId() của trang.
  2. Xóa tùy chọn khỏi XML của trang gốc.
  3. Thêm tùy chọn vào XML của trang đích.
  4. Xóa PreferenceController cho tùy chọn này khỏi quá trình triển khai Java của trang gốc. Thông thường nó nằm trong createPreferenceControllers() . Bộ điều khiển có thể được khai báo trực tiếp bằng XML.

    Lưu ý : Tùy chọn có thể không có PreferenceController .

  5. Khởi tạo PreferenceController trong createPreferenceControllers() của trang đích. Nếu PreferenceController được xác định bằng XML ở trang cũ, hãy xác định nó bằng XML cho trang mới.

Di chuyển động trong Android 9

  1. Tìm danh mục mà trang gốc và trang đích lưu trữ. Bạn có thể tìm thấy thông tin này trong DashboardFragmentRegistry .
  2. Mở tệp AndroidManifest.xml chứa cài đặt bạn cần di chuyển và tìm mục Hoạt động đại diện cho cài đặt này.
  3. Đặt giá trị siêu dữ liệu của hoạt động cho com.android.settings.category thành khóa danh mục của trang mới.

Di chuyển tĩnh trong bản phát hành Android 8.x

  1. Tìm các tệp XML ưu tiên cho trang gốc và trang đích.
  2. Bạn có thể tìm thấy thông tin này từ phương thức getPreferenceScreenResId() của trang.
  3. Xóa tùy chọn trong XML của trang gốc.
  4. Thêm tùy chọn vào XML của trang đích.
  5. Xóa PreferenceController cho tùy chọn này trong quá trình triển khai Java của trang gốc. Thông thường nó ở trong getPreferenceControllers() .
  6. Lưu ý : Có thể tùy chọn không có PreferenceController .

  7. Khởi tạo PreferenceController trong getPreferenceControllers() của trang đích.

Di chuyển động trong các bản phát hành Android 8.x

  1. Tìm danh mục mà trang gốc và trang đích lưu trữ. Bạn có thể tìm thấy thông tin này trong DashboardFragmentRegistry .
  2. Mở tệp AndroidManifest.xml chứa cài đặt bạn cần di chuyển và tìm mục Hoạt động đại diện cho cài đặt này.
  3. Thay đổi giá trị siêu dữ liệu của hoạt động cho com.android.settings.category , đặt điểm giá trị thành khóa danh mục của trang mới.

Tạo tùy chọn mới trong một trang

Nếu tùy chọn được liệt kê tĩnh trong tệp XML tùy chọn của trang gốc, hãy làm theo quy trình tĩnh bên dưới. Nếu không thì hãy làm theo quy trình động .

Tạo tùy chọn tĩnh

  1. Tìm các tệp XML ưu tiên cho trang. Bạn có thể tìm thấy thông tin này từ phương thức getPreferenceScreenResId() của trang.
  2. Thêm mục Tùy chọn mới trong XML. Đảm bảo nó có android:key duy nhất.
  3. Xác định PreferenceController cho tùy chọn này trong phương thức getPreferenceControllers() của trang.
    • Trong Android 8.x và tùy chọn trong Android 9, hãy khởi tạo PreferenceController cho tùy chọn này trong phương thức createPreferenceControllers() của trang.

      Nếu tùy chọn này đã tồn tại ở những nơi khác thì có thể đã có PreferenceController cho nó. Bạn có thể sử dụng lại PreferenceController mà không cần tạo một cái mới.

    • Bắt đầu từ Android 9, bạn có thể chọn khai báo PreferenceController trong XML bên cạnh tùy chọn. Ví dụ:
      <Preference
              android:key="reset_dashboard"
              android:title="@string/reset_dashboard_title"
              settings:controller="com.android.settings.system.ResetPreferenceController"/>
      

Tạo tùy chọn động

  1. Tìm danh mục mà trang gốc và trang đích lưu trữ. Bạn có thể tìm thấy thông tin này trong DashboardFragmentRegistry .
  2. Tạo một Hoạt động mới trong AndroidManifest
  3. Thêm siêu dữ liệu cần thiết vào Hoạt động mới để xác định cài đặt. Đặt giá trị siêu dữ liệu cho com.android.settings.category thành cùng giá trị được xác định ở bước 1.

Tạo một trang mới

  1. Tạo một đoạn mới, kế thừa từ DashboardFragment .
  2. Xác định danh mục của nó trong DashboardFragmentRegistry .

    Lưu ý: Bước này là tùy chọn. Nếu bạn không cần bất kỳ tùy chọn động nào trong trang này, bạn không cần cung cấp khóa danh mục.

  3. Làm theo các bước để thêm cài đặt cần thiết cho trang này. Để biết thêm thông tin, hãy xem phần Thực hiện .

Thẩm định

  • Chạy thử nghiệm điện tự động trong Cài đặt. Tất cả các bài kiểm tra hiện có và mới phải vượt qua.
  • Xây dựng và cài đặt Cài đặt, sau đó mở thủ công trang đang được sửa đổi. Trang sẽ cập nhật ngay lập tức.