본문 바로가기

MOBILE/android

[Android] Notification, PendingIntent로 알림 활용하기

Notification

안드로이드의 알림서비스이다.

상단바에 보이는 것들이 알림인데 os가 관리하기 때문에 NotificationManager 시스템 서비스를 이용해서 os에게 넘긴다.

 

이때 알림을 눌렀을 때 어떤 action을 만들고 싶은 경우

pendingIntent 객체에 intent를 담아 시스템에서 대기하도록 해야한다.

pendingIntent는 지정된 상황이 올 때까지 intent를 보관하고 있으므로 알림을 눌렀을 때 intent를 실행한다.

 

intent를 PendingIntent 객체에 넣고

PendingIntent 객체를 Notification 객체에 넣고

NotificationManager에 Notification 객체를 등록하게 되면 시스템의 알림 서비스에 전달된다.

 

요약하면 다음과 같다.

1.NotificationManager 객체 생성

2. builder에 message 설정

3. pendingintent 객체 생성

4. NotificationManager에 notification 객체 등록

 

이때 oreo API 26 이상에서는 notification channel을 따로 등록해야 한다. channel은 noti들을 묶어서 그룹으로 관리하는 데 사용된다.


 

1. NotificationManager 객체 생성

NotificationManager는 시스템 서비스이므로 getSystemService() 를 통해서 가져온다.

NotificationManager notificationManager=
				   (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

 

2. builder를 생성하고 message 설정

bulider는 Notification 객체를 선언한다.

NotificationCompat.Builder builder=null;

일단 선언하고 null을 넣어둔다. 왜냐면 여기서부터 api 버전에 따라 할일이 다르기 때문

 

 

3. API level에 따라 다른 channel을 설정하거나 그냥 생성하거나

API 26 이상에서는 notification channel이 지정되어야 한다. createNotificationChannel로 channel을 생성해준다.

세번째 파라미터는 importance 즉 중요도 값이다. 0(none)~4(high) 까지 5 단계로 설정가능하다.

 

CHANNEL_ID, CHANNEL_NAME 둘 다 private static final 로 선언해서 고정 상수 값으로 만들어주면 좋다.

final 키워드를 쓰면 상수값이다. c에서는 constant

static 키워드를 쓰면 메모리에 한번만 올라간다. 즉 data영역에 쌓인다는 뜻 이건 c와 같다.

if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
	// API 26 이상에서의 channel 지정
    notificationManager.createNotificationChannel(
            new NotificationChannel(CHANNEL_ID,CHANNEL_NAME,NotificationManager.IMPORTANCE_DEFAULT));
    builder=new NotificationCompat.Builder(this,CHANNEL_ID);
}
else{
	// under 26
    builder=new NotificationCompat.Builder(this);
}

각각에 맞게 channel을 정했다면 builder 객체를 생성해준다.

그리고 메세지들을 설정해주면 됨

builder.setSmallIcon(R.drawable.ic_launcher_foreground);
builder.setContentText("알림 내용");
builder.setContentTitle("알림 제목");
builder.setContentIntent(pendingIntent);
builder.setAutoCancel(true);

 

4. pendingIntent 설정

알림을 눌렀을 때 subactivity가 작동되도록 한다면 다음과 같이 pendingIntent를 생성한다.

이때 101은 requestcode이다.

Intent intent=new Intent(this,subActivity.class);
PendingIntent pendingIntent=PendingIntent.getActivity(this,101,intent,
			PendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE);

pendingIntent에 intent를 넣고 flag를 설정하는데 이때 API 30 이상에서는

FLAG_IMMUTABLE or FLAG_MUTABLE 둘 중 하나가 필수이다.

 

구글 공식 개발자 문서에 flag에 대한 설명이 자세하게 나와있다. 원하는거 갖다 쓰면 됨

https://developer.android.com/reference/android/app/PendingIntent

 

5. NotificationManager 객체에 builder로 만든 notification 객체 등록

Notification noti=builder.build();
notificationManager.notify(1,noti);
// notificationManager.notify(1,builder.build());

객체를 등록할 때 귀찮으면 builder.build를 통해 익명 객체로 넣어도 된다.

재사용은 안되겠지만..

 

끝!