10. [다이얼로그와 알림 이용]

728x90

[10. 다이얼로그와 알림 이용]

-앱에서 사용자에게 특정한 상황을 알려야 할 때가 있다.

-앱에서 사용자에게 특정한 상황알릴 때, 소리/진동/다이얼로그/알림 등을 이용한다.

[10-1. API 레벨 호환성 고려하기]

[API 호환성 고려]

targetSdk: 이 앱을 개발한 API 버전
minSdk: 이 앱 동작을 지원하는 최소 API 버전

-앞서 build.gradle 파일 속 SDK 버전 설정에서 targetSdk, minSdk 설정을 한 적 있다.

-, 앱 개발 시 minSdk 설정값보다 상위 버전에서 제공하는 API를 사용할 경우 호환성 고려

[ API 호환성 애노테이션] : @RequiredApi 애노테이션

-API 레벨 호환성에 문제가 있는 API 사용한 함수/클래스 선언부에 추가함

-이 애노테이션은 단순히 안드로이드 스튜디오에서 오류 무시하는 설정일 뿐

-호환성 문제 해결하려면 직접 코드로 처리 필요 (ex. 특정 버전에서만 실행하도록 처리)


[10-2. 퍼미션 설정하기] : Permission

-퍼미션(Permission) : 앱의 특정 기능에 부여하는 접근 권한

사용  내가 만든 앱을 다른 앱에서 사용할 수 없도록 보호해야 할 때

        ➁ 안드로이드 시스템에서 보호하는 특정 기능사용해야 할 때

  ➀ 외부 앱과 연동 시 퍼미션 사용 설정

[퍼미션 설정과 사용 설정]

-ex) A앱 컴포넌트를 B앱에서 사용하고 싶은데, A앱이 퍼미션 설정해놓은 상태이면                                                                                                            B앱에서는 반드시 해당 퍼미션 이용하겠다고 사용 설정필요

-A앱은 메니페스트 파일에 <permission> 태그로 퍼미션 설정

-B앱은 메니페스트 파일에 <uese-permission> 태그로 사용 설정

[ <permission> 태그 설정 속성]

name 퍼미션 이름 (구분 식별자)
label / description 퍼미션 정보 설명
protectionLevel 퍼미션 보호 수준

     . protectionLevel 의 보호수준 값

normal 낮은 수준 보호. 사용자에게 따로 권한 허용 요청X
dangerous 높은 수준 보호. 사용자에게 권한 허용 요청 O
signature 같은 키로 인증한 앱만 실행 O
signatureOrSystem 안드로이드 시스템 앱/같은 키 인증 앱만 실행 O

[주의]

-메니페스트 파일에 <permission> 설정했다고 바로 컴포넌트 보호되는 것 X

-<permission> 설정 후 -> 이 퍼미션으로 보호할 대상 컴포넌트에 적용해야 함

-android:permission 속성을 이용해서 대상 컴포넌트에 퍼미션 적용해야


  안드로이드 시스템에서 보호하는 기능 사용 시 퍼미션 사용 설정

[대표적인 시스템 보호 기능]

위치 정보 접근 ACCESS_FINE_LOCATION
네트워크 정보 접근 ACCESS_NETWORK_STATE
와이파이 네트워크 정보 접근 ACCESS_WIFI_STATE
배터리 정보 접근 BATTERY_STATS
블루투스 장치에 연결 BLUETOOTH
블루투스 장치를 검색하고 페어링 BLUETOOTH_ADMIN
카메라 장치에 접근 CAMERA
네트워크 연결 INTERNET
외부 저장소에서 파일 읽기 READ_EXTERNAL_STORAGE
외부 저장소에 파일 쓰기 WRITE_EXTERNAL_STORAGE
전화기 정보 접근 READ_PHONE_STATE
문자 메시지 발신 SEND_SMS
문자 메시지 수신 RECEIVE_SMS
부팅 완료 시 실행 RECEIVE_BOOT_COMPLETED
진동 울리기 VIBRATE

[퍼미션 허용 확인]

-API 레벨 23 버전 이전 : 신고제 (퍼미션 이용 선언만 하면 사용 가능했음)

-API 레벨 23 버전 이후 : 허가제 (퍼미션 이용 선언 + 사용자에게 권한 허용 받기)

              -따라서, 23버전 이후부터는 사용자가 퍼미션 허용 여부 확인 필요해짐

▶[사용자 퍼미션 허용 확인 함수] : checkSelfPermission() 함수 이용

open static fun chechSelfPermission(
     @NonNull context: Context, //첫 번째 매개변수
     @NonNull permission: String //두 번째 매개변수(퍼미션 구분 이름)
): Int    //반환값은 ‘하나의 상수’값

          <반환되는 상수값> : 권한허용/거부

PackageManager.PERMISSION_GRANTED 권한 허용한 경우 반환 상수값
PackageManager.PERMISSION_DENIED 권한 거부한 경우 반환 상수값

 

             -만약 용자가 권한 거부한 경우, 다시 사용자에게 해당 퍼미션 허용을 요청해야 함

[사용자에게 퍼미션 허용 요청 함수] :registerForActivityResult() 함수 이용

- 이 함수는 ActivityResultLauncher 타입 객체를 반환한다.

-ActivityResultLauncher 타입 객체 -> 액티비티에서 결과를 돌려받아야 할 때 사용

public final <I, O> ActivityResultLauncher<I> registerForActivityResult (
     @NonNull ActivityResultContract<I, O> contract,   //첫 번째 매개변수 = 요청의 종류 받음
     @NonNUll ActivityResultCallback callback)    //두 번째 매개변수 = 결과받았을 때 호출되는 ‘콜백함수’

 

-요청 결과는 함수의 두 번째 매개변수로 등록된 콜백으로 전달된다.-rigisterForActivityResult() 함수로 ActivityResultLauncher 객체 만들었다면,                                                                                                 필요한 곳에서 이 객체의 launch() 함수 호출하여 요청을 실행함


   <사용 예시>

[퍼미션 허용 요청 확인] : registerForActivityResult() 함수 사용

val requestPermissionLauncer = registerForActivityResult (
         ActivityResultContracts.RequestPermission()     //첫 번째 매개변수로 요청 정보객체
) { isGranted ->                            //두 번째 매개변수로 람다식 콜백함수 { }
     if(isGranted) {
         Log.d(“kkang”, “callback, granted..”)
     }else{
         Log.d(“kkang”, “callback, denied..”)
     }
}

[퍼미션 허용 요청 실행] : 반환받은 ActivityResultLauncher 객체의 launch() 함수 호출

requestPermissionLaungher.launch (“android.permission.ACCESS_FINE_LOCATION”)

[10-3. 다양한 다이얼로그]

-다이얼로그(Dialog) : 사용자와 상호작용하는 대화상자

           ex. 토스트/날짜 또는 시간 입력/알림 창/커스텀 다이얼로그 등

[토스트 메시지 띄우기] : Toast

-토스트(Toast) : 화면 아래쪽에 잠깐띄우는 문자열 의미. 간단한 메시지 알림

     ➀ Toast의 makeText() 함수로 만들기

makeText (context,  출력문자열출력지속시간상수 )

            <출력 지속 시간 상수>

Toast.LENGTH_SHORT 3초 지속
Toast.LENGTH_LONG 5초 지속

-makeText() 함수로 만든 토스트는 show() 함수로 화면에 출력한다.

      세터(Setter) 함수로 만들기

-setDutation() /setText() 함수 : 문자열/화면에 보이는 시간 설정 세터함수

-setGravity() /setMargin() 함수 : 토스트가 뜨는 위치 지정 세터함수


[토스트의 콜백 등록 -> 특정 로직 수행]

-토스트가 화면에 보이거나 사라지는 순간을 콜백으로 감지해서 특정 로직을 수행 O

-<토스트의 콜백 등록 방법>

토스트 객체의 addCallback() 함수Toast.Callback 타입 객체 등록

이렇게 하면 화면에 토스트 뜨는 순간 콜백객체의 onToastShown() 함수 자동 호출되고
                          토스트 사라지는 순간 onToastHidden() 함수 자동 호출됨

-, 이 콜백 기능은 API 30버전에서 추가했으므로 API 레벨 호환성 고려해서 작성 필수


[피커 다이얼로그] : 날짜나 시간 입력받기

-날짜 입력 : ‘데이트피커 다이얼로그 이용

-시간 입력 : ‘타임피커 다이얼로그 이용

  ▶[데이트 피커 다이얼로그 생성자]

DatePickerDialog( context:Context,  listener:DatePickerDialog.OnDateSetListener? ,
                        year:Int, month:Int, dayOfMonth:Int )

-두 번째 매개변수로 DatePickerDialog.OnDatePickerDialog.OnDateSetListener 구현 객체 등록 시,                                                                                                           다이얼로그에서 사용자가 설정한 날짜를 콜백함수로 얻을 수 있음

-month 값은 0부터 1월 의미. (0~11)

  [타임 피커 다이얼로그 생성자]

TimePickerDialog( context:Conext, listener:TimePickerDialog.OnTimeSetListener! ,
                        hourOfDay:Int, minute:Int, is24HourView: Boolean )

-두 번째 배개변수로 TimePickerDialog.OnTimeSetListener 구현 객체 지정 시,                                                                                                                              사용자가 다이얼로그에서 설정한 시간을 얻을 수 있음

-처음 보이는 시간은 Int 타입으로 지정

-is24HourView의 값 : false 지정시 오전/오후 선택 필수.


[알림 창 띄우기] : AlertDialog

-알림 창 : AlertDialog

   -단순히 메시지 출력 or 다양한 화면 출력 가능

-알림 창 : 제목/내용/버튼 3가지 영역 구분

-항상 3가지 영역 있는 것은 X

-알림 창의 생성자 접근 제한자 : protected 이므로 객체 직접 생성해서 접근 X

-대신 AlertDialog.Builder 제공 -> 빌더를 이용하여 알림창을 만든다.

  <알림창 빌더로 알림창 생성>

AlertDialog.Builder(context: Context!) // 알림창 빌더로 알림창 생성

  <알림창에 아이콘/제목/내용지정 함수>

setIcon() 아이콘 지정. 제목 영역에 아이콘 출력
setTitle() 제목 지정. 제목 문자열 출력
setMessage() 내용 지정. 내용 문자열 출력

  <알림창에 버튼지정 함수>

-알림창 버튼 최대 3개까지 추가 가능

-같은 함수 중복될 경우 하나만 나타남

-버튼 함수를 3가지로 구분 이유 : 이벤트 핸들러에서 버튼 종류 구분 쉽게하기 위함

-두 번째 매개변수인 이벤트 핸들러에 null 대입 가능함 (그래도 버튼 클릭 시 창 닫힘)

setPosiiveButton (버튼 문자열 / 버튼 클릭 이벤트 핸들러)
setNegativeButton (버튼 문자열 / 버튼 클릭 이벤트 핸들러)
setNeutralButton (버튼 문자열/ 버튼 클릭 이벤트 핸들러)

EX) 버튼 알림창 띄우기

AlertDialog.Builder(this).run {

     setTitle(“test dialog”)
     setIcon(android.R.drawable.ic_dialog_info)
     setMessage(“정말 종료하겠습니까”)
     setPositiveButton(“OK”, null)
     setNegativeButton(“Cancle”, null)
     setNeutralButton(“More”, null)
     show()
}

EX) 버튼의 이벤트 핸들러 등록

-알림창 클릭 시 자동 호출되는 onClick() 함수의 두 번째 매개변수 = 이벤트 발생 버튼 정보

-setPositiveButton() 함수로 만든 버튼 이벤트 구분자->DialogInterface.BUTTON_POSITIVE

-setNegativeButton() 함수로 만든 버튼 이벤트 구분자-> DialogInterface.BUTTON_NEGATIVE

val eventHandler = object: DialogInterface.OnClickListener {

    override fun onClick (p0: DialogInterface? , p1:Int) {

       if(p1 == DialogInterface.BUTTON_POSITIVE) {
         Log.d(“kkang”, “positive button click”)

       }else if (p1 == DialogInterface.BUTTON_NEGATIVE) {
         Log.d(“kkang”, “negative button click”)
       }
    }
}
. . .(생략)
setPositiveButton(“OK”, eventHandler)
setNegativeButton(“Cancle”, eventHandler)

<알림창 내용 영역에 목록출력> : 내용에 목록을 제공하고 목록 중 하나를 출력하기

setItems ( 목록배열정보 / 이벤트핸들러 )
setMultiChoiceItems ( 목록배열정보 / 처음체크상태지정 / 이벤트핸들러)
setSingleChoiceItems ( 목록배열정보/ 처음선택할항목지정/ 이벤트핸들러)

   [부연설명]

-setItems() : 사용자가 항목 선택 시 onClick() 자동 호출
               : 사용자가 선택한 항목 인덱스를 onClick()메소드 두 번쨰 매개변수로 전달함

-setMultiChoiceItems() : 다중 선택 체크 박스 항목.
                              :사용자가 항목 선택 시 onClick() 자동 호출
                             : 사용자 선택한 항목 인덱스를 onClick()메소드 두 번째 매개변수로 전달
                             : 세 번째 매개변수로 체크 상태전달

-setSingleChoiceItems() : 하나만 선택가능한 라디오 버튼 항목.

<알림창 닫기 속성 설정 함수> : '사용자의 행동'에 따라 알림창 닫을지 여부 설정

setCancleable() 사용자가 뒤로 가기버튼 클릭 시.

매개변수값 true = 닫힘
               false = 안닫힘
setCancledOnTouchOutside() 사용자가 알림창 바깥 영역클릭,

매개변수값 true = 닫힘
               false = 안닫힘

[커스텀 다이얼로그 만들기]

-커스텀 다이얼로그 : 개발자가 원하는 형태로 창을 구성함

-AlerDialog 클래스 이용

-LayoutInflater 클래스 이용 : 레이아웃 XML 파일을 코드에서 초기화 기능 제공

                                *초기화 : XML 파일에 선언한 뷰를 코드에서 이용하고자 생성하는 작업XML 파일 자체는 텍스트 파일에 불과함

결국 코드에서 XML 파일을 사용하려면 XML에 선언해준 대로 객체 생성 후 메모리 할당 필요.
이 작업을 LayoutInflater가 해주기 때문에 필요한 것

+ ) 지금까지 레이아웃 XML 파일은 코드에서 사용 시 setContentView() 이용했다.
-다만, LayoutInflater를 사용하는 이유는 XML파일이 레이아웃 XML 파일 외에도  떄문
액티비티 화면 목적 외의 XML 파일을 코드에 가져와서 사용을 위한 작업이라 생각해라

[LayoutInflater로 레이아웃 XML 파일 초기화 작업]

      ➀ getSystemService() 함수로 LayoutInflater를 얻기.

          초기화할 레이아웃 XML파일 정보를 매개변수로 전달하여 inflate() 함수 호출

                           *inflate() 반환값은 XML의 루트 뷰 객체

      ➁ 뷰 바인딩 기법

          초기화할 XML 파일에 해당하는 바인딩 클래스의 inflate() 함수 호출하여

           layoutInflater 객체 전달해주면 자동으로 초기화 후 루트 뷰 객체 얻을 수 O


[커스텀 다이얼로그 만드는 방법]

1) 다이얼로그 구성 레이아웃 XML 파일 만들기

2) XML 파일을 LayoutInflater로 초기화해서 다이얼로그에 적용

3) AlertDialogsetView() 함수에 뷰 객체 전달함녀 내용영역에 출력됨


[10-4. 소리와 진동 알림]

[소리 알림]

-알림음 : 사용자에게 짧은 소리로 특정 상황 알리는 음

[시스템에 등록된 소리 이용 방법]

-안드로이드 시스템이 제공하는 알림/알람/벨소리 등의 소리는 RingtonManager로 얻을수 O

  ① RingtonManager.getDefaultUri() 함수 이용해 소리 식별값 (Uri타입) 얻기
  ② 이 식별값을 RingtonManager.getRingtone() 함수의 두 번째 매개변수로 전달 후
                                                                        소리 재생 가능한 Ringtone 객체 얻음.
  ③ 얻은 Ringtone 객체의 play() 함수 호출 -> 소리 재생됨

<소리 얻기 코드>

val notification: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
              //소리 식별값 얻기 
val ringtone = RingtoneManager.getRingtone(applicationContext, notification) 
                                  //소리 식별값을 두 번째 매개변수로 넣고 Ringtone객체 얻음
ringtone.play() 
         //얻은 Ringtone 객체의 play() 호출하여 소리 재생됨

 

[앱 자체 음원 준비해서 재생하는 방법]

-음원 파일을 res/raw 디렉터리에 리소스로 등록해서 사용함

-음원 재생 클래스 : MediaPlayer 클래스  : 이 클래스에 리소스 정보 지정 후 start() 함수 호출하면 음원 재생됨

val player: MediaPlayer = MediaPlayer.create(this, R.raw.fallbackring) 
                                                   //리소스 정보 지정
player.start() // 음원 재생

 


[진동 알림]

-매니페스트 파일에<uses-permission> 으로 진동에 대한 퍼미션(허가) 얻어야 함

<uses-permission android:name=“android.permission.VIBRATE” />

-진동은 Vibrator 클래스 이용

31버전 이전 : VIBRATOR_SERVICE 로 식별되는 시스템 서비스 이용했음
31버전이후 : VIBRATOR_MANAGER_SERVICE로 식별되는 VibratorManager라는 시스템 서비스 얻고
                                                                                                  이 서비스에서 Vibrator 이용해야 함

<진동 객체 얻기>

val vibrator = if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    val vibratorManager = this.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) 
                           as VibratorManager
    
    vibratorManager.defaultVibrator;
} else{
   
   getSystemService(VIBRATOR_SERVICE) as Vibrator
}

 

[진동에 시간과 패턴 지정] : API 레벨 1부터 제공 함수 O

   : 이 진동함수는 26버전부터 depercated 되었다. (사용 보장X)

    : 결국 API 레벨 호환성 고려해야 함

  1) open fun vibrate(milliseconds: Long) : Unit
  2) open fun vibrate(pattern:LongArray!, repeat: Int) : Unit

  1) 함수는 매개변수 1: 진동 울리는 시간을 Long 타입 매개변수로 가짐

  2) 함수는 매개변수 2: 진동패턴배열, 패턴반복횟수를 매개변수로 가짐

[진동 세기 지정] : API 레벨 26부터 제공 함수 O

-API 레벨 26버전부터 진동 정보를 VibrationEffect 객체로 지정하여 사용하는 함수 제공 O

<진동 알림 함수> vibrate() 함수 : VibrationEffect 객체를 매개변수로 지정

open fun vibrate (vibe: VibrationEffect! ) : Unit

 

 -> VibrationEffect 객체로 진동 울리는 시간, 진동의 세기 제어 가능 O

        <VibrationEffect 객체 반환하는 함수>

              : 이 함수들로 만든 VibrationEffect 객체를 받아서 vibrate() 함수에 대입

    ① 진동 정보 지정 함수 : createOneShot() 함수

[설명] createOneShot( 진동시간, 진동세기 )
[정의] open static fun crateOneShot(milliseconds: Long, amplitude: Int) : VibrationEffect!

    ② 진동 반복 지정 함수 : crateWaveform() 함수

[설명] createWaveform( 진동시간패턴배열, 진동세기패턴배열, 패턴반복횟수)
[정의] open static fun createWaveform(timings : LongArray!, amplitudes: IntArray!, repeat: Int)
: VibrationEffect!

[10-5. 알림 띄우기]

[알림 채널]

-상태 바: 화면 상단 한 줄. 배터리/네트워크/시간 등 시스템 상태 정보출력됨

-알림(notification) : 상태 바에 앱 정보 출력하는 것

-상태 바는 기본적으로 시스템이 관리하므로, 앱이 직접 제어 불가능
-다만, 우회해서 앱이 시스템에 의뢰하고, 시스템이 관리하는 상태 바에 앱 알림 출력 O
-알림을 위해 제공하는 API 이용해야 함

[구조]

    ① NotificationChannel로 알림 채널 만듬
    ② 빌더에 정보 대입하여  Notification객체 만듬
    ③ Notification 객체를 다시 NotificationManagerNotify()에 대입함
    ④ 최종 알림 발생함

[NotificationCompat.Builder 빌더 만드는 방법]

-API 26버전 이전: Builder(context:Context) 생성자로 생성 (사용 권장X)

-API 26버전 이후

       Builder(context:Context, channelld:String! ) 생성자로 생성

                                           //채널 식별값을 지정해줌

[’채널개념 추가]

-앱의 알림을 채널단위로 구분하려는 의도

-덕분에 사용자 환경 설정에서 앱의 알림을 채널별로 구분‘->받고 싶은 채널 알림만 선택O

[알림 채널 생성자]

NoitficationChannel(id: Sring! , name: CharSequence!, importance: Int)

                             (채널 식별값 / 채널 이름 / 알림 중요도 상수) 매개변수로 지정

<알림 중요도 상수 종류>

NotificationManager.IMPORTANCE_HIGH 긴급 상황. 알림울림O. 헤드업 표시
NotificationManager.IMPORTANCE_DEFAULT 높은 중요도. 알림울림O
NotificationManager.IMPORTANCE_LOW 중간 중요도. 알림울림X
NotificationManager.IMPORTANCE-MIN 낮은 중요도. 알림X 상태바 표시X

<알림 채널정보 설정> : 함수/프로퍼티 등으로 설정 가능

setDescription( ) 채널 설명 문자열
setShowBadge( ) 홈 화면. 배지 아이콘 출력 여부
setSound( ) 알림음 재생
enableLights( ) 불빛 표시 여부
setLightColor( ) 표시될 불빛 색상
enableCibration( ) 진동 울림 여부
setVibrationPattern( ) 진동 패턴

[알림 띄우기 과정]

NotificationChannel알림 채널 만들기
-> 이 채널의 정보 대입해서 알림 빌더 만들기
-> 알림 빌더로 알림 객체 만들기 (Notification 객체)
-> 알림 객체를 NotificationManagernotify() 함수에 대입하기
-> 알림 발생
결국 알림NotificationManagernotify() 함수로 발생시킨다.

[(1) 알림 채널 -> (2) 알림 빌더 만들기]

val manager = getSystemSerice(NOTIFICATION_SERVICE) as NotificationManager //매니저 받고
val builder : NotificationCompat.Builder //빌더 받고 

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.0) {  //일정 API 버전 이상이면 
   val channelId = “one-channel” //채널 ID 지정
   val channelName = “My Channel One”//채널 name
   val channel = NotificationChannel(  //(1) 알림 채널 객체 생성 (기본 정보) 
       chennelId,
       chennelName,
       NotificationManager.IMPORTANCE_HIGH
)
    //-> 알림 채널에 추가 정보 설정 
    channel.description = “My Channel One Descriptio”
    channel.setShorBadge(true)
    val uri:Uri = RingtoneManager.getDefaultUri(FingtoneManager.TYPE_NOTIFICATION)
    val audioAttributes = AudioAttributes.Builder()
        .setContentType(AudioAttributes.Builder()
        .setUsage(AudioAttributes.USAGE_ALARM)
        .build()
    channel.setSound(uri, audioAttributes)
    channel.enableLights(true)
    channel.lightColor = Color.RED
    chnnel.enableVibration(true)
    channel.vibrationPattern = longArrayOf(100, 200, 100, 200)

    //알림채널을 NotificationManager에 등록 
    managet.createNotifiacationChannel(channel)

    //알림채널 정보 대입해서 (2) ‘알림빌더’ 생성 
    builder = NotificationCompat.Builder(this, channelId)
} else {
    builder = NotifiactionCompat.Builder(this)
}
 

[알림 객체] : 알림 빌더 이용 -> 알림 객체 만들기 (Notifiaction 객체)

Notification 객체 : 출력할 이미지/문자열 정보 담음

스몰 아이콘 :알림 발생 시, 상태 바 끌어내리면 간략한 알림 정보

알림 정보구성 = [스몰 아이콘/발생 시각/ 제목/내용 ]

- 알림 객체(Notification 객체)  ’알림 정보 설정해야 함

알림 빌더setter() 함수 이용 -> 알림 구성 정보 설정
NotificationManagernotify() 함수로 알림 띄우기

<알림 취소> manage.cancle(식별값)

<알림 취소 막기>

- builder.setAutoCancle(false) //자동 알림 취소 막힘

- builder.setOngoing(true) //알림을 스와이프(손가락으로 밀어도) 취소 막힘


[알림 구성] : 기본 구성 외 추가 구성

[알림 터치 이벤트]

-사용자가 알람의 부가 정보 원해서 해당 알림 터치할 경우 -> 알림 자세 정보 띄우기

앱 알림 터치 시 -> [실행 정보]Notification 객체에 담아 시스템에 이벤트 실행 의뢰
-> 실제 이벤트 발생 시점에 Notification 객체에 등록된 내용을 시스템이 실행함
-, ’알림관리는 시스템관할 (, 일반 앱 터치 이벤트 onTouchEvent() 로 구현 X)

<시스템에 의뢰 방법> : intent(인텐트) 필요

-사용자 알림 내용 터치 시, 원하는 앱 컴포넌트 실행하기 위해서는 ’인텐트‘가 있어야 함

intent(인텐트) 준비
PendingIntent 객체 생성. (컴포넌트별 실행 의뢰함수 제공) : 이벤트 실행 정보 객체
알림 객체에 실행 정보 (pendingIntent 객체) 등록 : setContentIntent() 함수 이용
val intent = Intent(this, DetailActivity::class.java) //(1) 인덴트 준비
val pendingIntent = //(2) 펜딩인텐트 객체 생성 
    PendingIntent.getActivity(this, 10, intent, PendingIntent.FLAG_IMMUTABLE)
builder.setContentIntent(pendingIntent) //(3) 알림 객체에 등록

[액션]

-액션 : 간단한 이벤트 처리 시 사용 (사용자 이벤트 처리 목적)

-액션은 최대 3개까지 추가 가능

-앱 터치 시 실행 인텐트 정보를 PendingIntent로 구성해서 등록해야 함

-사용자가 액션 터치 시, 등록된 인텐트가 시스템에서 실행되어 이벤트 처리되는 구조

<Action 객체 생성>
Builder(이미지 정보. 액션 문자열, pendingIntent객체)


<객체를 액션에 등록> : addAction() 함수 이용

<액션 등록하기>

val actionIntent = Intent(this, OneReceiver::class.java) //인텐트 준비
val actionPendingIntent = PendingIntent.getBroadcast(this, 20, actionIntent, PendingIntent.FLAG_IMMUTABLE) 
                                                                                  //펜딩 이벤트 객체 생성 
builder.addAction( // 액션 등록 
         //Action 객체 생성 
        NotificationCompat.Action.Builder(  
                 android.R.drawable.stat_notify_more, //아이콘 이미지 정보
                 “Action”,                  //액션 문자열 
                 actionPendingIntent       //pendingIntent 객체 
        ).build() 
)

 

[원격 입력] : ‘간단한사용자 입력은 앱 화면 통하지 않고 직접 액션에서 받아 처리 가능

-‘원격입력’ : 알림에서 사용자 입력 직접 받는 기법

-원격 입력도 액션의 한 종류 (-> PendingIntent 이용)

RemoteInput 에 사용자 입력받는 정보 설정 -> 액션에 추가하는 구조

-RemoteInput.Builder 에 정보 설정 후 RemoteInput 객체 생성함

RemoteInput 객체 생성
intent 준비 -> pendingIntent 객체 생성
원격입력 액션을 등록
-API 20 에 추가된 것이므로. API 레벨 호환성->androidx.core.app.RemoteInput 임포트

 

<(1) RemoteInput 객체 생성 >
val KEY_TEXT_REPLY = “key_text_reply”
var replyLabel : String = “답장”
var remoteInput:RemoteInput = RemoteInput.Build(KEY_TEXT_REPLY).run{
                                       //입력 식별값 
    setLabel(replyLabel) //힌트 문자열 지정 
    build()
}
<(2) Intent 준비 >
val replyIntent = Intent(this, ReplyReceiver::class.java)
val replyPendingIntent = PendingIntent.getBroadcast(this, 30, replyIntent, PendingIntent.FLAG_MUTABLE)
<(3) 원격 입력 액션 등록>
builder.addAction( 
      NotificationCompat.Action.Builder(
            R.drawable.send, 
            “답장”. 
            replyPendingIntent
      ).addRemoteInput(remoteInput).build() //RemoteInput 객체를 전달 
)
 
<추가>
 
[ + 전송할 때 실행되는 브로드캐스트 리시버에서 사용자 입력값 받을 때? ]

<반드시 알림 갱신 필요> : manager.notify(11, builder.build() )
val replyTxt = RemoteInput.getResultsFromIntent(intent)
              ?.getCharSequence(“key_text_reply”)
 

[알림 프로그레스 바] : progress bar

-어떤 작업 시간 오래 걸릴 경우 일의 진행 상황을 프로그레스 바로 알려줌

open fun setProgress(max: Int, progress: Int, indeterminate: Boolean) :Notification.Builder

-두 번째 매개변수 진행값을 스레드 이용해서 계속 바꿔가며 상황 알려주면 됨


[알림 스타일] : 다양한 알림 콘텐츠 구성

[큰 이미지 스타일] : BigPictureStyle 이용

-ex. 폰 화면 캡쳐 알림

builder.setStyle (BigPictureStyle 객체 대입 )

[긴 텍스트 스타일] : BigTextStyle 이용

ex. 이메일 수신알림

builder.setStyle (BigTextStyle 객체 대입)

[상자 스타일] : InboxStyle 이용

-하나의 알림에 문자열 여러 개 나열 시 사용

builder.setStyle (InboxStyle 객체 대입)

[메시지 스타일] : Message 객체 이용

-메시지 정보 구성 : [메시지내용/시각/보낸사람]

보낸 사람 Person 객체 생성
Message 객체 생성 : Person 객체를 Message 객체에 대입
MessageStyle 객체에 Message 객체 대입
(1) Person 객체 생성 
val seder: Person = Person.Builder()
    .setName(“kkang”)
    .setIcon(...)
    .build()

(2) Message 객체 생성 
val message1 : NotificationCompat.MessagingStyle.Message(
    “hello”,    //내용
    System.currentTimeMillis(), //시각
    sender1 //보낸 사람 Person 객체 대입
)

(3) MessageStyle에 Message 객체 대입
val messageStyle = NotificationCompat.MessagingStyle(sender)
    .addMessage(message1)
builder.setStyle(messageStyle)

[10-6. 카카오톡 알림 만들] : 실습 

[알림버튼 누르면 -> 알림 발생함]

 
[참고] : Do It 안드로이드 앱 프로그래밍 with 코틀린 

728x90