Android Automotive(carパッケージ)のServiceたち

#Android Automotive
※Android Autoとは別物です。

公式：
https://developer.android.com/reference/android/car/classes

###AutoとAutomotive
Android Autoは、一般的なAndroidアプリをAuto対応車載機で表示・操作出来るようにするものです。
いつも使っているアプリを車載機でも使えるようにしよう！といったものです。

Android Automotiveは、車載システムにHAL(Hardware Abstraction Layer)を持ち、
自動車関連のデータを収集し、Androidアプリケーションで使用することが出来るようになるものです。

#環境構築
別記事予定。

#車の作り方
Carクラスのstaticメソッド createCar(Context, ServiceConnection)で作ります。

**This API works only for devices with PackageManager.FEATURE_AUTOMOTIVE .**
PackageManager.FEATURE_AUTOMOTIVE を備えてるデバイスでしか呼び出せない。
(備えていない場合、"FEATURE_AUTOMOTIVE not declared while android.car is used" 
エラーでnullが返ってくる。)

```java:example
// MainActivity
...
private Car car;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        car = Car.createCar(this, new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                // ServiceとActivityの接続が確立された時の処理
            }

            @Override
            public void onServiceDisconnected(ComponentName componentName) {
                // Serviceと切断された時の処理
            }
        });
    }
```

#Serviceの開始

`car.connect();`
で、サービスとバインドされる。
`car.disconnect();`
で、バインドが外れる。(Serviceも終了する。)
####裏で実行されていること
```java:android.car.Car.java
// connect()でstartCarService()が呼ばれる。

private void startCarService(){
  Intent intent = new Intent();
  // 明示的Intent
  intent.setPackage("com.android.car");
  // Actionを設定
  intent.setAction("android.car.ICar");

  // bindService()と同様の動作。
  // UserHandleはマルチユーザー環境でのユーザー判別用。
  boolean bound = mContext.bindServiceAsUser(intent, mServiceConnectionListener, Context.BIND_AUTO_CREATE, UserHandle.CURRENT_OR_SELF);

  // boundがtrueになるか、リトライ回数が20回に到達するまで、
  // 500ms間隔でメインスレッド宛にbindServiceをリトライするRunnableをpostする。
  // (コード省略)
  // 接続されると...
  private final ServiceConnection mServiceConnectionListener = new ServiceConnection() {
  public void onServiceConnected(ConponentName name, IBinder service) {
    synchronized (Car.this) {
      // com.android.car.ICarImpl.java
      mService = ICar.Stub.asIntergace(service);
    }
    // createCarする時にoverrideしたonServiceConnectedが呼ばれる。
    mServiceConnectionListenerClient.onServiceConnected(name, service);
}

public void disconnect() {
  // Car関連Managerの.onCarDisconnected()が呼ばれる。
  tearDownCarManagers();
  // アンバインド
  mContext.unbindService(mServiceConnectionListener);
}
```
#CarパッケージのService取得
Car.getCarManager(String serviceName)で、
Context.getSystemService(String serviceName)と同じように、
車固有のサービスを持ってくる。(Object型を返す為、キャストが必要)

```java:example
// CarAudioManagerを取得したい場合
CarAudioManager carAudioManager = car.getCarManager(Car.AUDIO_SERVICE);
```

#CarパッケージのService一覧
|class|Service名|概要|
|:---:|:-------:|:---|
|CarAudioManager|AUDIO_SERVICE|音声処理|
|CarSensorManager|SENSOR_SERVICE|車のセンサデータ監視(Speedなど)|
|CarInfoManager|INFO_SERVICE|車に関する静的情報を取得(バッテリー容量、燃料容量、メーカーなど)|
|CarAppFocusManager|APP_FOCUS_SERVICE||
|CarPackageManager|PACKAGE_SERVICE||
|CarUxRestrictionsManager|CAR_UX_RESTRICTION_SERVICE||
|CarConfigurationManager|CAR_CONFIGURATION_SERVICE||
|CarNavigationStatusManager|NAVIGATION_STATUS_SERVICE||

##hide指定
以下、@hide指定のService

|class|Service名|概要|
|:-:|:-:|:--|
|CarCabinManager|CABIN_SERVICE||
|CarDiagnosticManager|DIAGNOSTIC_SERVICE||
|CarHvacManager|HVAC_SERVICE||
|CarPowerManager|POWER_SERVICE||
|CarProjectionManager|PROJECTION_SERVICE||
|CarPropertyManager|PROPERTY_SERVICE||
|CarVendowExtensionManager|VENDOR_EXTENSION_SERVICE||
|CarInstrumentClusterManager|CAR_INSTRUMENT_CLUSTER_SERVICE||
|CarTestManager|TEST_SERVICE||
|VmsSubscriberManager|VMS_SUBSCRIBER_SERVICE||
|CarBluetoothManager|BLUETOOTH_SERVICE||
|CarStorageMonitoringManager|STORAGE_MONITORING_SERVICE||
|CarDrivingStateManager|CAR_DRIVING_STATE_SERVICE||