Home | History | Annotate | Download | only in features
      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