정보공간_1

[6기 강남 송태현] android Framework Notifiacation & NotifyService 분석 본문

IT 놀이터/Elite Member Tech & Talk

[6기 강남 송태현] android Framework Notifiacation & NotifyService 분석

알 수 없는 사용자 2014. 10. 4. 22:40

안녕하세요 엘리트멤버 6기 23-2 송태현 입니다.

이번시간에는 android Framework Notifiacation & NotifyService 분석이라는 주제로 프레임워크를 분석해보겠습니다.

또한 4.L버전이 나오면서 새롭게 추가된 Notifiacation 기능에 대해서도 알아보겠습니다.

 

 

1) 안드로이드 프레임워크 상에 frameworks/base/core/java/android/app/NotificationManager.java 에서

public void notify(String tag, int id, Notification notification) {

// ...(중략)

}

패키지 명과 userId정보를 얻어 enqueueNotificationWithTag 함수를 호출합니다.

2) public void enqueueNotificationWithTag(String pkg, String tag, int id, Notification notification, int[] idOut, int userId)

- 내부적으로 관리하고 있는 notification list가 있으며 새로 들어온 notification을 인자로 들어온 패키지명과 tag, id, userId를 list에 있는 정보와 비교

- 같은 정보가 없을 경우 list에 notification 정보 추가후 addNotification 함수 호출

- 같은 정보가 있을 경우 list에 notification 정보 업데이트 후 updateNotification 함수 호출

-  위치)  frameworks/base/services/java/com/android/server/NotificationManagerService.java

3) public void addNotification(IBinder key, StatusBarNotification notification)

- addNotificationViews함수를 통해 contentView를 expandedView에 등록

- tick 함수를 통해 icon과 tickerText를 statusbar에 보여줌

- 위치) frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

4) public void updateNotification(IBinder key, StatusBarNotification notification)

- 기존 등록되어있던 contentView update

- tickerText 업데이트가 필요하면 tick 함수를 통해 icon과 tickerText를 statusbar에 보여줌

- 위치) frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java

여기까지 Notifiacation 등록 과정에 대한 프레임워크 내부 흐름을 알아봤습니다.

 

다음은 NotificationService에서 새롭게 추가된 기능들을 살펴 보겠습니다.

예전까지는 Notification을 이용하여 어떠한 스마트폰 통지를 확인할수 있는 방법이 Accessibility 같은것을 이용하여 생소하게 다루었고, 까다로운 작업이었습니다.

하지만 새롭게 추가된 NotificationListenerService 를 통해 내 스마트폰에 Notify가 발생하는것을 전부 캡쳐도 할 수 있고,

새로 추가 또는 삭제 기능까지도 쉽게 할 수가 있습니다. 또한 리스너 형태이기 때문에 언제 Notify가 온지를 쉽게 확인할 수

있는 기능들이 추가 되었습니다. 사용은 API 18 부터 사용이 가능합니다.

간단한 예제코드로 살펴 보겠습니다.

 

1. AndroidManifest.xml 등록

<service android:name=".NotificationService"  android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">

<intent-filter>
 
<action android:name="android.service.notification.NotificationListenerService" />
 
</intent-filter>
 
</service>

 

2. NotifiacationService 추가

public class NotificationService extends NotificationListenerService {

 @Override

 public void onCreate() {

  // 디바이스 설정 -> 보안 -> 알림에서 해당 앱을 체크

  // 여기서는 NLservice가 시작하였을때 사용자가 원하는 동작을 정의

 }

 @Override

 public void onNotificationPosted(StatusBarNotification sbn) {

  // Notification 추가시 Callback

  // Notifiacation이 왔을때 사용자가 원하는 동작을 정의

 }

 @Override

 public void onNotificationRemoved(StatusBarNotification sbn) {

  // Notification 제거시 Callback 메소드가 호출된다.

  // Notification 제거시 사용자가 원하는 동작을 정의

 }

 @Override

 public StatusBarNotification[] getActiveNotifications() {

  return super.getActiveNotifications();

 }

}

위와 같은 형태로 클래스를 만들어주고 해당 기능이 됬을때 여러분들이 원하는 작성코드를 넣어주시면 쉽게 사용하실수가 있습니다.

그리고 최종적으로 이러한 어플을 만들고 실행하기 전에 설정->보안->NotifyAccess에서 여러분들이 만든 어플이름을 체크 해주셔야 정상적으로 작동을 합니다.

이상 마치겠습니다. 감사합니다.