개요

자동차 설정(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의 구현을 사용합니다.

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를 설정합니다.

환경설정 컨트롤러

각 설정 페이지에는 다양한 환경설정이 있을 수 있습니다.

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

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>

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

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

인텐트 처리

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

루트 프래그먼트 변경

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

테마 맞춤설정

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

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

환경설정 맞춤설정

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

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