總覽

汽車設置 ( packages/apps/Car/Settings ) 是專門為 Android Automotive OS (AAOS) 提供的。汽車設置不同於電話設置( packages/apps/Settings )。雖然 Car Settings 包含一些熟悉的電話設置,但 Car Settings 提供了汽車化的視覺用戶界面、駕駛員分心優化以及 OEM 的眾多自定義入口點。

除了下面提供的汽車設置概述外,請參閱這些相關主題以了解有關汽車設置的更多信息:

架構和指南

Car Settings 中的大多數頁面都實現為一系列擴展SettingsFragment的片段,每個片段在CarSettingActivities中定義了自己的活動。這些靜態活動是從BaseCarSettingsActivity擴展而來的。雖然這條規則有一些例外,例如一些特殊的 Fragment 擴展BaseFragment而不是SettingsFragment和一些駐留在CarSettingActivities之外的活動,所有這些都應該被視為例外(而不是要遵循的模式)。

靜態首選項

使用PreferenceCarUiPreference標籤在 XML 中定義靜態首選項。 SettingsFragment實現使用getPreferenceScreenResId()方法來定義哪個 XML 文件包含要顯示的首選項的靜態列表。

動態偏好

動態首選項使用PreferenceGroup > 標記或 PreferenceGroup 的實現(例如LogicalPreferenceGroup)來定義一組由Preference Controller生成和控制的首選項。

在 CarSettings 應用程序中,動態首選項表示一組正常的首選項,這些首選項將用戶引導到 CarSettings 中的其他頁面,但這些首選項是通過首選項控制器而不是 XML 中添加的。一個示例是語言和輸入首選項下的管理鍵盤首選項,它根據是否允許這些輸入法動態地將輸入法添加到首選項頁面。

動作條

每個設置屏幕的頂部都有一個操作欄,其中可以包含“返回”導航、屏幕標題和補充操作小部件(例如,按鈕和開關)。這些動作條類似於Android提供的ActionBar ,但實際上是自定義視圖。在 Android 11 及更高版本中,此工具欄包含在機箱基礎佈局中,其中包含工具欄的視圖和其餘應用程序內容的框架佈局。

補充動作小部件是 MenuItem 類,應在相應SettingsFragmentBaseFragmentonCreate中創建。可見性、狀態等屬性應由 SettingsFragment 的業務邏輯中的SettingsFragment器控制。

// ExampleSettingsFragment.java
public class ExampleSettingsFragment extends SettingsFragment {

    @Override
    protected List<MenuItem> getToolbarMenuItems() {
        return Collections.singletonList(mClearConfirmButton);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mButton = new MenuItem.Builder(getContext())
                .setTitle(R.string.text)
                .setOnClickListener(mOnClickListener)
                .setUxRestrictions(CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP)
                .build();
    }

    private void updateState() {
        button.setVisible(false);
    }
}

操作欄支持汽車設置中的分心優化。在創建時在MenuItem.Builder中設置 UXRestrictions。

偏好控制器

每個設置頁面可以包含許多不同的首選項。為了幫助維護代碼組織,每個首選項或一組相關的首選項都有一個與之關聯的PreferenceController

請參閱下圖了解這些組件之間的關係:

CarSettings 組件

圖 1. CarSettings 組件

PreferenceController是一個生命週期感知組件,有助於封裝與特定 Preferences 相關的業務邏輯。 PreferenceControllers只能通過 XML 附加到相關的 Preference 上。

// example_settings_fragment.xml
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:title="@string/example_settings_title">
  <Preference
    android:key="@string/pk_example_preference_key"
    android:title="@string/example_preference_title"
    settings:controller="com.android.car.settings.example.ExamplePreferenceController"/>
</PreferenceScreen>

Car Settings 明確禁止通過代碼創建PreferenceController ,以便更輕鬆地修改 Settings 層次結構,而對 Java 代碼的更改最少。

PreferenceController可能需要一些動態數據才能正確運行。例如,關閉應用程序通知的PreferenceController需要知道要對哪個應用程序進行操作。因為PreferenceControllers總是在 XML 中定義,所以無法提供額外的構造函數參數。相反,這些附加值是通過PreferenceController上的公共設置器提供的,並使用 SettingsFragment 中的use(...)方法進行SettingsFragment

// ExamplePreferenceController.java
public class ExamplePreferenceContorller extends PreferenceController<Preference> {

  private ExampleArg mExampleArg;

  public ExamplePreferenceController(...) {
    ...
  }

  public void setExampleArg(ExampleArg exampleArg) {
    mExampleArg = exampleArg;
  }
}

// ExampleSettingsFragment.java
public class ExampleSettingsFragment extends SettingsFragment {

  @Override
  @XmlRes
  protected int getPreferenceScreenResId() {
    Return R.xml.example_settings_fragment;
  }

  @Override
  public void onAttach(Context context) {
    ExampleArg arg = (ExampleArg) getArguments().getSerializeable(ARG_KEY);
    ExamplePreferenceController controller =
        use(ExamplePreferenceController.class, R.string.pk_example_preference_key);
    controller.setExampleArg(arg);
  }
}

use(...)方法越頻繁,就越難以保持能夠重新排列設置層次結構的最初目標,而對 Java 代碼的更改最少,因為現有片段代碼的大部分將需要被複製到新創建的片段。將這樣做的難度降到最低的一種方法是:

  • 盡量減少使用use(...)
  • 嘗試將每個對use(...)的調用保留在片段中的一個位置(例如,在onAttach()方法中)。

意圖處理

汽車設置應用程序應處理的所有意圖都在清單文件中定義。意圖通常像大多數標準 Android 應用程序一樣定義和處理,所有活動和意圖過濾器都在清單中定義。

更改根片段

默認情況下,汽車設置會在應用啟動時顯示HomepageFragment 。這可以通過反轉config_is_quick_settings_rootconfig_enable_home_settings_iconconfig_enable_quick_settings_icon的布爾值來配置為QuickSettingFragment

如果需要,可以使用config_show_settings_root_exit_icon顯示或隱藏退出圖標。

自定義主題

自定義其他屬性和資源

Car Settings 應用程序主要使用CarSettingTheme ,它是Theme.CarUi的擴展。此主題用於標準化系統應用程序的外觀,以確保系統的一致性。

自定義首選項

自定義首選項跨越這些額外的位置:

  • 一些基本偏好類的佈局在car_preference中定義,並為汽車構建覆蓋。基本首選項類的任何自定義佈局都可以在此處替換。
  • Car Settings 使用一些主要在common包中定義的自定義首選項。這些應該與基本首選項類分開覆蓋在汽車設置模塊中。