하루에 0.01%라도 성장하자

Develop/Android

Notification Skill #1

뚠님 2019. 4. 30. 11:08
728x90
반응형

Notification에 대한 내용을 찾다보면 대부분 2016년 이전 내용이 많다.

 

그 이유는 아마 그때 Notification에 대해서 핫하게 기술 연구(?)가 이루어졌기 때문이 아닐까

 

하지만 현재는 Firebase라는 좋은 프레임워크가 있기 때문에 잘 사용 안해서 관련하여 더이상 연구문서가 없을 수도 있고,

 

아니면 이미 알만한 사람은 다 알기 때문에 굳이 다시 작성하지 않는 이유일까...

 

이전 데이터를 찾아서 그대로 가이드를 따라 진행하면 에러도 발생하지 않고 알람도 발생하지 않는다.

( 즉 정상 동작 하지 않는다. )

 

이유는, NotificationCompat.Builder를 만들때 이전 버전에서는 context만 넣어주면 되었다. 하지만 그 이상의 버전은 channelId라는 것을 넣어주어야 동작 하였다.

그런데 이게 또... 나는 버전이 높으니까 ChannelId 넣어서 해야지! 라고 생각하고 해버리면 또 안된다. ( 동작안함 )

 

그래서 열심히 StackOverflow를 검색한 결과 찾아낸 방법이 version에 대한 분기 처리다.

 

우선 아래 내용은 내가 작성한 코드 이다

NotificationCompat.Builder builder = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
	int importance = notiManager.IMPORTANCE_DEFAULT;
	NotificationChannel notificationChannel = new NotificationChannel("ID", "Name", importance);
	notiManager.createNotificationChannel(notificationChannel);
	builder = new NotificationCompat.Builder(context, notificationChannel.getId());
	} else {
		builder = new NotificationCompat.Builder(context);
	}

문제가 되는 특정 버전과 그 이상의 버전을 분기 처리 하여 다르게 구현 하였다 .

그랬더니 동작 하더라 ...

 

 

대부분... Notification이 오면 눌렀을때 앱이 실행되길 바랄 것이다.

 

그때 작성하는 코드다.

PendingIntent mPendingIntent =
PendingIntent.getActivity(ApplicationManager.getInstance().getContext(),
0, new Intent(context, MainActivity.class),
PendingIntent.FLAG_UPDATE_CURRENT);

이렇게 PendingIntent를 통해 notification을 탭 하였을때 나왔으면 하는 Activity를 설정 할 수 있다.

 

 

그리고 아까 만들어 놓은 Builder에 붙인다.

 

이렇게...

builder = builder
.setSmallIcon(R.drawable.app_icon)
.setColor(ContextCompat.getColor(context, R.color.aidialog_background))
.setContentTitle(title)
.setTicker(description)
.setContentText(description)
.setDefaults(Notification.DEFAULT_ALL)
.setContentIntent(mPendingIntent)
.setAutoCancel(true);
notiManager.notify(0, builder.build());

그리고 notiManager.notify를 통해 해당 Notification을 발생 시킨다.

 

저어어어어기 보면 setContentIntent(mPendingIntent)가 있는데 이부분이 바로 눌렀을때 해당 인텐트로 넘겨준다는 의미고 그 인텐트는 위에 설정한 내용과 같다.

 

 

자 그렇다면.....

 

앱이 서비스 상태에서 동작하고 있을때 Notification이 발생 했다.

해당 noti를 누르면 앱이 실행되고 설정된 Activity로 간다.

 

그렇다면 앱이 프론트에 실행중인데 noti가 발생했다.

noti를 누르면 어떻게 될까 ?

 

 

내가 원했던 동작은 아무런 동작을 하지 않는 것이었다. 이미 앱이 실행중이었기 때문이지..

하지만 다시 실행됬다.. 앱이 ... 다시 실행되서 설정된 Activity를 재로딩 하였다 .

 

당연히 문제가 된다. 통신이 여러번 됬고 이미지를 여러번 그렸기 때문.

 

다시 또...

StackOverFlow를 찾아 해맸다. 없다. 

뭐라고 검색해야 되는지도 모르겠다.

'android already show activity notification' ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ이게 뭐임...

 

유투브가 생각 났다.

가끔 android, java, javascript등의 틀에서 기능에 포커스를 맞추어 3~5분짜리 동영상으로 강의 영상을 올리는 분들을 찾아보면 있을 것 같았다.

그리고 찾았다.

 

정답은 AndroidMenifest.xml 이었다.

 

PendingIntent에 실행되는 activity 설정에 아래와 같이 설정 한다.

android:launchMode="singleTop"

android:launchMode="singleTop"

 

이렇게 설정되면 앱이 실행 하는 도중에 noti를 받아 탭 하여도 앱이 재 실행되지 않고 내가 원.하.는.데.로 아무런 동작이 이루어 지지 않는다.

 

728x90
반응형

'Develop > Android' 카테고리의 다른 글

안드로이드 공부 및 포스팅 계획  (0) 2019.06.10
Android ) Android Studio Logcat Font Change  (0) 2019.05.31
Android 변수의 종류  (0) 2019.05.02
Drawable과 mipmap의 차이  (0) 2019.04.30
Notification Skill #1  (0) 2019.04.30
네비게이션바 숨기기  (0) 2019.04.30