[Android]BR-통지(Notification) 와 펜딩인텐트(PendingIntent) [국비]자바기반 응용SW과정 2018. 5. 17. 15:19
BR
백그라운드에서 실행되는 서비스와 통지,BR등에서
사용자에게 알림을 보낼 수 있는 여러가지 방법에 대해 알아 보고
앱 사이의 공식적인 통신방법인 BR제작을 실습하는거
오늘 학원에서 통지 부분을 나갔다.
백그라운드 프로세스는 어떤 사건 발생할때 사용자에게 확실하게 알릴만한 방법이 없음
토스트가 있긴하겠지만
부재중 전화나 약속시간을 토스트만 잠시보여주고 말아버리면 곤란하잖음
대화상자같은 경우도 사용자가 화면을 보기 전에는 확인하지 않아서 마찬가지임
그래서 백그라운드 프로세스에서 사용자와 통신할 수 있는 더 확실한 방법이 필요한데
그게 바로 통지(Notification)이다.
우리 휴대폰 맨윗상단에는 상태란이있어서
오른쪽에 시간, 배터리잔량 네트워크등이 표시되는데
상태란의 왼쪽부분에 통지 아이콘이 나타난다.
부재중전화, 메시지나 배터리부족하다 usb연결 등등..알려줄때
통지는 최초 잠깐만 보이지만 토스트와는 달리 사용자가 확인하기 전에는 아이콘이 계속 표시되고
소리, 진동, 불빛같은 적극적인 방법으로 신호를 보낼수있다.
사건발생 사실만 아이콘으로 표시하고 구체적인 내용은 당장 보이지 않지만
상태란을 아래로 드래그해서 확장하면 상세한 정보가 출력되게말이다.
통지 뷰의 모습은 버전이나 장비에따라 다르다.
통지를 그러면 어떻게 사용할까? 어떻게 출력하까 ㅋㅋㅋㅋㅋㅋㅋㅋ
오늘 이것에 대해 배웠기 때문에 정리한다!!!
통지를 출력하려면 통지 관리자(NotificationManager)와 통지 객체(Notification) 둘을 사용한다.
근데 이 둘을 사용하는데 준비해야할게 많아서 번거롭더라
간단하게 말하면 이런느낌이다 : 인텐트 ~ -> 펜딩인텐드 ~-> notification~~
먼저 어떤 내용을 어떻게 알릴지 통지 객체를 생성하고 , 여러가지 속성을 원하는 대로 설정한다.
통지 객체의 생성자는 이렇다.
Notification()
Notification(int icon, CharSequence tickerText. long when)
인수를 받지 않는 디폴트 생성자로 생성한후에
속성을 설정하거나 아이콘, 티커텍스트, 통지발생시간등을 인수로 전달한다.
이전버전에서는 주로 생성자로 직접 통지 객체를 생성하고
setLatestEventinfo 메서드로 선택시 동작을 정의했는데
3.0이후에는 통지영역에 출력할 수 있는 옵션이 대폭적으로 늘어났다.
그래서 빌저를 통해 객체를 생성하는 것으로 변경됨.
빌더의 생성자는 이렇다. (사실 이런건 예제 한번 훅 보는게 더빠른듯)
Notification.Builder(Context context)
인수로 리모트뷰 생성에 사용할 컨텍스트를 전달하는데 통지 객체를 생성하는 액티비티를 전달한다.
이후에 다음 메서드로 통지 객체의 속성을 설정한다.
속성의 종류가 굉장히 많아서 기본속성부터 정리하겠음
1.Notification.Builder setTicker(CharSequence tickerText [ , RemoteViews views])
->티커 텍스트는 통지영역에 아이콘이 처음 나타날때 잠시 출력될 짧은 문자열이다.
잠시만 보였다 금방 사라지지만 통지 전달 시점에 화면을 보고 있다면
티커 텍스트만 보고도 무슨일이 일어났는지 알 수 있다.
(단순 문자열 외에 커스텀 리모트 뷰를 지정하면 더 복잡한 정보도 출력할 수 있다.)
2.Notification.Builder setWhen(long when)
->when은 통지가 발생한 시간을 지정하는데
System.currentTimeMillis 메서드로 구현한 현재 시간을 지정하는것이 보통이고
디폴트도 현재 시간으로 되어있다.
3.Notification.Builder setSmallIcon(int icon [, int level])
->아이콘은 두가지 상태를 지정할 수 있는데
작은아이콘은 상태란 왼쪽에 티커 텍스트와 함께 표시되고, 상태란을 펼쳤을때 통지뷰에도 나타난다.
또 티커 텍스트가 사라진 후에는 상태란에 작은 아이콘만 남아 통지가 발생했음을 알리는 역할을 한다.
(면적이 그다지 넓지 않아서 작은아이콘만 표시할수있다.)
3.0이후에는 큰 아이콘도 추가로 표시할 수 있는데 통지 뷰에 나타난다.
큰아이콘이 없으면 작은 아이콘이 통지뷰에 대신 표시되지만,
큰아이콘이 지정되면 통지 뷰에는 큰 아이콘이 사용되며 작은 아이콘은 오른쪽에 표시된다.
-->통지의 기능이 확장됨으로 인해서 단순히 사건 발생만을 알리는게 아니라
사건에 대한 정보를 표시하는 큰아이콘이 필요해졌다.
4.Notification.Builder setLargeIcon(Bitmap icon)
->큰 아이콘은 SNS 메시지의 사용자 사진, 멀티미디어 앱의 앨범 자켓 등을 보여주는 용도로 사용된다.
아래 메서드는 통지 뷰에 대한 여러가지 속성을 설정한다.
(위에 메서드는 통지 객체의 속성 설정! 여기 아래는 통지 뷰에 대한 여러가지 속성 설정)
Notification.Builder setContentTitle(CharSequence title)
Notification.Builder setContentText(CharSequence text)
Notification.Builder setSubText(CharSequence text)
Notification.Builder setContentIntent(PendingIntent intent)
-->통지 뷰에는 상단제목, 중간내용, 하단의 서브텍스트 등 총 3개의 문자열을 표시한다.
모든 문자열을 다 표시할 필요는 없다. 필요한 만큼만 표시하면 된다.
문자열이 많으면 오히려 너무 번잡스러워서
제목에 사건 개요를 적고 내용에 상세 메시지 정도만 표시하는게 일반적이다.
사용자가 통지 뷰를 클릭했을 때의 동작은 setContentIntent 메서드로 펜딩 인텐트를 전달하여 지정한다. !!!!
그래서 아까 위에서 펜딩인텐트 얘기를 꺼낸거 !!!! 그래서 난이제 펜딩인텐트에 대해서 설명하겠다.
<PendingIntent>
펜딩인텐트 클래스는 인텐트를 래핑하며 다른 응용프로그램으로 전달하여 실행 권한을 준다.
( 보통의 인텐트와 다르다. )
통지를 등록하는 앱과 통지 뷰를 관리하는 앱이 다르기 때문에
일반 인텐트로는 의도를 전달할 수 없다.
펜딩 인텐트는 시스템이 관리하며 인텐트를 만든 으용프로그램이 종료되어도 유효하다.
생성자가 정의되어 있지 않아서 객체를 직접 생성할 수 없고,
아래에 있는 세개의 정적 메서드 중 하나로 생성한다.
(1)PendingIntent getActivity (Context context, int requestCode, Intent intent, int flags)
(2)PendingIntent getBroadcast (Context context, int requestCode, Intent intent, int flags)
(3)PendingIntent getService (Context context, int requestCode, Intent intent, int flags)
얘네 세개의 메소드 차이는 인텐트로 무엇을 띄울 것인가에 따라 메소드가 나누어져 있다.
액티비티를 띄울 예정이다 -->(1)메서드로 펜딩 인텐트를 생성한다.
context인수는 인텐트를 등록하는 주체이며 intent는 실행할 작업이다.
펜딩 인텐트를 등록해 놓으면 시스템이 인텐트를 가지고 있다가 통지 뷰가 클릭될 때 내부의 인텐트를 실행한다.
get Activity로 생성된 인텐트는 결국 startActivity를 호출하여 인텐트가 지정하는 액티비티를 띄운다.
통지 뷰에서는 주로 액티비티를 띄우는데
이 경우 인텐트에는 FLAG_ACTIVITY_NEW_TASK 플래그를 지정하여 새로운 태스크를 시작하게 한다.
(2),(3) 메서드는 방송을 보내거나 서비스를 호출한다.
펜딩인텐트에 관한 자세한 설명은
https://developer.android.com/reference/android/app/PendingIntent
여기 사이트에 있는데 영어다 !! 하하 ..ㅋㅋㅋㅋㅋ
저 세개의 메서드중 flag부분에 대해서 더 자세하게 다뤄보려고 한다.
저기 pending intent 에서 flag를 제공해주는데
- FLAG_CANCLE_CURRENT
-->이전에 생성된 펜딩인텐트는 취소하고 새롭게 하나를 만든다.
- FLAG_NO_CREATE
-->현재 생성된 펜딩인텐트를 반환한다.
- FLAG_ONE_SHOT
이 플래그를 이용해 생성된 펜딩인텐트는 단 한번 밖에 사용될 수 없다.일회용카드!!
- FLAG_UPDATE_CURRENT
만일 이미 생성된 펜딩인텐트가 존재한다면 해당 인텐트의 내용을 변경한다.
아까 위에서 설명할때 진동이나 빛 소리등으로 적극적! 으로 알릴 수 있다고 얘기했는데
그거와 관련된 빌더의 고급 속성 고급 메서드!!을 알아보자
Notification.Builder setLights(int argb, int onMs, int offMs)
-->통지 발생시에 장비의 LED를 깜박거리며 색상과 주기를 지정한다.
모든 장비가 LED를 가지고 있지 않으며 지원하는 색상도 제한적이라서 반드시 제한된 색상대로 출력되는건 아니다.
Notification.Builder setNumber(int number)
-->통지와 함께 숫자 하나를 보여주는데 여러 가지 의미로 사용된다.
ex))부재중 메시지 알림의 경우 총 몇 통의 메시지가 왔는지 표시하고
충전중 알림이라면 충전 진행 정도를 표시한다.
Notification.Builder setOngoing(boolean ongoing)
-->일회적인 알림이 아니라 음악 재생이나 싱크 등의 작업이 진행 중임을 나타낸다.
사용자가 통지를 직접 제거할수 없다. 코드에서 작업 완료시에만 제거할 수 있다.
Notification.Builder setSound(Uri sound [ , int streamType])
Notification.Builder setVibrate(long[ ] pattern)
--> 통지 발생시 사운드를 낸다던가 진동을 발생 시킬 수 있다.
통지는 주로 화면이 꺼진 상태에서 발생하므로 소리나 진동을 통해 사용자에게 적극적으 알리는게 좋다.
이런 모든 설정등이 완료되면 최종적으로 이 메서드를 호출해서 통지 객체를 생성한다.!!!
Notification build( )
=>빌더의 모든 메서드는 빌더 자신을 리턴하므로 연쇄적인 호출이 가능하다.
최종적으로 build 메서드를 호출함으로써 통지 객체를 생성한다.
대부분 속성은 빌드 메서드로 지정하지만 통지 객체를 생성한 후에도 필드를 직접 조작할 수 있다.
이전 버전에서는 필드를 직접 조작했지만, 지금은 빌더에 이런 속성들을 변경하는 메서드가 제공되서
가급적이면 빌더를 통해 속성을 설정하는 것이 좋다.
필드 |
설명 |
number |
통지 아이콘에 겹쳐서 출력될 숫자를 지정한다. ex))새로운 메시지 도착했다는 통지라면 메시지 개수 같이 표시할 수 있다. 0이나 음수를 지정하면 숫자가 표시되지 않는다. |
sound |
통지와 함께 출력할 소리를 Uri 객체로 지정한다. |
vibrate |
진동 방식을 지정한다. 진동할 시간과 멈출 시간을 배열로 전달해서 진동 패턴을 지정한다. |
ledARGB |
불빛의 색상을 지정한다. 장비에 장착된 LED 능력에 따라 표현 가능한 색상은 달라진다. |
ledOnMs |
LED 켤 시간과 끌 시간을 1/1000초 단위로 지정한다. 이 두 값은 LED점멸 주기를 지정한다. 정확하진 않지만 장비는 가능한 근접한 시간을 지킨다. |
ledOffMs |
|
defaults |
디폴트로 취할 통지 전달 방식을 지정한다. |
flags |
통지의 동작 방식을 지정한다. |
주로 소리나 진동을 같이 사용하는데 소리 파일이다 진동 패턴을 직접 만들기는 번거롭다.
그래서 시스템은 디폴트 소리와 진동 기능을 제공하고 defaluts필드에 어떤 기능을 사용할건지 지정한다.
'[국비]자바기반 응용SW과정 ' 카테고리의 다른 글
[Android] 안드로이드 ListView와 RecyclerView (0) | 2018.07.12 |
---|