개요

차량 설정(packages/apps/Car/Settings)은 Android Automotive OS(AAOS) 전용으로 제공됩니다. 차량 설정은 휴대전화 설정(packages/apps/Settings)과 다릅니다. 차량 설정은 익숙한 휴대전화 설정을 포함하고 있지만, 차량에 최적화된 시각적 사용자 인터페이스, 운전자 주의 분산 행동 최적화, OEM을 위한 다양한 맞춤설정 진입점을 제공합니다.

아래에 제공된 차량 설정 개요 외에도 다음 관련 주제를 확인하여 차량 설정에 관해 자세히 알아보세요.

아키텍처 및 가이드라인

차량 설정의 페이지 대부분은 SettingsFragment를 확장하는 일련의 프래그먼트로 구현되고, 각 프래그먼트에는 CarSettingActivities에 정의된 고유 활동이 있습니다. 이러한 정적 활동은 BaseCarSettingsActivity에서 확장됩니다. 이 규칙에 몇 가지 예외가 있기는 하지만(예: SettingsFragment 대신 BaseFragment를 확장하는 일부 특수 프래그먼트 및 CarSettingActivities 외부에 존재하는 일부 활동) 이 모든 것은 따라야 하는 패턴이 아닌 예외로 간주되어야 합니다.

정적 환경설정

정적 환경설정은 Preference 또는 CarUiPreference 태그를 사용하여 XML에 정의됩니다. SettingsFragment 구현은 getPreferenceScreenResId() 메서드를 사용하여 표시할 정적 환경설정 목록을 어떤 XML 파일에 포함할지 정의합니다.

동적 환경설정

동적 환경설정은 PreferenceGroup 태그 또는 PreferenceGroup의 구현(예: LogicalPreferenceGroup)을 사용하여 환경설정 컨트롤러에 의해 생성 및 제어되는 환경설정을 정의합니다.

CarSettings 앱 내의 동적 환경설정은 사용자를 CarSettings의 추가 페이지로 안내하기는 하지만 XML에서가 아닌 환경설정 컨트롤러를 통해 추가된 일반 환경설정 집합을 나타냅니다. 예를 들어 언어 및 입력 환경설정에 있는 키보드 관리 환경설정은 입력 방법이 허용되는지에 따라 환경설정 페이지에 입력 방법을 동적으로 추가합니다.

작업 모음

모든 설정 화면 상단에는 '뒤로' 탐색, 화면 제목, 보조 작업 위젯(예: 버튼 및 스위치) 등이 있는 작업 모음이 있습니다. 이러한 작업 모음은 Android의 ActionBar와 비슷하지만 실제로는 사용자설정 보기입니다. Android 11 이상의 경우 이 툴바는 섀시 기본 레이아웃에 포함되어 있으며, 이 레이아웃에는 툴바와 관련된 보기와 나머지 애플리케이션 콘텐츠를 위한 framelayout이 있습니다.

보조 작업 위젯은 MenuItem 클래스이며 각 SettingsFragment 또는 BaseFragmentonCreate에서 생성되어야 합니다. 가시성, 상태 같은 속성은 SettingsFragment의 비즈니스 로직에 있는 setter에 의해 제어되어야 합니다.

// 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);
    }
}

작업 모음은 차량 설정의 Distraction Optimization이 가능한 상태로 제공됩니다. 생성 시 MenuItem.Builder에서 UXRestrictions를 설정합니다.

환경설정 컨트롤러

각 설정 페이지에는 다양한 환경설정이 있을 수 있습니다. 코드 구성 관리를 돕기 위해 각 환경설정 또는 관련 환경설정 그룹에는 PreferenceController가 연결되어 있습니다.

이러한 구성요소가 어떻게 관련되어 있는지 확인하려면 다음 이미지를 참고하세요.

CarSettings 구성요소

그림 1. CarSettings 구성요소

PreferenceController는 특정 환경설정과 관련된 비즈니스 로직을 캡슐화하는 데 도움이 되는 수명 주기 인식 구성요소입니다. PreferenceControllers는 XML을 통해 관련 환경설정에만 연결할 수 있습니다.

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

자바 코드를 거의 변경하지 않고 설정 계층 구조를 더 쉽게 수정할 수 있도록 차량 설정은 코드를 통한 PreferenceController 생성을 명시적으로 억제합니다.

PreferenceController가 올바르게 작동하려면 동적 데이터가 필요할 수 있습니다. 예를 들어 애플리케이션 관련 알림을 끄는 PreferenceController는 어떤 애플리케이션이 작동하는지 알아야 합니다. PreferenceControllers가 항상 XML에 정의되므로 추가 생성자 인수를 제공할 방법이 없습니다. 대신 이러한 추가 값은 PreferenceController의 공개 setter를 통해 제공되며 SettingsFragmentuse(...) 메서드를 사용하여 설정됩니다.

// 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(...) 메서드가 많이 사용되면 될수록 자바 코드를 거의 변경하지 않고도 설정 계층 구조를 더 쉽게 재배열할 수 있다는 원래 목표를 유지하기가 더 어려워집니다. 이는 기존 프래그먼트 코드 중 상당수를 새로 생성된 프래그먼트에 복사해야 하기 때문입니다. 그 목표 실현의 어려움을 최소화하는 한 가지 방법은 다음과 같습니다.

  • use(...)의 사용을 최소화합니다.
  • 모든 use(...) 호출을 프래그먼트의 한 위치(예: onAttach() 메서드)에 보관해 봅니다.

인텐트 처리

차량 설정 앱에서 처리해야 하는 모든 인텐트매니페스트 파일에 정의됩니다. 일반적으로 인텐트는 대다수의 표준 Android 애플리케이션처럼 정의 및 처리됩니다. 이때 모든 활동 및 인텐트 필터는 매니페스트에 정의됩니다.

루트 프래그먼트 변경

기본적으로 앱이 실행되면 차량 설정에 HomepageFragment가 표시됩니다. 이 프래그먼트는 config_is_quick_settings_root, config_enable_home_settings_icon, config_enable_quick_settings_icon의 부울 값을 변환하여 QuickSettingFragment로 구성할 수 있습니다.

원하는 경우 config_show_settings_root_exit_icon을 사용하여 닫기 아이콘을 표시하거나 숨길 수 있습니다.

테마 맞춤설정

기타 속성 및 리소스 맞춤설정

차량 설정 앱에는 Theme.CarUi의 확장 프로그램인 CarSettingTheme가 주로 사용됩니다. 시스템 일관성을 위해 시스템 앱의 모양과 느낌을 표준화하는 데 사용되는 테마입니다.

환경설정 맞춤설정

환경설정을 맞춤설정할 경우 다음 추가 위치까지 적용됩니다.

  • 일부 기본 환경설정 클래스의 레이아웃이 car_preference에 정의되고 차량 빌드에 오버레이됩니다. 기본 환경설정 클래스의 모든 맞춤설정 레이아웃은 여기에서 대체할 수 있습니다.
  • 차량 설정에는 주로 common 패키지에 정의된 일부 맞춤 환경설정이 사용됩니다. 이러한 환경설정은 차량 환경설정 모듈 내에서 기본 환경설정 클래스와는 별개로 오버레이되어야 합니다.