Menampilkan Notifikasi

Pada berbagai latihan sebelumnya kita sudah biasa menggunakan class 'Toast' untuk menampilkan pesan ke user. Meskipun class 'Toast' cukup menarik untuk menampilkan pesan ke user, tetapi kemunculannya terlalu cepat hilang. Class 'Toast' hanya muncul beberapa detik saja dan kemudian menghilang. Bila pesan tersebut berisi informasi yang penting, user bisa mudah kehilangan informasi tersebut bila tidak sedang melihat ke layar.

Untuk pesan-pesan dengan informasi yang penting, kita seharusnya menggunakan teknik yang lebih persisten. Dalam hal ini, kita menggunakan class 'NotificationManager' untuk menampilkan pesan yang persisten di bagian ujung atas perangkat, atau yang biasa disebut dengan 'status bar' (atau terkadang disebut dengan 'notification bar'). 

Berikut di bawah ini adalah latihan untuk menampilkan notifikasi pada 'status bar'.

1. Kita buat project baru dan kita beri nama "Notifikasi".

2. Kita tambahkan file class baru dan kita beri nama "NotifikasiView.java" dan pasangannya yaitu file layout tambahan yang kita beri nama "notifikasi.xml".

3. Kita modifikasi dan tambahkan kode berikut pada file "notifikasi.xml":
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Detil notifikasi ada disini..."/>

</LinearLayout>
4. Kita modifikasi dan tambahkan kode berikut pada file "NotifikasiView.java":
package id.co.blogspot.diansano.notifikasi;

import android.app.NotificationManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class NotifikasiView extends AppCompatActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.notifikasi);

/*membuat notification manager service*/
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

/*menghentikan notikasi yang sudah dimulai*/
nm.cancel(getIntent().getExtras().getInt("notificationID"));
}
}
5. Kita modifikasi dan tambahkan kode berikut pada file "AndroidManifest.xml":
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="id.co.blogspot.diansano.notifikasi">

<uses-permission android:name="android.permission.VIBRATE" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".NotifikasiView"
android:label="Detil notifikasi">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>

</manifest>
6. Kita tambahkan kode berikut pada fila layout utama "activity_main.xml":
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="id.co.blogspot.diansano.notifikasi.MainActivity">

<Button
android:id="@+id/btn_displaynotif"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Tampilkan Notifikasi"
android:onClick="onClick"/>
</LinearLayout>
7. Terakhir, kita modifikasi dan tambahkan pada file utama "MainActivity.java" kode berikut:
package id.co.blogspot.diansano.notifikasi;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.NotificationCompat;
import android.view.View;

public class MainActivity extends AppCompatActivity {
int notificationID = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void onClick(View v) {
displayNotification();
}

protected void displayNotification()
{
/*PendingIntent untuk menampilkan activity
bila user memilih notifikasi ini*/
Intent i = new Intent(this, NotifikasiView.class);
i.putExtra("notificationID", notificationID);

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0);
CharSequence judul = "System Alarm";
CharSequence message = "Meeting dengan pelanggan pada jam 3 pm...";

NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

NotificationCompat.Builder notif = new NotificationCompat.Builder(this);
/*NotificationCompat.Action action = new NotificationCompat.Action(
R.drawable.ic_stat_lens, judul, pendingIntent);
notif.addAction(action);*/
notif.setContentTitle(judul);
notif.setSmallIcon(R.drawable.ic_stat_announcement);
notif.setWhen(System.currentTimeMillis());
notif.setContentText(message);
notif.setVibrate(new long[]{100, 250, 100, 500});
notif.setContentIntent(pendingIntent);
//notif.build();
nm.notify(notificationID, notif.build());

}
}

8. Kita jalankan di emulator Android Studio. Hasilnya kurang lebih adalah seperti gambar berikut di bawah ini:
Penjelasan:

Untuk menampilkan notifikasi, kita harus terlebih dahulu membuat object 'Intent' untuk menunjuk ke class "NotifikasiView":
Intent i = new Intent(this, NotifikasiView.class);
i.putExtra("notificationID", notificationID);
Intent ini akan digunakan untuk memanggil activity lain bila user memilih notifikasi dari daftar notifikasi di bagian atas (status bar). Dalam contoh latihan ini, kita menambahkan pasangan data antara 'nama-dan-nilai' ke object 'Intent' sehingga kita bisa menandai ID notifikasi, yang mengidentifikasi notifikasi ke activity yang menjadi target. ID ini akan digunakan untuk menghilangkan notifikasi setelah dibaca.

Kita juga membuat object 'PendingIntent' yang berfungsi untuk membantu kita melakukan suatu action yang mewakili app kita, biasanya tidak langsung atau pada beberapa saat kemudian, tidak peduli apakah app kita berjalan atau tidak. Dalam hal ini kita mengawalinya seperti berikut:
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, i, 0);
Method 'getActivity()' akan mengambil object 'PendingIntent' yang kita set dengan argumen-argumen seperti berikut:
  • context - ini adalah Application context (this)
  • request code - ini adalah request code untuk intent
  • intent - ini adalah intent untuk menampilkan activity target
  • flags - ini adalah flag dimana activity akan ditampilkan
Kita kemudian membuat instans class 'NotificationManager' dan membuat instans dari class 'Notification.Builder':
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
NotificationCompat.Builder notif = new NotificationCompat.Builder(this);
Class 'Notification.Builder' memungkinkan kita untuk menentukan informasi utama pada notifikasi bila notifikasi muncul pertama kali pada status bar.

Kemudian kita menentukan detil-detil notifikasi dengan menggunakan:
notif.setContentTitle(judul);
notif.setSmallIcon(R.drawable.ic_stat_announcement);
notif.setWhen(System.currentTimeMillis());
notif.setContentText(message);
notif.setVibrate(new long[]{100, 250, 100, 500});
notif.setContentIntent(pendingIntent);
Kode di atas juga men-set notifikasi untuk handphone bergetar. Terakhir, kita menampilkan notifikasi dengan method 'notify()' seperti berikut:
nm.notify(notificationID, notif.build());
Bila user men-klik pada notifikasi, activity "NotifikasiView" ditampilkan. Di sini kemudian berikutnya menutup/menghilangkan notifikasi dengan menggunakan method 'cancel()' dari object "NotificationManager" dan melewatkan ID notifikasi-nya yang dilewatkN melalui object 'Intent':
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
/*menghentikan notikasi yang sudah dimulai*/
nm.cancel(getIntent().getExtras().getInt("notificationID"));

No comments: