Halaman ini menjelaskan cara membuat notifikasi untuk jam tangan. Halaman ini juga menjelaskan cara menyediakan konten tambahan bagi setiap notifikasi yang dihubungkan ke jam tangan dari ponsel pendamping.
Notifikasi di jam tangan memiliki struktur yang sama dengan notifikasi di ponsel. Selain itu, untuk memberikan pengalaman terbaik kepada pengguna, Wear OS by Google menyediakan API untuk menambahkan fitur spesifik wearable ke notifikasi.
Saat dikirimkan dari aplikasi, setiap notifikasi akan muncul sebagai kartu pada Aliran Notifikasi.

Gambar 1. Notifikasi yang sama ditampilkan di ponsel dan jam tangan.
Baik jam tangan maupun ponsel dapat menjadi sumber notifikasi. Gunakan class
NotificationCompat.Builder
untuk membuat notifikasi untuk perangkat wearable. Ketika Anda membuat notifikasi dengan class ini, sistem akan
menangani tampilan notifikasi dengan benar.
Catatan: Notifikasi yang menggunakan RemoteViews
tidak memiliki tata letak kustom dan perangkat wearable hanya menampilkan teks dan ikon. Namun, Anda dapat
membuat notifikasi
kustom yang menggunakan tata letak kartu kustom dengan membuat aplikasi
wearable yang berjalan pada jam tangan.
Biasanya, semua notifikasi akan dihubungkan dari ponsel ke jam tangan. Namun, notifikasi tidak dihubungkan pada beberapa kasus berikut:
-
Notifikasi "Khusus lokal" disetel menggunakan
Notification.Builder.setLocalOnly(boolean)
. -
Notifikasi
yang sedang berjalan disetel menggunakan
Notification.Builder.setOngoing(boolean)
atauNotification.FLAG_ONGOING_EVENT
. -
Notifikasi yang tidak dapat dihapus disetel menggunakan
Notification.FLAG_NO_CLEAR
. - Notifikasi di mana aplikasi wearable pasangannya telah menonaktifkan penghubungan notifikasi.
Lihat referensi terkait berikut:
Mengimpor class yang diperlukan
Untuk mengimpor paket yang diperlukan, tambahkan baris ini ke file build.gradle
Anda:
implementation 'androidx.core:core:1.2.0'
Sekarang, setelah proyek memiliki akses ke paket yang diperlukan, impor class yang diperlukan dari support library:
Kotlin
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationCompat.WearableExtender
Java
import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import androidx.core.app.NotificationCompat.WearableExtender;
Membuat notifikasi menggunakan builder notifikasi
Jetpack Core library memungkinkan Anda membuat notifikasi menggunakan fitur notifikasi terbaru, seperti ikon dan tombol tindakan, yang tetap kompatibel dengan Android 1.6 (API level 4) dan yang lebih tinggi.
Catatan: Mulai dari Android 8.0 (API level 26), Anda harus membuat saluran notifikasi untuk setiap jenis notifikasi yang ingin ditampilkan.
Untuk membuat notifikasi:
-
Buat instance
NotificationCompat.Builder
.Kotlin
val notificationId = 1 // The channel ID of the notification. val id = "my_channel_01" // Build intent for notification content val viewPendingIntent = Intent(this, ViewEventActivity::class.java).let { viewIntent -> viewIntent.putExtra(EXTRA_EVENT_ID, eventId) PendingIntent.getActivity(this, 0, viewIntent, 0) } // Notification channel ID is ignored for Android 7.1.1 // (API level 25) and lower. val notificationBuilder = NotificationCompat.Builder(this, id) .setSmallIcon(R.drawable.ic_event) .setContentTitle(eventTitle) .setContentText(eventLocation) .setContentIntent(viewPendingIntent)
Java
int notificationId = 001; // The channel ID of the notification. String id = "my_channel_01"; // Build intent for notification content Intent viewIntent = new Intent(this, ViewEventActivity.class); viewIntent.putExtra(EXTRA_EVENT_ID, eventId); PendingIntent viewPendingIntent = PendingIntent.getActivity(this, 0, viewIntent, 0); // Notification channel ID is ignored for Android 7.1.1 // (API level 25) and lower. NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, id) .setSmallIcon(R.drawable.ic_event) .setContentTitle(eventTitle) .setContentText(eventLocation) .setContentIntent(viewPendingIntent);
-
Kirim notifikasi dengan meneruskan objek Notification menggunakan ID notifikasi ke
notify()
.Kotlin
NotificationManagerCompat.from(this).apply { notify(notificationId, notificationBuilder.build()) }
Java
// Get an instance of the NotificationManager service NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); // Issue the notification with notification manager. notificationManager.notify(notificationId, notificationBuilder.build());
Saat notifikasi ini muncul di ponsel, pengguna dapat memanggil PendingIntent
yang ditentukan oleh metode
setContentIntent()
dengan menyentuh notifikasi. Ketika muncul di perangkat wearable, notifikasi ini muncul dalam aliran notifikasi. Untuk notifikasi terhubung, pengguna dapat mengklik notifikasi guna melihat notifikasi yang diperluas dan memicu tindakan yang ditentukan, seperti tindakan buka. Biasanya, tindakan ini akan membuka
Aktivitas
pada aplikasi ponsel Anda.
Membuat notifikasi yang diperluas
Notifikasi yang diperluas menyediakan tindakan dan konten tambahan yang signifikan untuk setiap notifikasi. Saat Anda menetapkan tindakan dan halaman konten tambahan bagi notifikasi, semuanya akan tersedia bagi pengguna dalam notifikasi yang diperluas. Setiap notifikasi yang diperluas mengikuti Desain Material untuk Wear OS sehingga pengguna mendapatkan pengalaman seperti aplikasi.
Jika tindakan pertama dalam notifikasi yang diperluas memiliki RemoteInput
(misalnya, tindakan Balas), pilihan yang Anda tetapkan dengan
setChoices()
akan muncul dalam notifikasi yang diperluas di bawah tindakan pertama.
Pengguna dapat melihat notifikasi yang diperluas dengan mengetuk notifikasi ketika salah satu dari persyaratan berikut benar:
- Notifikasi dibuat oleh aplikasi pada ponsel yang tersambung, serta dihubungkan ke Wear.
-
Notifikasi tidak memiliki
contentIntent
.
Catatan:
Warna latar belakang khusus aplikasi yang ditetapkan untuk notifikasi dengan metode
setColor()
hanya ditampilkan ketika Anda memperluas notifikasi.
Praktik terbaik untuk notifikasi yang diperluas
Untuk menentukan kapan harus menggunakan notifikasi yang diperluas, ikuti panduan berikut:
- Semua notifikasi yang dihubungkan dari ponsel yang tersambung ke perangkat Wear akan menggunakan notifikasi yang diperluas.
-
Jika notifikasi dibuat oleh aplikasi yang berjalan secara lokal di Wear, Anda harus
mengatur agar target
sentuh notifikasi Anda meluncurkan objek Notifikasi dengan ID notifikasi
dalam aplikasi dengan memanggil
setContentIntent()
. Sebaiknya, jangan gunakan notifikasi yang diperluas untuk notifikasi yang dihasilkan oleh aplikasi yang berjalan secara lokal di Wear.
Menambahkan notifikasi yang diperluas
Notifikasi yang diperluas memungkinkan Anda menyertakan tindakan dan konten tambahan bagi notifikasi. Anda dapat menentukan tingkat detail yang disediakan oleh notifikasi aplikasi. Namun, bijaklah dengan banyaknya detail yang disertakan dalam notifikasi.

Menambahkan konten tambahan
Untuk menampilkan teks tambahan dalam notifikasi yang diperluas, gunakan
BigTextStyle
.
Untuk menambahkan gambar dalam notifikasi yang diperluas, Anda dapat menggunakan
BigPictureStyle
. Jika Anda ingin menambahkan lebih dari satu gambar dalam notifikasi yang diperluas, gunakan metode
addPage()
beserta BigPictureStyle
.
Tindakan utama
Notifikasi yang diperluas akan memuat satu tindakan utama, yaitu tindakan pertama dalam notifikasi kecuali tindakan lainnya ditetapkan menggunakan
setContentAction()
.
Tindakan tambahan
Untuk menentukan tindakan tambahan, gunakan
addAction()
atau
addActions()
.
Panel tindakan pada notifikasi yang diperluas berisi semua tindakan yang tersedia.
Menambahkan tindakan notifikasi
Selain tindakan konten utama yang ditentukan oleh
setContentIntent()
, Anda dapat menambahkan tindakan lain dengan meneruskan PendingIntent
ke metode
addAction()
.
Misalnya, kode berikut menunjukkan jenis notifikasi yang sama seperti di atas, tetapi menambahkan tindakan untuk melihat lokasi peristiwa pada peta.
Kotlin
// Build an intent for an action to view a map val mapIntent = Intent(Intent.ACTION_VIEW) // The channel ID of the notification. val id = "my_channel_01" val mapPendingIntent = Intent(Intent.ACTION_VIEW).let { mapIntent -> mapIntent.data = Uri.parse("geo:0,0?q=" + Uri.encode(location)) PendingIntent.getActivity(this, 0, mapIntent, 0) } val notificationBuilder = NotificationCompat.Builder(this, id) .setSmallIcon(R.drawable.ic_event) .setContentTitle(eventTitle) .setContentText(eventLocation) .setContentIntent(viewPendingIntent) .addAction(R.drawable.ic_map, getString(R.string.map), mapPendingIntent)
Java
// Build an intent for an action to view a map Intent mapIntent = new Intent(Intent.ACTION_VIEW); // The channel ID of the notification. String id = "my_channel_01"; Uri geoUri = Uri.parse("geo:0,0?q=" + Uri.encode(location)); mapIntent.setData(geoUri); PendingIntent mapPendingIntent = PendingIntent.getActivity(this, 0, mapIntent, 0); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, id) .setSmallIcon(R.drawable.ic_event) .setContentTitle(eventTitle) .setContentText(eventLocation) .setContentIntent(viewPendingIntent) .addAction(R.drawable.ic_map, getString(R.string.map), mapPendingIntent);
Pada ponsel, tindakan ini muncul sebagai tombol tambahan yang tersemat pada notifikasi. Pada perangkat wearable, tindakan muncul dalam notifikasi yang diperluas setelah teks konten. Ketika pengguna mengetuk tindakan, intent yang terkait akan dipanggil pada ponsel.
Tips: Jika notifikasi menyertakan tindakan "Balas" (seperti untuk aplikasi messaging), Anda dapat menyempurnakan perilakunya dengan memungkinkan balasan masukan suara langsung dari perangkat wearable. Untuk informasi selengkapnya, baca Menambahkan Masukan Suara sebagai tindakan notifikasi.
Menambahkan tindakan inline

Tindakan inline memungkinkan pengguna mengambil tindakan pada notifikasi dari kartu aliran notifikasi. Di Wear, tindakan inline muncul sebagai tombol tambahan yang ditampilkan di bagian bawah notifikasi.
Tindakan inline bersifat opsional, tetapi direkomendasikan ketika pengguna kemungkinan akan melakukan sesuatu pada notifikasi setelah melihat kontennya dalam kartu aliran notifikasi (tanpa harus membuka notifikasi yang diperluas). Contoh kasus penggunaan yang tepat untuk tindakan inline pada notifikasi termasuk membalas pesan teks, menghentikan aktivitas kebugaran, serta mengarsipkan pesan email.
Satu notifikasi hanya dapat menyediakan satu tindakan inline. Untuk menampilkan tindakan inline sebagai tombol tambahan dalam notifikasi, setel metode
setHintDisplayActionInline()
ke true. Ketika pengguna mengetuk tindakan inline, sistem akan memanggil intent yang telah ditetapkan dalam tindakan notifikasi.
Cuplikan kode berikut menambahkan petunjuk untuk menampilkan tindakan inline, dan menggunakan metode
addAction
untuk menambahkan tindakan inline pada notifikasi.
Kotlin
//Wear OS requires a hint to display the reply action inline. val actionExtender = NotificationCompat.Action.WearableExtender() .setHintLaunchesActivity(true) .setHintDisplayActionInline(true) wearableExtender.addAction(actionBuilder.extend(actionExtender).build())
Java
//Wear OS requires a hint to display the reply action inline. Action.WearableExtender actionExtender = new Action.WearableExtender() .setHintLaunchesActivity(true) .setHintDisplayActionInline(true); wearableExtender.addAction(actionBuilder.extend(actionExtender).build());
Menambahkan fitur spesifik wearable ke notifikasi
Jika Anda perlu menambahkan fitur khusus wearable ke notifikasi, seperti menyembunyikan ikon aplikasi dari notifikasi wearable atau mengizinkan pengguna mendikte respons teks dengan masukan suara, Anda dapat menggunakan class
NotificationCompat.WearableExtender
untuk menentukan opsi.
Untuk menggunakan API ini:
-
Buat instance
WearableExtender
, yang menyetel opsi khusus wearable untuk notifikasi. -
Buat instance
NotificationCompat.Builder
, yang menyetel properti yang diinginkan untuk notifikasi seperti yang dijelaskan sebelumnya dalam tutorial ini. -
Panggil
extend()
pada notifikasi dan teruskanWearableExtender
. Cara ini akan menerapkan opsi wearable pada notifikasi. -
Panggil
build()
untuk membuat notifikasi.
Catatan: Jika Anda menggunakan NotificationManager
framework, beberapa fitur dari
NotificationCompat.WearableExtender
tidak berfungsi, jadi pastikan untuk menggunakan
NotificationCompat
.
Anda dapat menyinkronkan penutupan (pembatalan) notifikasi di seluruh perangkat pengguna. Untuk mengaktifkan sinkronisasi penutupan, gunakan metode
setDismissalId()
. Untuk setiap notifikasi, teruskan ID yang unik secara global sebagai string ketika Anda memanggil metode
setDismissalId()
. Saat notifikasi ditutup, semua notifikasi lain dengan ID penutupan yang sama akan ditutup di jam tangan dan ponsel pendamping. Untuk mengambil ID penutupan, gunakan
getDismissalId()
.
Catatan: Metode
setBackground()
tidak didukung di Wear 2.0. Anda dapat menggunakan
NotificationCompat.BigPictureStyle
untuk notifikasi yang menyertakan gambar.
Metode
setHintHideIcon()
juga tidak didukung di Wear 2.0.
Menetapkan tindakan khusus wearable
Jika Anda ingin membedakan tindakan yang tersedia di perangkat wearable dengan yang ada di ponsel, gunakan
WearableExtender.addAction()
. Setelah menambahkan tindakan dengan metode ini, perangkat wearable tidak akan menampilkan tindakan lain yang ditambahkan dengan
NotificationCompat.Builder.addAction()
. Tindakan yang ditambahkan dengan
WearableExtender.addAction()
hanya muncul di perangkat wearable dan tidak akan muncul di ponsel.
Menambahkan masukan suara sebagai tindakan notifikasi
Voice action adalah bagian penting dari pengalaman wearable. Untuk membuat tindakan yang mendukung masukan suara, buat instance
RemoteInput.Builder
yang dapat Anda tambahkan ke tindakan notifikasi.
Konstruktor class ini menerima string yang digunakan sistem sebagai kunci untuk masukan suara, yang nantinya akan digunakan untuk memperoleh teks masukan dalam aplikasi ponsel.

Misalnya, berikut cara untuk membuat objek
RemoteInput
yang menyediakan label kustom untuk permintaan masukan suara:
Kotlin
// Key for the string that's delivered in the action's intent const val EXTRA_VOICE_REPLY = "extra_voice_reply" ... val remoteInput = resources.getString(R.string.reply_label).let { replyLabel -> RemoteInput.Builder(EXTRA_VOICE_REPLY) .setLabel(replyLabel) .build() }
Java
// Key for the string that's delivered in the action's intent private static final String EXTRA_VOICE_REPLY = "extra_voice_reply"; String replyLabel = getResources().getString(R.string.reply_label); RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY) .setLabel(replyLabel) .build();
Menambahkan respons teks yang telah ditentukan

Selain memungkinkan masukan suara, Anda juga dapat menyediakan hingga lima respons teks yang dapat dipilih pengguna untuk balasan cepat. Panggil
setChoices()
dan teruskan array string.
Misalnya, Anda dapat menentukan beberapa respons dalam satu array resource:
res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="reply_choices"> <item>Yes</item> <item>No</item> <item>Maybe</item> </string-array> </resources>
Kemudian, perluas array string dan tambahkan ke
RemoteInput
:
Kotlin
// Key for the string that's delivered in the action's intent const val EXTRA_VOICE_REPLY = "extra_voice_reply" ... val remoteInput = resources.getString(R.string.reply_label).let { replyLabel -> resources.getStringArray(R.array.reply_choices).let { replyChoices -> RemoteInput.Builder(EXTRA_VOICE_REPLY) .setLabel(replyLabel) .setChoices(replyChoices) .build() } }
Java
public static final String EXTRA_VOICE_REPLY = "extra_voice_reply"; ... String replyLabel = getResources().getString(R.string.reply_label); String[] replyChoices = getResources().getStringArray(R.array.reply_choices); RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY) .setLabel(replyLabel) .setChoices(replyChoices) .build();
Menerima masukan suara sebagai string
Untuk menerima pesan yang ditranskripsikan pengguna dalam aktivitas dideklarasikan dalam intent tindakan balas, panggil
getResultsFromIntent()
, yang meneruskan intent tindakan "Balas".
Metode ini menampilkan Bundle
berisi respons teks.
Selanjutnya, Anda dapat membuat kueri Bundle
untuk mendapatkan respons.
Catatan: Jangan gunakan Intent.getExtras()
untuk mendapatkan hasil suara, karena masukan suara disimpan sebagai ClipData
. Metode
getResultsFromIntent()
memberikan cara mudah untuk menerima urutan karakter tanpa harus memproses ClipData
sendiri.
Kode berikut menunjukkan metode yang menerima intent dan menampilkan respons suara, dan direferensikan dengan kunci EXTRA_VOICE_REPLY
yang digunakan dalam contoh sebelumnya:
Kotlin
/** * Obtain the intent that started this activity by calling * Activity.getIntent() and pass it into this method to * get the associated voice input string. */ private fun getMessageText(intent: Intent): CharSequence? = RemoteInput.getResultsFromIntent(intent)?.run { getCharSequence(EXTRA_VOICE_REPLY) }
Java
/** * Obtain the intent that started this activity by calling * Activity.getIntent() and pass it into this method to * get the associated voice input string. */ private CharSequence getMessageText(Intent intent) { Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); if (remoteInput != null) { return remoteInput.getCharSequence(EXTRA_VOICE_REPLY); } return null; }
Kotlin
// Create an intent for the reply action val actionPendingIntent = Intent(this, ActionActivity::class.java).let { actionIntent -> PendingIntent.getActivity(this, 0, actionIntent, PendingIntent.FLAG_UPDATE_CURRENT) } // Create the action val action = NotificationCompat.Action.Builder( R.drawable.ic_action, getString(R.string.label), actionPendingIntent ).build() // Build the notification and add the action via WearableExtender var notification = NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_message) .setContentTitle(getString(R.string.title)) .setContentText(getString(R.string.content)) .extend(NotificationCompat.WearableExtender().addAction(action)) .build()
Java
// Create an intent for the reply action Intent actionIntent = new Intent(this, ActionActivity.class); PendingIntent actionPendingIntent = PendingIntent.getActivity(this, 0, actionIntent, PendingIntent.FLAG_UPDATE_CURRENT); // Create the action NotificationCompat.Action action = new NotificationCompat.Action.Builder(R.drawable.ic_action, getString(R.string.label), actionPendingIntent) .build(); // Build the notification and add the action via WearableExtender Notification notification = new NotificationCompat.Builder(context) .setSmallIcon(R.drawable.ic_message) .setContentTitle(getString(R.string.title)) .setContentText(getString(R.string.content)) .extend(new WearableExtender().addAction(action)) .build();
Meluncurkan notifikasi dari aplikasi wearable mandiri
Cara membuat notifikasi dari aplikasi jam tangan mandiri sama dengan cara membuat notifikasi
terhubung. Notifikasi yang berasal dari aplikasi Wear mandiri tampak mirip dengan notifikasi terhubung, tetapi perilakunya sedikit berbeda. Jika tidak ada
contentIntent
yang disetel atau jika notifikasi dihubungkan dari ponsel yang tersambung, maka mengetuk notifikasi akan membuka notifikasi yang diperluas.
Sementara itu, jika notifikasi berasal dari aplikasi jam tangan mandiri, mengetuknya akan mengaktifkan contentIntent
untuk membuka aplikasi Wear. Untuk mempelajari cara membuat notifikasi dari aplikasi mandiri dan meniru perilaku notifikasi yang diperluas, lihat contoh
Notifikasi Wear.
Secara default, notifikasi akan dihubungkan dari aplikasi di ponsel pendamping ke jam tangan yang tersambung. Jika Anda membuat aplikasi jam tangan mandiri dan memiliki aplikasi ponsel pendamping, aplikasi mungkin akan membuat notifikasi duplikat. Untuk informasi tentang menangani masalah notifikasi duplikat, lihat Mode Bridge untuk Notifikasi.