마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Service 안에 NotificationListenerService

0 추천

#안드로이드 #질문
안녕하세요, 오랜만에 안드로이드를 접하고 있는 직장인입니다...
리스너를 이렇게 구현해본 적이 없어서 올바른 문법?인지 모르겠어서 여쭤봅니다.
리스너가 호출되고 바로 죽어버리니 멤버 값을 저장하며 계속 대기하는 서비스를 실행한 다음 알림을 받으면 이벤트를 실행하고 싶습니다.

아래가 올바른 방법인지 궁금해요.
에러는 없는데, 왜 잘 작동되지 않을까요;
어떻게 수정해야 할까요?

// NotificationService.java

public class NotificationService extends Service {

// 여러 멤버들

    public class NotificationListener extends NotificationListenerService {

    // onNotificationPosted~~~

    }

// NotificationService의 메서드
}
<!-- 서비스 -->
<service android:name=".NotificationService" />


<!-- 알림 받기, $ 기호가 맞나요? -->
<service
android:name=".NotificationService$NotificationListener"
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
    <intent-filter>
        <action android:name="android.service.notification.NotificationListenerService" />
    </intent-filter>
</service>

 

LocoField (160 포인트) 님이 2016년 11월 7일 질문

1개의 답변

+1 추천
 
채택된 답변
정확히 구현하고 싶으신 내용을 댓글로 달아주세요.

 

NotificationListenerService를 사용하고 싶으신 것이면 이 자체가 Service를 상속받기때문에

Service의 inner로 들어갈 이유가 없습니다.
Development Guy (70,570 포인트) 님이 2016년 11월 8일 답변
LocoField님이 2016년 11월 8일 채택됨
Service A는 백그라운드에서 대기하고 있습니다. 서비스의 onCreate 때 socket, iostream 등을 초기화하고 그 값을 가지고 있죠.
Service B는 NotificationListenerService를 상속받습니다.
그러나 Service B는 알림이 올 때마다 생성되고 바로 죽으므로, Service A를 참조해야만 합니다.
즉, 매번 알림이 발생될 때(Service B가 실행될 때)마다 Service A를 초기화 할 수 없으므로(매우 비효율적) Service B는 Service A와 통신(bind?)하거나 A 안에 inner class로 넣고 싶습니다.
가능만하다면 이너 클래스 방식이 간단할텐데. 메니페스트를 어떻게 만져야 하나요?
일반 Service 같은 경우에 manifest에 질문자님처럼 정의하시면
동작한다고는 하지만 시스템에서 관여하는 컴포넌트들이 동작할지는 모르겠네요.(예를들어 AccessibilityService라던가 DeviceAdminReceiver같은 컴포넌트들)

그리고 NotificationListenerService가 알림이 올때마다 죽는다는것은 잘못 알고 계신거 같은데요. 이게 사실인지는 onDestroy 부분에 로그를 찍어서 확인 해보시기 바랍니다. 제가 확인하기로는 절대 메시지가 올때마다 죽지 않습니다.

그리고 Service에 대해 잘못 알고 계신거 같은데 Service는 명시적으로 stop 시키거나 시스템에서 중지 시키기 전까지 start한다고 하여 매번 초기화 작업을 하지는 않습니다. onCreate 부분에서는 서비스 안에서 사용하는 인스턴스들의 무결성을 유지하는데 사용하시고 onStartCommand 함수에서 Action이벤트를 받아서 처리하는데 사용한다고 보시면 될거 같습니다.
하... 그러네요,, 너무 닫힌 생각으로 고민하고 있었나봅니다.
보안설정에서 알림접근 허용하는 순간 서비스가 onCreate - onBind - onListenConnected 순으로 호출되네요. 계속 안죽고 멤버변수++도 제대로 작동하더군요.
감사합니다. 많이 알아가요~
...