ガレージモード

自動車のアイドル時間を提供するために、ガレージモードはシステムを起動したまま維持し、アイドル状態で制約された JobScheduler のジョブを実行できるようにします。

ガレージモードとは

スマートフォンなどの接続されたデバイスでは、ユーザーはデバイスを安定かつ最新で最適化された状態に保つために、システムに依存しています。その状態を達成するために、Android プラットフォームは、ユーザーがデバイスを操作していないときにアプリがタスクを実行できるアイドル時間枠を提供します。スマートフォンは、ユーザーが長時間(60 分以上)触れない場合にアイドルと見なされ、画面がオフになります。スマートフォンとは異なり、自動車は使用されていない場合にオフになります。これは自動車にアイドル時間枠がないことを意味します。ガレージモードでは、自動車のアイドル時間を確保します。

ユーザーが自動車のエンジンを切ると、システムはガレージモードに入ります。自動車がガレージモードになると、システムの電源がオン、ディスプレイがオフになり、JobScheduler キューのアイドルジョブが実行されます。ガレージモードを実装するには、下記のデバイス実装のガイドラインをご覧ください。

デバイス実装のガイドライン

ガレージモードを有効にするには、自動車のエンジンを切る際に、車両 HAL(VHAL)が AP_POWER_STATE_REQSHUTDOWN_PREPARE 状態で、パラメータを SHUTDOWN_ONLY または CAN_SLEEP に設定して送信する必要があります。

SHUTDOWN_PREPARE 状態を有効にするために、VHAL は AP_POWER_STATE_REQ コマンドに 2 つのパラメータ(状態と追加パラメータ)を指定する必要があります。これにより、デバイスはガレージモードに入ります。ガレージモードは JobScheduler 内のスケジュール設定されたジョブを検出し、ジョブが完了するまでシステムが停止またはシャットダウンしないようにします。

デバイスの実装が Android フレームワークに接続する方法

ガレージモードでは、フレームワークは VHAL に、必要な時間を超過するか、すべてのジョブが実行されるまでシャットダウン時間を延長し、その後でシステムをシャットダウンするようリクエストします。CDD で定義されている特定の状況で、デバイスの実装がシステムをより早くシャットダウンする場合があります(Android の互換性要件の詳細については、Android 互換性定義文書(CDD)をご覧ください)。ガレージモードが完了する前に VHAL がシステムをシャットダウンする必要がある場合、VHAL はパラメータを SHUTDOWN_IMMEDIATELY または SLEEP_IMMEDIATELY に設定して SHUTDOWN_PREPARE を発行できます。デバイスの実装では、特定の状況(通常はシステムの稼働を維持するために必要なリソースが不足している場合)でのみ、この方法を使用できます。たとえば、電池容量が不足している場合などです。

アプリ デベロッパーによるガレージモードの使用方法

アプリとサービスは、ガレージモードと直接やり取りしません。代わりに、アプリは JobScheduler でジョブのスケジュールを設定します。アイドル状態で制約されたジョブは、ガレージモードで実行されます。

次のコードは、ガレージモードで実行するジョブのスケジュールを設定する方法を示しています。

    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());