구성
1. 서비스 실행 시 알림 띄우기
2. 알림을 지워지지 않게 만들기('실행 중' 탭에 띄우기)
1장.
안드로이드 이전 버전에서는 노티피케이션(Notification)을 띄우기 위해 Notification 인스턴스를 만들어 사용했지만
지금은 Notification.Builder를 통해 생성하도록 권장하고 있다.
여기서는 이전 버전과의 호환성을 위해 android.support.v4.app 패키지의 NotificationCompat.Builder 객체를 사용한다.
그렇기 때문에 android-support-v4.jar 파일을 프로젝트에 추가해야 하는데
이 파일은 안드로이드sdk 설치 디렉토리 - extras - android - support - v4 경로에 있다.
이 파일을 이클립스 기준으로, 프로젝트속성 - java build path - libraries에 들어가 포함시키면 된다.
서비스에서 노티피케이션을 띄우기 위한 코드는 서비스의 onStartCommand 함수 내에 작성한다.
먼저 NotificationCompat.Builder 객체를 생성하고, 필수로 SmallIcon과 ContentTitle, ContentText를 지정해 주어야 한다.
(▽ 상단바에 왼쪽편에 있는 아이콘들이 SmallIcon들이다.)
(▽ "USB가 연결되었습니다"문구가 ContentTitle이고, "컴퓨터로부터 또는 컴퓨터로..."부분이 ContentText이다.)
그리고 노티피케이션을 터치했을 때 어떤 동작을 할 것인가를 지정해 주는데
여기서는 메인 액티비티인 MainActivity를 실행해 주기로 하였다.
Intent를 만든 뒤 TaskStackBuilder 객체에 추가하고
그것을 바탕으로 TaskStackPendingIntent 객체를 완성한다.
그리고 그 객체를 처음에 만들었던 NotificationCompat.Builder 객체에서 setContentIntent()로 설정.
마지막으로 NotificationManager를 생성하여 notify()시키면 노티피케이션이 뜨게 된다.
코드는 아래와 같다.
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.smallicon)
.setContentTitle("알림바 실험")
.setContentText("알림바입니다..");
Intent resultIntent = new Intent(getApplicationContext(),MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPandingIntent =
stackBuilder.getPendingIntent(
0,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPandingIntent);
NotificationManager mNotificationManager =
(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(3452, mBuilder.build());
NotificationCompat.Builder 객체를 만들 때, 스타일을 설정하는 set메서드들이 NotificationCompat.Builder 반환값을 가지므로
.setSmaillIcon().setContentTitle().setContentText() 와 같이 이어지게 될 수 있다.
(노티피케이션이 등록될 때 상단바에 메시지가 나타나는 것은 setTicker().로 설정할 수 있다.)
MainActivity라고 되어있는 부분은 노티피케이션을 선택했을 때 실행할 액티비티이며 상황에 맞게 다른 액티비티 이름이 올 수 있다.
notify()함수에서 3452는 노티피케이션을 관리하기 위한 id값으로 여기서는 임의의 값을 써 둔 것이다.
다른 컨텍스트에서 노티피케이션을 종료해야 할 때는 다시 NotificationManager를 생성하여
아까 지정한 id(3452)를 통해 지울 수 있다. 코드는 다음과 같다.
NotificationManager mNotificationManager =
(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.cancel(3452);
2장.
안드로이드 운영체제는 시스템 자원이 부족하다든지 하는 경우에 실행 중인 서비스를 끌 수도 있다. (꺼졌다가 다시 켜지기도 한다)
이를 방지하기 위해선 서비스를 포그라운드(Foreground)로 실행해야 한다.
또한 알림을 지워지지 않고 '실행 중'탭에 놓기 위해서도 역시 포그라운드로 서비스를 실행하면 된다.
서비스를 포그라운드로 실행하려면 노티피케이션을 띄워 주어야 하는데
1장에서 만든 NotificationCompat.Builder 객체를 그대로 사용할 수 있다.
코드는 아래와 같다. (위 코드와 중복되는 부분이 대부분)
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.smallicon)
.setContentTitle("알림바 실험")
.setContentText("알림바입니다..");
Intent resultIntent = new Intent(getApplicationContext(),MainActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPandingIntent =
stackBuilder.getPendingIntent(
0,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPandingIntent);
this.startForeground(3452,mBuilder.build());
1장의 코드와 비교하여 NotificationManager 부분이 없어지고 startForeground()함수를 추가됐다.
노티피케이션을 제거할 때는 아래 코드로 포그라운드를 취소하면 된다.
this.stopForeground(true);
====================================================================================================