정상에서 IT를 외치다

[Android, Oreo Notification] 오레오 알림 설정하기 본문

안드로이드

[Android, Oreo Notification] 오레오 알림 설정하기

Black-Jin 2018. 3. 30. 16:06
반응형


안드로이드 API 26 (오레오) 버전 부터는 기존의 Notification 방식이 적용되지 않습니다.


Notification Channel 을 필수로 설정해 주어야 합니다.



기존에는 다음과 같은 방식으로 Notification 을 실행했습니다.

Intent mMyIntent = new Intent(this, MyActivity.class);

PendingIntent mPendingIntent = PendingIntent.getActivity(
this, 1, mMyIntent, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(android.R.drawable.btn_star)
.setContentTitle("Title")
.setContentText("Content");

.setDefaults(Notification.DEFAULT_ALL) // 알림, 사운드 진동 설정

.setAutoCancel(true) // 알림 터치시 반응 후 삭제

.setContentIntent(mPendingIntent)


NotificationManager mNotifyMgr =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);

mNotifyMgr.notify(1, mBuilder.build());

위 코드에서에 new NotificationCompat.Builder(this) 의 인자가 1개인데 오레오에서는 인자 2개를 넣어주어야만 작동 됩니다.

(NotificationCompat 는 android.support.v4.app 을 import 해주셔야 합니다.)






안드로이드 오레오 버전에서는 다음과 같은 Channel 을 설정해야 합니다.

String channelId = "channel";
String channelName = "Channel Name";
int importance = NotificationManager.IMPORTANCE_LOW;

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel mChannel = new NotificationChannel(
channelId, channelName, importance);

mNotificationManager.createNotificationChannel(mChannel);

}

channelId 와 channelName 을 정해줍니다.


위와 같이 NotificationChannel 을 버전별로 나누지 않으면 하위 버전에서 java.lang.NoClassDefFoundError: 에러가 발생하니


꼭 나눠 주셔야 합니다.


그다음 Notification 의 중요도(importance)를 설정

int importance = NotificationManager.IMPORTANCE_HIGH;

만약 중요도를 HIGHT 으로 설정해 주면 상단에 팝업이 자동으로 생성 됩니다.


NotificationCompat.Builder builder =
new NotificationCompat.Builder(this, channelId);


마지막으로  NotificationCompat.Builder 에 channelId 를 적어 주시거나


setChannelId() 를 설정해 주어야 정상 작동 됩니다.


아래는 Notification 전체 코드 입니다.


String channelId = "channel";
String channelName = "Channel Name";

NotificationManager notifManager

= (NotificationManager) getSystemService  (Context.NOTIFICATION_SERVICE);


if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {

int importance = NotificationManager.IMPORTANCE_HIGH;

NotificationChannel mChannel = new NotificationChannel(
channelId, channelName, importance);

notifManager.createNotificationChannel(mChannel);

}

NotificationCompat.Builder builder =
new NotificationCompat.Builder(getApplicationContext(), channelId);

Intent notificationIntent = new Intent(getApplicationContext()

, MainActivity.class);

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_SINGLE_TOP);

int requestID = (int) System.currentTimeMillis();

PendingIntent pendingIntent
= PendingIntent.getActivity(getApplicationContext()

, requestID

, notificationIntent

, PendingIntent.FLAG_UPDATE_CURRENT);

builder.setContentTitle("Title") // required
.setContentText("Content") // required
.setDefaults(Notification.DEFAULT_ALL) // 알림, 사운드 진동 설정
.setAutoCancel(true) // 알림 터치시 반응 후 삭제

.setSound(RingtoneManager

.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))

.setSmallIcon(android.R.drawable.btn_star)
.setLargeIcon(BitmapFactory.decodeResource(getResources()

, R.drawable.msg_icon))
.setBadgeIconType(R.drawable.msg_icon)

.setContentIntent(pendingIntent);

notifManager.notify(0, builder.build());



참고


안드로이드 공식 홈페이지

https://developer.android.com/guide/topics/ui/notifiers/notifications.html#ManageChannels

https://developer.android.com/guide/topics/ui/notifiers/notifications.html?hl=ko#Badges


티스토리

http://gun0912.tistory.com/77

반응형
Comments