eunja511005 / AutoCoding

0 stars 0 forks source link

[안드로이드] 채팅앱 구현을 위한 포그라운드 서비스 정리 #148

Open eunja511005 opened 8 months ago

eunja511005 commented 8 months ago

1. 로그인에 성공 하면 포그라운드 서비스를 시작 한다.

1. LoginActivity 생성시 로그인 버튼 클릭 이벤트를 정의 한다.
2. 입력 받은 유저 아이디, 패스워드를 이용하여 스프링 서버로 부터 토큰을 얻는다.
3. 토큰은 토큰 매니저를 활용하여 얻을 얻 수 있도록 구현하여 다른 곳에서 재사용 가능 하도록 한다.
4. 토큰 매니저는 Single<String>을 리턴 하도록 하여 구독이 가능하도록 한다.
5. 구독은 compositeDisposable.add(disposable);을 이용하여 추가한다.
6. subscribe(jwtToken을 통해 서버에서 받아온 토큰을 이용 가능하다.
7. jwtToken을 정상적으로 받아 온 경우 ChatForegroundService을 시작 하고 LoginActivity는 종료 한다.
8. LoginActivity 종료시 compositeDisposable.clear();을 통해 구독을 중지 한다.

image

image

image

image

image

eunja511005 commented 8 months ago

2. startForegroundService(serviceIntent); 에 의해 서비스의 onStartCommand가 트리거 됨

1. onStartCommand가 수행 되면 알림을 등록한다.
2. onStartCommand가 수행 되면 jwtToken을 얻는다.
3. onStartCommand가 수행되면 웹소켓 연결 한다.
4. 안드로이드 오레오 이상에서는 알림 등록시 NotificationChannel을 이용해야 한다.
5. NotificationChannel 생성을 위해서는 채널 ID, 채널명, 중요도를 정의 해야한다.
6. NotificationManage는 정의된 NotificationChannel을 생성 한다.
7. NotificationChannel은 Notification 생성시 채널 ID를 통해 연결 된다.
8. 생성된 Notification은 특정 Notification ID를 통해 시작 된다.(startForeground(NOTIFICATION_ID, notification);)
9. 웹소겟 연결시 기존 웹소켓 클라이언트가 있으면 종료 시키고 다시 연결 한다.
10. 웹소켓 연결을 위해서는 토큰이 필요 하다.
11. jwtToken의 유효성을 점검하고 유효하지 않으면 토큰 매니저를 이용하여 토큰을 다시 얻어 오고 업데이트 한다.
12. 유효성 점검과 다시 토큰을 얻어 오는 작업은 모두 비동기 방식이므로 순서 대로 수행되도록 flatMap을 이용한다.
13. flatMap은 RxJava에서 이용하는 연산자로 비동기 작업의 순서화가 가능 하다.
14. 이렇게 얻어온 유효한 토큰은 웹소켓 연결시 헤더에 포함되어야 한다.
15. 서버에서는 필터에서 전달 받은 토큰의 유효성을 점검 하고 유효하지 않은 경우 오류를 리턴하도록 구현하여 보안 취약점이 없도록 한다.
16. 웹소켄 연결이 성공한 경우 isConnected = true; 으로 세팅하여 1분 마다 수행되는 백그라운드 잡에서 재연결을 하지 않도록 한다. 
17. 웹소켓 연결이 끊어 지거나 오류가 발생한 경우는 isConnected = false; 으로 세팅하여 1분 마다 수행되는 백그라운드 잡에서 재연결을 하도록 한다.
18. 웹소켓 연결이 성공하면 구독이 되어 채팅 주제에 해당하는 메세지를 구독 할수 있다.
19. 채팅 주제 메세지 구독시 ChatActivity가 실행중이면 브로드케스트를 이용하여 ChatActivity로 메세지를 전달하여 UI에 표시되도록 한다.
20. ChatActivity가 실행중이이 아니면 알림을 발생 시킨다.
21. 알림을 발생 시키려고 하는데 notificationManager가 null인 상태면 notificationManager을 다시 생성한 후 알림을 발생 시킨다.
22. 원인을 잘 모르겠지만 notificationManager가 죽는 현상이 발생하여 반드시 notificationManager null 체크후 알림을 발생시켜야 한다.

image

image

image

image

image

image

image

image

image

eunja511005 commented 8 months ago

3. 웹소켓 연결이 끊어졌는지 1분 마다 체크하여 끊어진 경우 웹소켓 연결을 다시 연결 하도록 한다.

1. ChatForegroundService 서비스 생성시 Handler와 Runnable을 이용하여 1분에 한번씩 if(!isConnected) 연결이 안되어 있는 경우 웹소켓을 다시 연결 토록 한다. 

image

image

image