Menggunakan Library Aplikasi Android untuk Mobil

Library Aplikasi Android untuk Mobil memungkinkan Anda menghadirkan aplikasi navigasi, parkir, dan pengisian daya ke mobil. Hal ini dilakukan dengan menyediakan serangkaian template yang dirancang untuk memenuhi standar gangguan bagi pengemudi dan menangani detail seperti berbagai faktor layar mobil dan modalitas input.

Panduan ini menyediakan ringkasan fitur dan konsep utama library, dan memandu Anda dalam proses menyiapkan aplikasi sederhana.

Sebelum memulai

  1. Tinjau Pedoman Desain Library Aplikasi Android untuk Mobil.
  2. Pelajari istilah dan konsep utama yang tercantum dalam bagian ini.
  3. Biasakan diri Anda dengan UI Sistem Android Auto.
  4. Tinjau Catatan Rilis.
  5. Tinjau Contoh.
  6. [Hanya library sumber tertutup] Tinjau Persyaratan Penggunaan Library Aplikasi Android untuk Mobil.

Istilah dan konsep utama

Model dan Template
Antarmuka pengguna diwakili oleh grafik objek model yang dapat digabungkan dalam cara yang berbeda-beda seperti yang diizinkan oleh template yang mencakupnya. Template adalah subset model yang dapat bertindak sebagai root dalam grafik tersebut. Model mencakup informasi yang akan ditampilkan kepada pengguna, dalam bentuk teks dan gambar, serta atribut untuk mengonfigurasi aspek tampilan visual dari informasi tersebut (misalnya, warna teks atau ukuran gambar). Host mengonversi model ke tampilan yang dirancang untuk memenuhi standar gangguan bagi pengemudi dan menangani detail seperti berbagai faktor layar mobil dan modalitas input.
Host
Host adalah komponen back end yang menerapkan fungsi yang ditawarkan oleh API library agar aplikasi Anda dapat berjalan di mobil. Tanggung jawab host berkisar dari menemukan aplikasi dan mengelola siklus prosesnya, hingga mengubah model Anda menjadi tampilan dan memberi tahu aplikasi Anda tentang interaksi pengguna. Pada perangkat seluler, host ini diimplementasikan oleh Android Auto.
Batasan template
Berbagai template menerapkan pembatasan pada konten model mereka. Misalnya, template daftar memiliki batas jumlah item yang dapat ditampilkan kepada pengguna. Template juga memiliki batasan agar dapat dihubungkan untuk membuat alur tugas. Misalnya, aplikasi hanya dapat mendorong hingga 5 template ke stack layar. Lihat Batasan template untuk detail selengkapnya.
Layar
Screen adalah class yang disediakan oleh library yang diterapkan aplikasi untuk mengelola antarmuka pengguna yang ditampilkan kepada pengguna. Screen memiliki siklus proses dan menyediakan mekanisme bagi aplikasi untuk mengirim template agar ditampilkan saat layar terlihat. Instance Screen juga dapat didorong dan muncul ke dan dari Stack layar, yang memastikannya mematuhi pembatasan alur template.
CarAppService
CarAppService adalah class Service abstrak yang harus diterapkan dan diekspor aplikasi Anda agar dapat ditemukan dan dikelola oleh host. CarAppService aplikasi Anda bertanggung jawab untuk memvalidasi bahwa koneksi host dapat dipercaya menggunakan CarAppService.createHostValidator, dan kemudian menyediakan instance Session untuk setiap sambungan menggunakan CarAppService.onCreateSession.
Sesi

Session adalah class abstrak yang harus diterapkan dan ditampilkan oleh aplikasi Anda menggunakan CarAppService.onCreateSession. Ini berfungsi sebagai titik entri untuk menampilkan informasi di layar mobil, dan memiliki siklus proses yang menginformasikan status aplikasi saat ini di layar mobil, seperti saat aplikasi Anda terlihat atau tersembunyi.

Saat Session dimulai (seperti saat aplikasi pertama kali diluncurkan), host akan meminta Screen awal untuk ditampilkan menggunakan metode Session.onCreateScreen.

Menginstal library

Ikuti halaman rilis library Jetpack untuk mendapatkan petunjuk tentang cara menambahkan library ke aplikasi Anda.

Mengonfigurasi file manifes aplikasi Anda

Sebelum dapat membuat aplikasi mobil, Anda perlu mengonfigurasi file manifes aplikasi Anda.

Mendeklarasikan CarAppService Anda

Host terhubung ke aplikasi Anda melalui penerapan CarAppService. Anda mendeklarasikan layanan ini dalam manifes agar host dapat menemukan dan terhubung ke aplikasi Anda.

Anda juga harus mendeklarasikan kategori aplikasi Anda dalam elemen category dari filter intent aplikasi Anda. Lihat daftar kategori aplikasi yang didukung untuk nilai yang diizinkan untuk elemen ini.

Cuplikan kode berikut ini menunjukkan cara mendeklarasikan layanan aplikasi mobil untuk aplikasi parkir di manifes Anda:

<application>
    ...
   <service
       ...
        android:name=".MyCarAppService"
        android:exported="true">
      <intent-filter>
        <action android:name="androidx.car.app.CarAppService"/>
        <category android:name="androidx.car.app.category.PARKING"/>
      </intent-filter>
    </service>

    ...
<application>

Kategori Aplikasi yang Didukung

Agar tercantum di Play Store untuk Android Auto, aplikasi harus termasuk dalam salah satu kategori aplikasi mobil yang didukung. Anda mendeklarasikan kategori aplikasi dengan menambahkan satu atau beberapa nilai kategori yang didukung berikut di filter intent saat mendeklarasikan layanan aplikasi mobil:

  • androidx.car.app.category.NAVIGATION: Aplikasi yang menyediakan petunjuk arah navigasi belokan demi belokan.
  • androidx.car.app.category.PARKING: Aplikasi yang menyediakan fungsi yang relevan untuk menemukan tempat parkir.
  • androidx.car.app.category.CHARGING: Aplikasi yang menyediakan fungsi yang relevan untuk menemukan Stasiun Pengisian Kendaraan Listrik Umum.

Lihat Kualitas aplikasi Android untuk mobil guna mengetahui deskripsi dan kriteria terperinci untuk aplikasi yang termasuk dalam setiap kategori.

Menentukan nama dan ikon aplikasi

Anda perlu menentukan nama dan ikon aplikasi yang dapat digunakan oleh host untuk mewakili aplikasi Anda di UI sistem.

Anda dapat menentukan nama dan ikon aplikasi yang digunakan untuk mewakili aplikasi menggunakan elemen label dan icon dari CarAppService:

...
<service
   android:name=".MyCarAppService"
   android:exported="true"
   android:label="@string/my_app_name"
   android:icon="@drawable/my_app_icon">
   ...
</service>
...

Jika label atau ikon tidak dideklarasikan dalam elemen service, host akan kembali ke nilai yang ditentukan untuk aplikasi tersebut.

API Level Aplikasi Mobil

Library Aplikasi Mobil menentukan API level-nya sendiri sehingga Anda dapat mengetahui fitur library yang didukung oleh host template pada kendaraan tertentu. Untuk mengambil API Level Aplikasi Mobil tertinggi yang didukung oleh host, gunakan metode getCarAppApiLevel().

Anda harus mendeklarasikan API Level Aplikasi Mobil minimum yang didukung oleh aplikasi Anda di file AndroidManifest.xml:

<manifest ...>
    <application ...>
        <meta-data
            android:name="androidx.car.app.minCarApiLevel"
            android:value="1"/>
    </application>
</manifest>

Lihat dokumentasi untuk anotasi RequiresCarApi guna mengetahui detail tentang cara mempertahankan kompatibilitas mundur dan mendeklarasikan API level minimum yang diperlukan untuk menggunakan fitur. Untuk mengetahui definisi API Level mana yang diperlukan untuk menggunakan fitur tertentu Library Aplikasi Mobil, lihat dokumentasi referensi untuk CarAppApiLevels.

Membuat CarAppService dan Sesi

Aplikasi Anda perlu memperluas class CarAppService dan menerapkan metode CarAppService.onCreateSession, yang menampilkan instance Session yang sesuai ke koneksi saat ini ke host:

Kotlin

class HelloWorldService : CarAppService() {
    ...
    override fun onCreateSession(): Session {
        return HelloWorldSession()
    }
    ...
}

Java

public final class HelloWorldService extends CarAppService {
    ...
    @Override
    @NonNull
    public Session onCreateSession() {
        return new HelloWorldSession();
    }
    ...
}

Instance Session bertanggung jawab menampilkan instance Screen untuk digunakan saat aplikasi pertama kali dimulai:

Kotlin

class HelloWorldSession : Session() {
    ...
    override fun onCreateScreen(intent: Intent): Screen {
        return HelloWorldScreen()
    }
    ...
}

Java

public final class HelloWorldSession extends Session {
    ...
    @Override
    @NonNull
    public Screen onCreateScreen(@NonNull Intent intent) {
        return new HelloWorldScreen();
    }
    ...
}

Untuk menangani skenario saat aplikasi mobil harus dimulai dari layar yang bukan layar utama atau halaman landing aplikasi (seperti menangani deep link), Anda dapat melakukan pra-seed data layar sebelumnya menggunakan ScreenManager.push. sebelum kembali dari onCreateScreen. Pra-seeding memungkinkan pengguna kembali ke layar sebelumnya dari layar pertama yang ditampilkan aplikasi Anda.

Membuat layar mulai

Anda membuat layar yang ditampilkan oleh aplikasi dengan menentukan kelas yang memperluas class Screen dan menerapkan metode Screen.onGetTemplate, yang menampilkan instance Template yang mewakili status UI untuk ditampilkan di layar mobil.

Cuplikan berikut menunjukkan cara mendeklarasikan Screen yang menggunakan template PaneTemplate untuk menampilkan string “Halo dunia!” yang sederhana:

Kotlin

class HelloWorldScreen(carContext: CarContext) : Screen(carContext) {
    override fun onGetTemplate(): Template {
        val row = Row.Builder().setTitle("Hello world!").build()
        val pane = Pane.Builder().addRow(row).build()
        return PaneTemplate.Builder(pane)
            .setHeaderAction(Action.APP_ICON)
            .build()
    }
}

Java

public class HelloWorldScreen extends Screen {
    @NonNull
    @Override
    public Template onGetTemplate() {
        Row row = new Row.Builder().setTitle("Hello world!").build();
        Pane pane = new Pane.Builder().addRow(row).build();
        return new PaneTemplate.Builder(pane)
            .setHeaderAction(Action.APP_ICON)
            .build();
    }
}

Class CarContext

Class CarContext adalah subclass ContextWrapper yang bisa diakses oleh instance Session dan Screen, yang memberikan akses ke layanan mobil seperti ScreenManager untuk mengelola stack layar ,AppManager untuk fungsi terkait aplikasi umum seperti mengakses objek Surface untuk menggambar peta aplikasi navigasi Anda, dan NavigationManager yang digunakan oleh aplikasi navigasi belokan demi belokan untuk menyampaikan metadata navigasi dan peristiwa terkait navigasi lainnya kepada host. Lihat Mengakses template navigasi untuk daftar lengkap fungsi library yang tersedia untuk aplikasi navigasi.

CarContext juga menawarkan fungsi lain seperti mengizinkan pemuatan resource drawable menggunakan konfigurasi dari layar mobil, memulai aplikasi di mobil menggunakan intent, dan memberi sinyal apakah aplikasi navigasi Anda harus menampilkan petanya dalam mode gelap.

Menerapkan navigasi layar

Aplikasi sering kali menyajikan sejumlah layar yang berbeda, masing-masing mungkin menggunakan template yang berbeda, yang dapat dilihat pengguna saat mereka berinteraksi dengan antarmuka yang ditampilkan di layar.

Class ScreenManager menyediakan stack layar yang dapat Anda gunakan untuk mendorong layar yang dapat muncul secara otomatis saat pengguna memilih tombol kembali di layar mobil, atau menggunakan hardware tombol kembali yang tersedia di beberapa mobil.

Cuplikan berikut menunjukkan cara menambahkan tindakan kembali ke template pesan, serta tindakan yang mendorong layar baru saat dipilih oleh pengguna:

Kotlin

val template = MessageTemplate.Builder("Hello world!")
    .setHeaderAction(Action.BACK)
    .addAction(
        Action.Builder()
            .setTitle("Next screen")
            .setOnClickListener { screenManager.push(NextScreen(carContext)) }
            .build())
    .build()

Java

MessageTemplate template = new MessageTemplate.Builder("Hello world!")
    .setHeaderAction(Action.BACK)
    .addAction(
        new Action.Builder()
            .setTitle("Next screen")
            .setOnClickListener(
                () -> getScreenManager().push(new NextScreen(getCarContext())))
            .build())
    .build();

Objek Action.BACK adalah Action standar yang secara otomatis memanggil ScreenManager.pop. Perilaku ini dapat diganti dengan menggunakan instance OnBackPressedDispatcher yang tersedia dari CarContext.

Untuk memastikan aplikasi aman saat mengemudi, stack layar dapat memiliki kedalaman maksimum 5 layar. Lihat Pembatasan template untuk mengetahui detail selengkapnya.

Memuat ulang konten template

Aplikasi Anda dapat meminta konten Screen agar dijadikan tidak valid dengan memanggil metode Screen.invalidate. Host kemudian memanggil kembali ke metode Screen.onGetTemplate aplikasi untuk mengambil template dengan konten baru.

Saat memuat ulang Screen, penting untuk memahami konten tertentu dalam template yang dapat diperbarui sehingga host tidak akan memperhitungkan template baru dalam kuota template. Lihat Batasan template untuk detail selengkapnya.

Sebaiknya buat struktur layar Anda sehingga ada pemetaan one-to-one antara Screen dan jenis template yang ditampilkan melalui implementasi Screen.onGetTemplate.

Berinteraksi dengan pengguna

Aplikasi Anda dapat berinteraksi dengan pengguna menggunakan pola yang mirip dengan aplikasi seluler.

Menangani input pengguna

Aplikasi Anda dapat merespons input pengguna dengan meneruskan pendengar yang sesuai ke model yang mendukung mereka. Cuplikan berikut menunjukkan cara membuat model Action yang menyetel OnClickListener yang dipanggil kembali ke metode yang ditentukan dengan kode aplikasi Anda:

Kotlin

val action = Action.Builder()
    .setTitle("Navigate")
    .setOnClickListener(::onClickNavigate)
    .build()

Java

Action action = new Action.Builder()
    .setTitle("Navigate")
    .setOnClickListener(this::onClickNavigate)
    .build();

Metode onClickNavigate kemudian dapat memulai aplikasi mobil navigasi default dengan menggunakan metode CarContext.startCarApp:

Kotlin

private fun onClickNavigate() {
    val intent = Intent(CarContext.ACTION_NAVIGATE, Uri.parse("geo:0,0?q=" + address))
    carContext.startCarApp(intent)
}

Java

private void onClickNavigate() {
    Intent intent = new Intent(CarContext.ACTION_NAVIGATE, Uri.parse("geo:0,0?q=" + address));
    getCarContext().startCarApp(intent);
}

Untuk detail selengkapnya tentang cara memulai aplikasi, termasuk format intent ACTION_NAVIGATE, lihat Memulai aplikasi mobil dengan intent.

Beberapa tindakan, seperti tindakan yang mengharuskan pengguna melanjutkan interaksi di perangkat seluler, hanya diizinkan saat mobil diparkir. Anda dapat menggunakan ParkedOnlyOnClickListener untuk menerapkan tindakan tersebut. Jika mobil tidak diparkir, host akan menampilkan indikasi kepada pengguna bahwa tindakan tersebut tidak diizinkan dalam kasus ini. Jika mobil diparkir, kode akan dijalankan seperti biasa. Cuplikan berikut menunjukkan cara menggunakan ParkedOnlyOnClickListener untuk membuka layar setelan di perangkat seluler:

Kotlin

val row = Row.Builder()
    .setTitle("Open Settings")
    .setOnClickListener(ParkedOnlyOnClickListener.create(::openSettingsOnPhone))
    .build()

Java

Row row = new Row.Builder()
    .setTitle("Open Settings")
    .setOnClickListener(ParkedOnlyOnClickListener.create(this::openSettingsOnPhone))
    .build();

Menampilkan notifikasi

Notifikasi yang dikirim ke perangkat seluler hanya akan muncul di layar mobil jika notifikasi tersebut diperluas dengan CarAppExtender. Beberapa atribut notifikasi, seperti judul konten, teks, ikon, dan tindakan, dapat ditetapkan di CarAppExtender, menggantikan atribut notifikasi saat muncul di layar mobil.

Cuplikan berikut menunjukkan cara mengirim notifikasi ke layar mobil yang menampilkan judul yang berbeda dari yang ditampilkan di perangkat seluler:

Kotlin

val notification = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
    .setContentTitle(titleOnThePhone)
    .extend(
        CarAppExtender.Builder()
            .setContentTitle(titleOnTheCar)
            ...
            .build())
    .build()

Java

Notification notification = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
    .setContentTitle(titleOnThePhone)
    .extend(
        new CarAppExtender.Builder()
            .setContentTitle(titleOnTheCar)
            ...
            .build())
    .build();

Notifikasi dapat memengaruhi bagian antarmuka pengguna berikut:

  • Notifikasi pendahuluan (HUN) dapat ditampilkan kepada pengguna.
  • Entri di pusat notifikasi dapat ditambahkan, secara opsional dengan badge yang terlihat di rel.
  • Untuk aplikasi navigasi, notifikasi dapat ditampilkan di widget rel seperti yang dijelaskan dalam Notifikasi belokan demi belokan.

Aplikasi dapat memilih cara mengonfigurasi notifikasi untuk memengaruhi setiap elemen antarmuka pengguna dengan menggunakan prioritas notifikasi, seperti yang dijelaskan dalam dokumentasi CarAppExtender.

Jika NotificationCompat.Builder.setOnlyAlertOnce dipanggil dengan nilai true, notifikasi prioritas tinggi hanya akan ditampilkan sebagai HUN satu kali.

Untuk mengetahui informasi selengkapnya tentang cara mendesain notifikasi aplikasi mobil, lihat Notifikasi.

Menampilkan toast

Aplikasi Anda dapat menampilkan toast menggunakan CarToast seperti yang ditunjukkan dalam cuplikan ini:

Kotlin

CarToast.makeText(carContext, "Hello!", CarToast.LENGTH_SHORT).show()

Java

CarToast.makeText(getCarContext(), "Hello!", CarToast.LENGTH_SHORT).show();

Meminta izin

Jika aplikasi Anda memerlukan akses ke data atau tindakan yang dibatasi (misalnya, mendapatkan akses lokasi), aturan standar izin Android juga akan berlaku untuk aplikasi Anda. Untuk meminta izin, Anda dapat menggunakan metode CarContext.requestPermissions(). Di Android Auto, dialog izin untuk pengguna akan muncul di ponsel.

Manfaat menggunakan CarContext.requestPermissions(), bukan menggunakan API Android standar, adalah Anda tidak perlu meluncurkan Activity Anda sendiri dengan tujuan hanya untuk membuat dialog izin. Jika dukungan Android Automotive OS tersedia pada akhir tahun, Anda juga dapat menggunakan kode yang sama di Android Auto dan Android Automotive OS daripada harus membuat alur yang bergantung pada platform.

Memulai aplikasi mobil dengan intent

Anda dapat memanggil metode CarContext.startCarApp untuk melakukan salah satu tindakan berikut:

  • Buka telepon untuk menelepon.
  • Mulai navigasi belokan demi belokan ke lokasi dengan aplikasi mobil navigasi default.
  • Mulai aplikasi Anda sendiri dengan intent.

Contoh berikut menunjukkan cara membuat notifikasi dengan tindakan yang membuka aplikasi Anda dengan layar yang menampilkan detail reservasi parkir. Anda memperluas instance notifikasi dengan intent konten yang berisi PendingIntent yang menggabungkan intent eksplisit ke tindakan aplikasi Anda:

Kotlin

val notification = notificationBuilder
    ...
    .extend(
        CarAppExtender.Builder()
            .setContentIntent(
                PendingIntent.getBroadcast(
                    context,
                    ACTION_VIEW_PARKING_RESERVATION.hashCode(),
                    Intent(ACTION_VIEW_PARKING_RESERVATION)
                        .setComponent(ComponentName(context, MyNotificationReceiver::class.java)),
                    0))
            .build())

Java

Notification notification = notificationBuilder
    ...
    .extend(
        new CarAppExtender.Builder()
            .setContentIntent(
                PendingIntent.getBroadcast(
                    context,
                    ACTION_VIEW_PARKING_RESERVATION.hashCode(),
                    new Intent(ACTION_VIEW_PARKING_RESERVATION)
                        .setComponent(new ComponentName(context, MyNotificationReceiver.class)),
                    0))
            .build());

Aplikasi Anda juga harus mendeklarasikan BroadcastReceiver yang dipanggil untuk memproses intent saat pengguna memilih tindakan dalam antarmuka notifikasi dan memanggil CarContext.startCarApp dengan intent termasuk URI data:

Kotlin

class MyNotificationReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val intentAction = intent.action
        if (ACTION_VIEW_PARKING_RESERVATION == intentAction) {
            CarContext.startCarApp(
                intent,
                Intent(Intent.ACTION_VIEW)
                    .setComponent(ComponentName(context, MyCarAppService::class.java))
                    .setData(Uri.fromParts(MY_URI_SCHEME, MY_URI_HOST, intentAction)))
        }
    }
}

Java

public class MyNotificationReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String intentAction = intent.getAction();
        if (ACTION_VIEW_PARKING_RESERVATION.equals(intentAction)) {
            CarContext.startCarApp(
                intent,
                new Intent(Intent.ACTION_VIEW)
                    .setComponent(new ComponentName(context, MyCarAppService.class))
                    .setData(Uri.fromParts(MY_URI_SCHEME, MY_URI_HOST, intentAction)));
        }
    }
}

Terakhir, metode Session.onNewIntent di aplikasi Anda menangani intent ini dengan mendorong layar reservasi parkir di stack jika belum ada di bagian atas:

Kotlin

override fun onNewIntent(intent: Intent) {
    val screenManager = carContext.getCarService(ScreenManager::class.java)
    val uri = intent.data
    if (uri != null
        && MY_URI_SCHEME == uri.scheme
        && MY_URI_HOST == uri.schemeSpecificPart
        && ACTION_VIEW_PARKING_RESERVATION == uri.fragment
    ) {
        val top = screenManager.top
        if (top !is ParkingReservationScreen) {
            screenManager.push(ParkingReservationScreen(carContext))
        }
    }
}

Java

@Override
public void onNewIntent(@NonNull Intent intent) {
    ScreenManager screenManager = getCarContext().getCarService(ScreenManager.class);
    Uri uri = intent.getData();
    if (uri != null
        && MY_URI_SCHEME.equals(uri.getScheme())
        && MY_URI_HOST.equals(uri.getSchemeSpecificPart())
        && ACTION_VIEW_PARKING_RESERVATION.equals(uri.getFragment())
    ) {
        Screen top = screenManager.getTop();
        if (!(top instanceof ParkingReservationScreen)) {
            screenManager.push(new ParkingReservationScreen(getCarContext()));
        }
    }
}

Lihat Menampilkan notifikasi untuk mengetahui informasi selengkapnya tentang cara menangani notifikasi untuk aplikasi mobil.

Batasan template

Host membatasi jumlah template yang ditampilkan untuk tugas yang diberikan hingga maksimum 5 template, dengan template terakhir harus salah satu dari jenis berikut:

  1. NavigationTemplate
  2. PaneTemplate
  3. MessageTemplate

Perhatikan bahwa batas ini berlaku untuk jumlah template, dan bukan jumlah instance Screen dalam stack. Misalnya, jika di layar A aplikasi mengirimkan 2 template, lalu mendorong layar B, aplikasi kini dapat mengirim 3 template lainnya. Atau, jika setiap layar disusun untuk mengirim satu template, aplikasi dapat mendorong 5 instance layar ke stack ScreenManager.

Ada beberapa kasus khusus pada pembatasan ini: muat ulang template, operasi kembali, dan reset.

Memuat ulang template

Pembaruan konten tertentu tidak termasuk dalam batas template. Secara umum, selama aplikasi mendorong template baru dengan jenis yang sama dan berisi konten utama yang sama seperti template sebelumnya, template baru tidak akan mengurangi kuota. Misalnya, memperbarui status pengalihan baris dalam ListTemplate tidak mengurangi kuota. Baca dokumentasi setiap template untuk mempelajari lebih lanjut jenis pembaruan konten yang dapat dianggap sebagai pemuatan ulang.

Operasi kembali

Untuk mengaktifkan sub-aliran dalam tugas, host mendeteksi kapan aplikasi memunculkan Screen dari stack ScreenManager, dan memperbarui kuota yang tersisa berdasarkan pada jumlah template yang digunakan aplikasi untuk mundur.

Misalnya, jika saat berada di layar A, aplikasi mengirimkan 2 template, lalu mendorong layar B dan mengirim 2 template lainnya, aplikasi memiliki 1 kuota yang tersisa. Jika aplikasi sekarang muncul kembali ke layar A, host akan mereset kuota menjadi 3, karena aplikasi telah mundur sebanyak 2 template.

Perhatikan bahwa saat muncul kembali ke layar, aplikasi harus mengirim template dengan jenis yang sama dengan yang terakhir dikirim oleh layar tersebut. Mengirim jenis template lainnya akan menyebabkan error. Namun, selama jenisnya tetap sama selama operasi kembali, aplikasi dapat dengan bebas mengubah konten template tanpa memengaruhi kuota.

Operasi reset

Template tertentu memiliki semantik khusus yang menandakan akhir tugas. Misalnya, NavigationTemplate adalah tampilan yang diharapkan tetap ada di layar dan dimuat ulang dengan petunjuk belokan demi belokan untuk dipakai pengguna selama beberapa bulan. Setelah mencapai salah satu template ini, host akan mereset kuota template, memperlakukan template seolah-olah itu adalah langkah pertama dari tugas baru, sehingga aplikasi dapat memulai tugas baru. Lihat dokumentasi setiap template untuk melihat template mana yang memicu reset di host.

Jika host menerima maksud untuk memulai aplikasi dari tindakan notifikasi atau dari peluncur, kuota juga akan direset. Mekanisme ini memungkinkan aplikasi memulai alur tugas baru dari notifikasi, dan tetap berlaku meskipun aplikasi sudah terikat dan berada di latar depan.

Lihat Menampilkan notifikasi untuk detail selengkapnya tentang cara menampilkan notifikasi aplikasi di layar mobil, dan Memulai aplikasi mobil dengan intent untuk cara memulai aplikasi dari tindakan notifikasi.

Menambahkan alur login

Jika aplikasi menawarkan pengalaman login untuk pengguna, Anda dapat menggunakan template seperti SignInTemplate dan LongMessageTemplate dengan Aplikasi Mobil API level 2 dan yang lebih tinggi untuk menangani proses login ke aplikasi Anda di head unit mobil.

Untuk membuat SignInTemplate, Anda perlu menentukan SignInMethod. Library Aplikasi Mobil saat ini mendukung tiga metode login:

Misalnya, untuk mengimplementasikan template yang mengumpulkan sandi pengguna, mulailah dengan membuat InputCallback untuk memproses dan memvalidasi input pengguna:

Kotlin

val callback = object : InputCallback {
    override fun onInputSubmitted(text: String) {
        // You will receive this callback when the user presses enter on the keyboard.
    }

    override fun onInputTextChanged(text: String) {
        // You will receive this callback as the user is typing. The update frequency is determined by the host.
    }
}

Java

InputCallback callback = new InputCallback() {
    @Override
    public void onInputSubmitted(@NonNull String text) {
        // You will receive this callback when the user presses enter on the keyboard.
    }

    @Override
    public void onInputTextChanged(@NonNull String text) {
        // You will receive this callback as the user is typing. The update frequency is determined by the host.
    }
};

InputCallback diperlukan untuk InputSignInMethod Builder.

Kotlin

val passwordInput = InputSignInMethod.Builder(callback)
    .setHint("Password")
    .setInputType(InputSignInMethod.INPUT_TYPE_PASSWORD)
    ...
    .build()

Java

InputSignInMethod passwordInput = new InputSignInMethod.Builder(callback)
    .setHint("Password")
    .setInputType(InputSignInMethod.INPUT_TYPE_PASSWORD)
    ...
    .build();

Terakhir, gunakan InputSignInMethod baru untuk membuat SignInTemplate.

Kotlin

SignInTemplate.Builder(passwordInput)
    .setTitle("Sign in with username and password")
    .setInstructions("Enter your password")
    .setHeaderAction(Action.BACK)
    ...
    .build()

Java

new SignInTemplate.Builder(passwordInput)
    .setTitle("Sign in with username and password")
    .setInstructions("Enter your password")
    .setHeaderAction(Action.BACK)
    ...
    .build();

Menambahkan varian string teks

Ukuran layar mobil yang berbeda dapat menampilkan jumlah teks yang berbeda. Dengan Aplikasi Mobil API level 2 dan yang lebih tinggi, Anda dapat menentukan beberapa varian string teks yang paling sesuai dengan layar. Untuk melihat tempat varian teks diterima, cari template dan komponen yang menggunakan CarText.

Anda dapat menambahkan varian string teks ke CarText dengan metode CarText.Builder.addVariant():

Kotlin

val itemTitle = CarText.Builder("This is a very long string")
    .addVariant("Shorter string")
    ...
    .build()

Java

CarText itemTitle = new CarText.Builder("This is a very long string")
    .addVariant("Shorter string")
    ...
    .build();

Anda kemudian dapat menggunakan CarText ini, misalnya, sebagai teks utama dari GridItem.

Kotlin

GridItem.Builder()
    .addTitle(itemTitle)
    ...
    .build()

Java

new GridItem.Builder()
    .addTitle(itemTitle)
    ...
    build();

Tambahkan string secara berurutan dari yang paling disukai ke yang paling tidak disukai, misalnya, dari terpanjang ke terpendek. Host akan memilih string panjang yang sesuai, bergantung pada jumlah ruang yang tersedia di layar mobil.

Siklus Proses CarAppService, Sesi, dan Layar

Class Session dan Screen mengimplementasikan antarmuka LifecycleOwner. Saat pengguna berinteraksi dengan aplikasi, callback siklus proses objek Session dan Screen Anda akan dipanggil, seperti yang dijelaskan dalam diagram berikut.

Siklus proses CarAppService dan Sesi

Gambar 1. Siklus proses Session.

Untuk detail selengkapnya, lihat dokumentasi metode Session.getLifecycle.

Siklus proses Layar

Gambar 2. Siklus proses Screen.

Untuk detail selengkapnya, lihat dokumentasi Screen.getLifecycle.

Library Pengujian

Library Pengujian Android untuk Mobil memberikan class tambahan yang dapat Anda gunakan untuk memvalidasi perilaku aplikasi dalam lingkungan pengujian. Misalnya, SessionController memungkinkan Anda melakukan simulasi koneksi ke host dan memastikan Screen dan Template yang tepat telah dibuat dan ditampilkan.

Lihat Contoh untuk contoh penggunaan.

Melaporkan masalah Library Aplikasi Android untuk Mobil

Jika Anda menemukan masalah pada library, laporkan menggunakan Issue Tracker Google. Pastikan untuk mengisi semua informasi yang diminta pada template masalah.

Melaporkan masalah baru

Sebelum mengajukan masalah baru, periksa apakah masalah tersebut sudah tercantum dalam catatan rilis library atau dilaporkan dalam daftar masalah. Anda bisa berlangganan dan memberi suara pada masalah dengan mengklik bintang untuk masalah di tracker. Untuk mengetahui informasi selengkapnya, lihat Berlangganan pada topik Masalah.