본문 바로가기
개발/안드로이드

[Android] Notifications(알림)

by darksilber 2013. 11. 13.
반응형

출처 - http://jasperslab.blogspot.kr/2013/01/android-notifications.html

 

 

[1] Notification 표시 영역

notification 아이콘은 notification area라는 상단의 status bar의 앞쪽에 나타난다. notification의 상세 내용은 사용자가 notification drawer를 열어서 볼 수 있다. 두 영역이 모두 system-controlled area로서 사용자는 언제든 살펴볼 수 있다.

Notifications in the notification area

Notifications in the notification drawer


[2] Notification 형태

notification은 notification drawer 내에서 표시 형식에 따라 normal, big 두 가지 형태로 구분된다.


1. Normal View



Notification in normal view
(1) Content title
(2) Large icon
(3) Content text
(4) Content Info
(5) Small Icon
(6) Time that the notification was issued.

2. Big View


Big view notification


[3] Notification 만들기


1. Notification 직접 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
Intent intent = new Intent(getApplicationContext(), NotiResultActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification();
notification.icon = R.drawable.ic_launcher;
notification.tickerText = "tickerText";
notification.when = new Date().getTime();
notification.number = 10;
notification.setLatestEventInfo(getApplicationContext(), "contentTitle", "contentText", pendingIntent);
int notiId = 1;
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(notiId, notification);
이렇게 작성된 Notification은 NotiResultActivity 클래스에서 아래의 코드로 해제시켜야 한다.
단, Notification이 생성될 때의 id를 사용해야 한다.

1
2
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.cancel(1);

2. Notification.Builder 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//use Notification.Builder [required API level 11]
Intent intent = new Intent(getApplicationContext(), NotiResultActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Notification.Builder builder = new Notification.Builder(getApplicationContext());
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setTicker("tickerText");
builder.setWhen(System.currentTimeMillis());
builder.setNumber(10);
builder.setContentTitle("contentTitle");
builder.setContentText("contentText");
builder.setContentIntent(pendingIntent);
builder.setAutoCancel(true);
//Notification notification = builder.build();//required API level 16
Notification notification = builder.getNotification();
int notiId = 1;
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(notiId, notification);
builder.setAutoCancel(true); 코드로 Notification에 클릭 이벤트가 발생했을 때 자동으로 해제시켜준다. 따라서 NotiResultActivity 클래스에서 해제시키는 코드가 따로 필요없다.


3. NotificationCompat.Builder 사용

추천되고 있는 방식으로는 NotificationCompat 클래스를 사용하는 것이다. 클래스명 뒤에 Compat이 붙는 것은 원래 클래스의 상위 버전에 추가되는 Features에 대응하기 위한 호환성 도우미 클래스 정도라고 생각하면 될 듯하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
mBuilder.setSmallIcon(R.drawable.ic_launcher);//required
mBuilder.setContentTitle("contentTitle");//required
mBuilder.setContentText("contentText");//required
mBuilder.setTicker("tickerText");//optional
mBuilder.setNumber(10);//optional
mBuilder.setAutoCancel(true);
Intent resultIntent = new Intent(this, NotiResultActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(NotiResultActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(1, mBuilder.build());

위 코드에서는 TaskStackBuilder 클래스가 사용되었다. 자세한 내용을 여기를 참조.

[4] ProgressBar 추가하기


1. API level 14 이상에서

API level 14 (안드로이드 4.0 아이스크림 샌드위치) 이상에서는 아래의 코드로 간단하게 ProgressBar 구현이 가능하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Intent resultIntent = new Intent(this, NotiResultActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(NotiResultActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
builder = new NotificationCompat.Builder(getApplicationContext());
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setContentTitle("contentTitle");
builder.setContentText("contentText");
builder.setTicker("tickerText");
builder.setContentIntent(resultPendingIntent);//required
builder.setAutoCancel(false);
final int ID = 1;
final int MAX = 100;
new Thread(
new Runnable() {
@Override
public void run() {
for (int incr = 1; incr<=100; incr+=1) {
builder.setProgress(MAX, incr, false);
notificationManager.notify(ID, builder.build());
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
Log.e("Noti_Progress", "sleep failure");
}
}
builder.setContentText("Progress Complete");
builder.setProgress(0, 0, false);//removes the progress bar
builder.setAutoCancel(true);
notificationManager.notify(ID, builder.build());
}
}
).start();

2. RemoteViews 이용한 구현

API level 14 미만에서는 직접 구현하는 수밖에 없다. RemoteViews를 이용해서 아래와 같이 구현한다.

noti_progressbar.xml
1
2
3
4
5
6
7
8
9
10
11
12
<RELATIVELAYOUT xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/noti_layout">
<TEXTVIEW style="android: style/TextAppearance.Small.Inverse" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/noti_title" android:layout_alignparenttop="true" android:layout_alignparentleft="true">
</TEXTVIEW>
<PROGRESSBAR style="android: attr/progressBarStyleHorizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/noti_progress" android:layout_alignparentleft="true" android:layout_below="@id/noti_title">
</PROGRESSBAR>
<TEXTVIEW style="android: style/TextAppearance.Small" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/noti_text" android:layout_centerhorizontal="true" android:layout_alignbottom="@id/noti_progress">
</TEXTVIEW>
</RELATIVELAYOUT>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
final int notiId = 1;
final int MAX = 100;
notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
new Thread(new Runnable() {
@Override
public void run() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
RemoteViews notiDrawerView = new RemoteViews(getPackageName(), R.layout.noti_progressbar);
notiDrawerView.setTextViewText(R.id.noti_title, "contentTitle");
notiDrawerView.setProgressBar(R.id.noti_progress, MAX, 0, false);
notiDrawerView.setTextViewText(R.id.noti_text, "contentText");
Intent intent = new Intent(getApplicationContext(), NotiResultActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT);
Notification notification = new Notification(R.drawable.ic_launcher, "tickerText", System.currentTimeMillis());
notification.flags |= Notification.FLAG_ONGOING_EVENT;
notification.contentView = notiDrawerView;
notification.contentIntent = pendingIntent;
int progress = 0;
while (progress <= 100) {
progress++;
notification.contentView.setProgressBar(R.id.noti_progress, MAX, progress, false);
notification.contentView.setTextViewText(R.id.noti_text, String.valueOf(progress)+"%");
notificationManager.notify(notiId, notification);
try {
Thread.sleep(500L);
} catch (InterruptedException e) {
Log.e("Noti_Progress", "sleep failure");
}
}
notificationManager.cancel(notiId);
}
}).start();

참고로 Status bar를 너무 자주 수정하는 것은 좋지 않다는 포스트를 여기에 링크한다.
반응형

'개발 > 안드로이드' 카테고리의 다른 글

프로를 위한 팁(ProTip)  (0) 2014.01.03
안드로이드 GCM 서버  (0) 2013.11.18
안드로이드 Notification (안드로이드 알림)  (0) 2013.11.13
Google Expansion File 설명(확장 파일)  (0) 2013.11.12
[Android]Shape 요소  (0) 2013.11.05

댓글