1 page.title=Pemberitahuan 2 page.tags=pemberitahuan 3 helpoutsWidget=true 4 page.image=/preview/images/notifications-card.png 5 6 trainingnavtop=true 7 8 @jd:body 9 10 <div id="qv-wrapper"> 11 <div id="qv"> 12 13 <!-- table of contents --> 14 <h2>Dokumen ini berisi</h2> 15 <ol> 16 <li><a href="#direct">Balasan Langsung</a></li> 17 <li><a href="#bundle">Bundel Pemberitahuan</a></li> 18 <li><a href="#custom">Tampilan Khusus</a></li> 19 <li><a href="#style">Gaya Pesan</a></li> 20 </ol> 21 22 </div> 23 </div> 24 25 <p>Android N memperkenalkan beberapa API baru yang memungkinkan aplikasi untuk mengeposkan 26 pemberitahuan yang sangat mudah terlihat dan interaktif.</p> 27 28 <p>Android N menambahkan API pemberitahuan{@link android.support.v4.app.RemoteInput} 29 yang ada untuk mendukung balasan inline pada handset. Fitur ini memungkinkan pengguna 30 merespons dengan cepat dari bayangan pemberitahuan tanpa mengunjungi aplikasi Anda.</p> 31 32 <p> 33 Android N juga memungkinkan Anda menggabungkan pemberitahuan yang serupa agar 34 muncul sebagai satu pemberitahuan. Untuk memungkinkan hal ini, Android N menggunakan metode {@link 35 android.support.v4.app.NotificationCompat.Builder#setGroup 36 NotificationCompat.Builder.setGroup()} yang sudah ada. Pengguna bisa memperluas setiap 37 pemberitahuan, dan melakukan tindakan seperti membalas dan menutup setiap 38 pemberitahuan, satu per satu dari bayangan pemberitahuan. 39 </p> 40 41 <p>Terakhir, Android N juga menambahkan API baru yang memungkinkan Anda untuk memanfaatkan dekorasi 42 sistem dalam tampilan pemberitahuan yang disesuaikan untuk aplikasi Anda. API ini membantu 43 memastikan semua tampilan pemberitahuan sama-sama menggunakan penyajian yang konsisten dengan 44 template standar.</p> 45 46 <p>Dokumen ini menyoroti beberapa perubahan penting yang harus Anda 47 perhitungkan saat menggunakan fitur pemberitahuan baru dalam aplikasi Anda.</p> 48 49 <h2 id="direct">Balasan Langsung</h2> 50 51 <p>Dengan fitur Balasan Langsung di Android N, pengguna bisa dengan cepat 52 merespons pesan teks atau memperbarui daftar tugas secara langsung dalam antarmuka 53 pemberitahuan. Pada perangkat genggam, tindakan balasan inline muncul sebagai tombol tambahan 54 yang dilampirkan pada pemberitahuan. Bila pengguna membalas lewat keyboard, sistem akan melampirkan 55 respons teks ke intent 56 yang telah Anda tetapkan untuk tindakan pemberitahuan dan mengirimkan intent ke 57 aplikasi perangkat genggam Anda. 58 59 60 <img id="fig-reply-button" src="{@docRoot}preview/images/inline-reply.png" srcset="{@docRoot}preview/images/inline-reply.png 1x, 61 {@docRoot}preview/images/inline-reply_2x.png 2x" width="400"> 62 <p class="img-caption"> 63 <strong>Gambar 1.</strong> Android N menambahkan tombol tindakan <strong>Reply</strong>. 64 65 </p> 66 67 <h3>Menambahkan tindakan balasan inline</h3> 68 69 <p>Untuk membuat tindakan pemberitahuan yang mendukung balasan langsung: 70 </p> 71 72 <ol> 73 <li>Buat instance {@link android.support.v4.app.RemoteInput.Builder} 74 yang bisa Anda tambahkan ke tindakan 75 pemberitahuan. Konstruktor kelas ini akan menerima string bahwa sistem menggunakannya sebagai kunci 76 untuk masukan teks. Kemudian, aplikasi perangkat genggam Anda akan menggunakan kunci itu untuk mengambil teks 77 masukan tersebut. 78 79 <pre> 80 // Key for the string that's delivered in the action's intent. 81 private static final String KEY_TEXT_REPLY = "key_text_reply"; 82 String replyLabel = getResources().getString(R.string.reply_label); 83 RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) 84 .setLabel(replyLabel) 85 .build(); 86 </pre> 87 </li> 88 <li>Lampirkan objek {@link android.support.v4.app.RemoteInput} 89 pada tindakan dengan menggunakan <code>addRemoteInput()</code>. 90 91 <pre> 92 // Create the reply action and add the remote input. 93 Notification.Action action = 94 new Notification.Action.Builder(R.drawable.ic_reply_icon, 95 getString(R.string.label), replyPendingIntent) 96 .addRemoteInput(remoteInput) 97 .build(); 98 </pre> 99 </li> 100 101 <li>Terapkan tindakan pada pemberitahuan dan keluarkan pemberitahuan. 102 103 <pre> 104 // Build the notification and add the action. 105 Notification newMessageNotification = 106 new Notification.Builder(mContext) 107 .setSmallIcon(R.drawable.ic_message) 108 .setContentTitle(getString(R.string.title)) 109 .setContentText(getString(R.string.content)) 110 .addAction(action)) 111 .build(); 112 113 // Issue the notification. 114 NotificationManager notificationManager = 115 NotificationManager.from(mContext); 116 notificationManager.notify(notificationId, newMessageNotification); 117 118 </pre> 119 </li> 120 121 </ol> 122 123 124 <p> Sistem akan meminta pengguna memasukkan respons bila mereka memicu 125 tindakan pemberitahuan. </p> 126 127 <img id="fig-user-input" src="{@docRoot}preview/images/inline-type-reply.png" srcset="{@docRoot}preview/images/inline-type-reply.png 1x, 128 {@docRoot}preview/images/inline-type-reply_2x.png 2x" width="300"> 129 <p class="img-caption"> 130 <strong>Gambar 2.</strong> Pengguna memasukkan teks dari bayangan pemberitahuan. 131 </p> 132 133 <h3> 134 Mengambil masukan pengguna dari balasan inline 135 </h3> 136 137 <p> 138 Untuk menerima masukan pengguna dari antarmuka pemberitahuan ke aktivitas yang Anda 139 deklarasikan dalam intent tindakan balasan: 140 </p> 141 142 <ol> 143 <li>Panggil {@link android.support.v4.app.RemoteInput#getResultsFromIntent 144 getResultsFromIntent()} dengan meneruskan intent tindakan pemberitahuan sebagai 145 parameter masukan. Metode ini mengembalikan {@link android.os.Bundle} yang 146 berisi respons teks. 147 148 <pre> 149 Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); 150 </pre> 151 </li> 152 153 <li>Lakukan kueri pada bundel menggunakan kunci hasil (diberikan ke konstruktor {@link 154 android.support.v4.app.RemoteInput.Builder}). Anda bisa menyelesaikan 155 proses ini dan mengambil teks masukan dengan membuat sebuah metode, seperti dalam 156 cuplikan kode berikut: 157 158 <pre> 159 // Obtain the intent that started this activity by calling 160 // Activity.getIntent() and pass it into this method to 161 // get the associated string. 162 163 private CharSequence getMessageText(Intent intent) { 164 Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); 165 if (remoteInput != null) { 166 return remoteInput.getCharSequence(KEY_TEXT_REPLY); 167 } 168 return null; 169 } 170 </pre> 171 </li> 172 173 <li>Kompilasilah dan keluarkan pemberitahuan lain, menggunakan ID pemberitahuan yang sama dengan 174 yang Anda berikan untuk pemberitahuan sebelumnya. Indikator kemajuan 175 menghilang dari antarmuka pemberitahuan untuk memberi tahu pengguna mengenai balasan 176 yang berhasil. Saat menangani pemberitahuan baru ini, gunakan konteks yang 177 diteruskan ke metode {@code onReceive()} penerima. 178 179 <pre> 180 // Build a new notification, which informs the user that the system 181 // handled their interaction with the previous notification. 182 Notification repliedNotification = 183 new Notification.Builder(context) 184 .setSmallIcon(R.drawable.ic_message) 185 .setContentText(getString(R.string.replied)) 186 .build(); 187 188 // Issue the new notification. 189 NotificationManager notificationManager = 190 NotificationManager.from(context); 191 notificationManager.notify(notificationId, repliedNotification); 192 </pre> 193 </li> 194 </ol> 195 196 <p> 197 Untuk aplikasi interaktif, seperti chat, akan berguna bila menyertakan 198 konteks tambahan saat menangani teks yang diambil. Misalnya, aplikasi ini bisa menampilkan 199 beberapa baris riwayat chat sekaligus. Bila pengguna merespons melalui {@link 200 android.support.v4.app.RemoteInput}, Anda bisa memperbarui riwayat balasan 201 menggunakan metode {@code setRemoteInputHistory()}. 202 </p> 203 204 <p> 205 Pemberitahuan harus diperbarui atau dibatalkan setelah aplikasi 206 menerima masukan jarak jauh. Bila pengguna membalas ke pembaruan jarak jauh 207 menggunakan Balasan Langsung, 208 jangan batalkan pemberitahuan. Melainkan, perbarui pemberitahuan untuk menampilkan balasan pengguna. 209 Untuk pemberitahuan yang menggunakan {@code MessagingStyle}, Anda harus menambahkan 210 balasannya sebagai pesan terbaru. Saat menggunakan template lain, Anda bisa 211 menambahkan balasan pengguna ke riwayat masukan jarak jauh. 212 </p> 213 214 <h2 id="bundle">Bundel Pemberitahuan</h2> 215 216 <p>Android N membekali pengembang dengan sebuah cara baru untuk menyatakan 217 antrean pemberitahuan: <i>bundel pemberitahuan</i>. Ini mirip dengan fitur 218 <a href="{@docRoot}training/wearables/notifications/stacks.html">Tumpukan 219 Pemberitahuan</a> dalam Android Wear. Misalnya, jika aplikasi Anda membuat pemberitahuan 220 untuk pesan yang diterima, bila lebih dari satu pesan diterima, pemberitahuan tersebut akan 221 dibundel sebagai satu grup. Anda bisa 222 menggunakan metode {@link android.support.v4.app.NotificationCompat.Builder#setGroup 223 Builder.setGroup()} yang ada untuk membundel pemberitahuan yang sama.</p> 224 225 <p> 226 Grup pemberitahuan menerapkan hierarki pada pemberitahuan yang ada di dalamnya. 227 Di bagian teratas hierarki adalah pemberitahuan induk yang menampilkan informasi 228 rangkuman untuk grup tersebut. Pengguna secara bertahap bisa 229 memperbesar grup pemberitahuan, dan sistem akan menampilkan informasi lebih banyak saat 230 pengguna menggali lebih dalam. Bila pengguna memperbesar bundel, sistem akan memperlihatkan informasi lebih 231 banyak untuk semua pemberitahuan anak; bila pengguna 232 memperbesar salah satu pemberitahuan tersebut, sistem akan memperlihatkan seluruh isinya. 233 </p> 234 235 <img id="fig-bundles" src="{@docRoot}preview/images/bundles.png" srcset="{@docRoot}preview/images/bundles.png 1x, 236 {@docRoot}preview/images/bundles_2x.png 2x" width="300"> 237 <p class="img-caption"> 238 <strong>Gambar 3.</strong> Pengguna secara bertahap bisa memperluas grup 239 pemberitahuan. 240 </p> 241 242 <p class="note"> 243 <strong>Catatan:</strong> Jika aplikasi yang sama mengirim empat atau beberapa pemberitahuan 244 dan tidak menetapkan pengelompokan, 245 sistem secara otomatis akan mengelompokannya. 246 </p> 247 248 <p>Untuk mengetahui cara menambahkan pemberitahuan ke grup, lihat 249 <a href="{@docRoot}training/wearables/notifications/stacks.html#AddGroup">Menambahkan 250 Setiap Pemberitahuan ke Grup</a>.</p> 251 252 253 <h3 id="best-practices">Praktik terbaik untuk bundel pemberitahuan</h3> 254 <p>Bagian ini memberikan panduan tentang kapan menggunakan grup pemberitahuan sebagai ganti 255 pemberitahuan {@link android.app.Notification.InboxStyle InboxStyle} 256 yang telah tersedia di 257 platform Android versi sebelumnya.</p> 258 259 <h3>Kapan menggunakan bundel pemberitahuan</h3> 260 261 <p>Anda harus menggunakan grup pemberitahuan hanya jika semua kondisi berikut ini 262 bernilai benar untuk kasus penggunaan Anda:</p> 263 264 <ul> 265 <li>Pemberitahuan anak adalah pemberitahuan lengkap dan bisa ditampilkan 266 masing-masing tanpa perlu rangkuman grup.</li> 267 <li>Ada untungnya memunculkan pemberitahuan anak satu per satu. Misalnya: 268 269 </li> 270 <ul> 271 <li>Mereka dapat diaplikasikan, dengan tindakan khusus untuk masing-masing anak.</li> 272 <li>Ada lebih banyak informasi pada anak yang ingin dibaca oleh pengguna.</li> 273 </ul> 274 </ul> 275 276 <p>Contoh kasus penggunaan yang baik untuk grup pemberitahuan antara lain: aplikasi perpesanan 277 yang menampilkan daftar pesan yang masuk, atau aplikasi email yang menampilkan daftar email 278 yang diterima.</p> 279 280 <p> 281 Contoh kasus penggunaan saat pemberitahuan tunggal lebih disukai 282 meliputi pesan pribadi dari satu orang, atau representasi daftar dari 283 item teks baris tunggal. Anda bisa menggunakan 284 ({@link android.app.Notification.InboxStyle InboxStyle} atau 285 {@link android.app.Notification.BigTextStyle BigTextStyle}) untuk mencapai 286 hal ini. 287 </p> 288 289 <h3 id ="post">Menampilkan bundel pemberitahuan</h3> 290 291 <p> 292 Aplikasi ini harus selalu mengeposkan rangkuman grup, sekalipun grup hanya berisi 293 satu anak. Sistem akan menyembunyikan rangkuman dan langsung menampilkan 294 pemberitahuan anak jika hanya berisi pemberitahuan tunggal. Hal ini akan memastikan 295 sistem bisa memberikan pengalaman yang konsisten saat pengguna menggeser 296 anak grup. 297 </p> 298 299 <p class="note"> 300 <strong>Catatan:</strong> Versi Android N ini tidak menyembunyikan 301 rangkuman untuk grup pemberitahuan yang berisi satu anak. Fungsionalitas 302 ini akan ditambahkan dalam Android N versi berikutnya. 303 </p> 304 305 <h3>Mengintip pemberitahuan</h3> 306 307 <p>Walaupun sistem biasanya menampilkan pemberitahuan anak sebagai sebuah grup, Anda bisa menyetelnya 308 agar muncul untuk sementara muncul sebagai 309 <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html#Heads-up"> 310 pemberitahuan pendahuluan</a>. Fitur ini khususnya berguna karena memungkinkan 311 akses langsung ke pemberitahuan anak terbaru dan tindakan yang dikaitkan dengannya. 312 </p> 313 314 315 <h3>Kompatibilitas mundur</h3> 316 317 <p> 318 Baik grup pemberitahuan maupun masukan jauh telah menjadi bagian dari {@link 319 android.app.Notification} API sejak Android 5.0 (API level 21) untuk mendukung 320 perangkat Android Wear. Jika Anda sudah membuat pemberitahuan dengan API ini, 321 satu-satunya tindakan yang harus Anda ambil adalah memverifikasi apakah perilaku aplikasi sesuai dengan panduan yang 322 dijelaskan di atas, dan mempertimbangkan implementasi {@code 323 setRemoteInputHistory()}. 324 </p> 325 326 <p> 327 Untuk mendukung kompatibilitas mundur, tersedia API yang sama bersama 328 kelas {@link android.support.v4.app.NotificationCompat} 329 pustaka dukungan, yang memungkinkan Anda untuk membuat pemberitahuan yang bekerja pada versi Android 330 sebelumnya. Pada perangkat genggam dan tablet, pengguna hanya melihat pemberitahuan rangkuman, 331 sehingga aplikasi masih memiliki model inbox atau pemberitahuan sama yang 332 mewakili seluruh materi informasi grup. Karena perangkat Android 333 Wear memungkinkan pengguna melihat semua pemberitahuan anak bahkan pada level platform 334 yang lebih lama, maka Anda harus membangun pemberitahuan anak dengan mengabaikan level 335 API. 336 </p> 337 338 <h2 id="custom"> Tampilan Khusus</h2> 339 <p>Mulai dari Android N, Anda bisa menyesuaikan tampilan pemberitahuan dan 340 tetap mendapatkan dekorasi sistem seperti header pemberitahuan, tindakan, dan 341 layout yang bisa diperluas.</p> 342 343 <p>Untuk mengaktifkan kemampuan ini, Android N menambahkan API berikut untuk menata gaya 344 tampilan khusus Anda:</p> 345 346 <dl> 347 <dt> 348 {@code DecoratedCustomViewStyle()}</dt> 349 <dd> Menata gaya pemberitahuan selain pemberitahuan 350 media.</dd> 351 <dt> 352 {@code DecoratedMediaCustomViewStyle()}</dt> 353 <dd> Menata gaya pemberitahuan media.</dd> 354 </dl> 355 356 <p>Untuk menggunakan API baru ini, panggil metode {@code setStyle()}, dengan meneruskan 357 gaya tampilan khusus yang diinginkan padanya.</p> 358 359 <p>Cuplikan ini menampilkan cara membuat objek pemberitahuan khusus dengan metode 360 {@code DecoratedCustomViewStyle()}.</p> 361 362 <pre> 363 Notification notification = new Notification.Builder() 364 .setSmallIcon(R.drawable.ic_stat_player) 365 .setLargeIcon(albumArtBitmap)) 366 .setCustomContentView(contentView); 367 .setStyle(new Notification.DecoratedCustomViewStyle()) 368 .build(); 369 370 </pre> 371 372 <h2 id="style">Gaya Perpesanan</h2> 373 <p> 374 Android N memperkenalkan API baru untuk menyesuaikan gaya pemberitahuan. 375 Dengan menggunakan kelas <code>MessageStyle</code>, Anda bisa mengubah beberapa 376 label yang ditampilkan pada pemberitahuan, termasuk judul percakapan, 377 pesan tambahan, dan tampilan materi untuk pemberitahuannya. 378 </p> 379 380 <p> 381 Cuplikan kode berikut memperagakan cara menyesuaikan sebuah 382 gaya pemberitahuan menggunakan kelas <code>MessageStyle</code>. 383 </p> 384 385 <pre> 386 Notification notification = new Notification.Builder() 387 .setStyle(new Notification.MessagingStyle("Me") 388 .setConversationTitle("Team lunch") 389 .addMessage("Hi", timestamp1, null) // Pass in null for user. 390 .addMessage("What's up?", timestamp2, "Coworker") 391 .addMessage("Not much", timestamp3, null) 392 .addMessage("How about lunch?", timestamp4, "Coworker")); 393 </pre> 394