Garage Mode

차량에 유휴 시간을 제공하기 위해 Garage Mode는 시스템을 절전 모드 해제 상태로 유지하여 JobScheduler유휴 상태로 제한된 작업을 실행할 수 있습니다.

Garage Mode란?

스마트폰과 같이 연결된 기기에서 사용자는 시스템을 사용하여 기기가 안정적이고, 최신 상태이고, 최적화되어 있는지 확인합니다. 이러한 상태에 도달하기 위해 Android 플랫폼은 사용자가 기기와 상호 작용하지 않을 때 애플리케이션이 작업을 수행 할 수 있는 비활성 시간대를 제공합니다. 사용자가 스마트폰을 장시간(60분 이상) 터치하지 않고 화면이 꺼지면 스마트폰은 비활성 상태로 간주됩니다. 스마트폰과 달리 자동차를 사용하지 않는 경우 자동차는 꺼지는데, 이는 자동차에는 비활성 시간대가 없음을 의미합니다. Garage Mode는 자동차에서 비활성 시간을 보장합니다.

사용자가 자동차의 시동을 끄면 시스템이 Garage Mode로 전환됩니다. 자동차가 Garage Mode이면 시스템 전원이 켜져 있고, 디스플레이는 꺼져 있으며, JobScheduler 대기열의 비활성 작업이 실행됩니다. Garage Mode를 구현하려면 아래의 기기 구현 가이드라인을 참조하세요.

기기 구현 가이드라인

Garage Mode를 활성화하려면 차량 시동이 꺼져 있을 때 VHAL(차량 HAL)이 SHUTDOWN_ONLY 또는 CAN_SLEEP으로 설정된 매개변수를 사용해 상태가 SHUTDOWN_PREPAREAP_POWER_STATE_REQ를 전송해야 합니다.

SHUTDOWN_PREPARE 상태가 유효하려면 VHAL이 AP_POWER_STATE_REQ 명령어에 대해 두 매개변수(상태 및 추가 매개변수)를 지정해야 합니다. 그러면 기기가 Garage Mode로 전환되어, JobScheduler에서 예약된 작업을 감지하고 작업이 완료될 때까지 시스템이 정지 또는 종료 상태로 전환되지 않도록 방지합니다.

기기 구현이 Android 프레임워크에 어떻게 연결되나요?

Garage Mode의 경우 프레임워크는 필요한 지속 시간이 초과되거나 모든 작업이 실행될 때까지(이 때가 되면 시스템은 종료됨) 시스템 종료 시간을 연장하도록 요청합니다. CDD에 정의된 특정 상황에서 기기 구현은 시스템을 더 빨리 종료할 수 있습니다. (Android 호환성 요구사항에 대한 자세한 내용은 Android CDD(호환성 정의 문서)를 참조하세요.) Garage Mode가 완료되기 전에 VHAL이 시스템을 종료해야 하는 경우 VHAL은 SHUTDOWN_IMMEDIATELY 또는 SUSPEND_IMMEDIATELY로 설정된 매개변수를 사용하여 SHUTDOWN_PREPARE를 실행할 수 있습니다. 기기 구현은 특정 상황(일반적으로 시스템을 계속해서 실행 상태로 유지하는 데 필요한 리소스를 사용할 수 없는 경우)에서만 이 매개변수를 사용할 수 있습니다. 예를 들어 배터리 용량이 부족한 경우가 해당됩니다.

애플리케이션 개발자는 Garage Mode를 어떻게 사용하나요?

애플리케이션과 서비스는 Garage Mode와 직접 상호 작용하지 않습니다. 대신 앱은 JobScheduler에서 작업을 예약합니다. 비활성 상태로 제한된 작업은 Garage Mode에서 실행됩니다.

다음 코드는 Garage Mode에서 실행되도록 작업을 예약하는 방법을 보여줍니다.

    public class MyGarageModeJob extends JobService { ... }

    Context context = ...;
    int jobId = ...;

    ComponentName myGarageModeJobName = new componentName(context,
                                                          MyGarageModeJob.class);

    JobInfo.Builder infoBuilder = new JobInfo.Builder(jobId, myGarageModeJobName)
                        .setRequiresDeviceIdle(true);

    // Example of an optional constraint:
    infoBuilder.setRequiredNetworkType(NetworkType.NETWORK_TYPE_UNMETERED);

    JobScheduler jobScheduler = (JobScheduler) context
                        .getSystemService(Context.JOB_SCHEDULER_SERVICE);

    jobScheduler.schedule(infoBuilder.build());