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
- Tinjau Pedoman Desain Library Aplikasi Android untuk Mobil.
- Pelajari istilah dan konsep utama yang tercantum dalam bagian ini.
- Biasakan diri Anda dengan UI Sistem Android Auto.
- Tinjau Catatan Rilis.
- Tinjau Contoh.
- [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. InstanceScreen
juga dapat didorong dan muncul ke dan dari Stack layar, yang memastikannya mematuhi pembatasan alur template.- CarAppService
-
CarAppService
adalah classService
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 menggunakanCarAppService.createHostValidator
, dan kemudian menyediakan instanceSession
untuk setiap sambungan menggunakanCarAppService.onCreateSession
. - Sesi
Session
adalah class abstrak yang harus diterapkan dan ditampilkan oleh aplikasi Anda menggunakanCarAppService.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 memintaScreen
awal untuk ditampilkan menggunakan metodeSession.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:
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:
InputSignInMethod
untuk login dengan Nama Pengguna/SandiPinSignInMethod
untuk login dengan kode PIN, pengguna menautkan akun dari ponsel menggunakan PIN yang ditampilkan di head unitProviderSignInMethod
untuk login dengan Penyedia, seperti Login dengan Google
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

Session
.Untuk detail selengkapnya, lihat dokumentasi metode
Session.getLifecycle
.
Siklus proses Layar

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.
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.