[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) AlertDialog의 setView() 함수에 뷰 객체 전달함녀 내용영역에 출력됨
[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 객체를 다시 NotificationManager의 Notify()에 대입함 ④ 최종 알림 발생함 |
[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 객체) ④ -> 알림 객체를 NotificationManager의 notify() 함수에 대입하기 ⑤ -> 알림 발생 |
결국 ‘알림’은 NotificationManager의 notify() 함수로 발생시킨다. |
[(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() 함수 이용 -> 알림 구성 정보 설정 ② NotificationManager의 notify() 함수로 알림 띄우기 |
<알림 취소> manage.cancle(식별값)
<알림 취소 막기>
- builder.setAutoCancle(false) //자동 알림 취소 막힘
- builder.setOngoing(true) //알림을 스와이프(손가락으로 밀어도) 취소 막힘
[알림 구성] : 기본 구성 외 추가 구성
▶[알림 터치 이벤트]
-사용자가 알람의 부가 정보 원해서 해당 알림 터치할 경우 -> 알림 자세 정보 띄우기
앱 알림 터치 시 -> [실행 정보]를 Notification 객체에 담아 시스템에 이벤트 실행 의뢰 -> 실제 이벤트 발생 시점에 Notification 객체에 등록된 내용을 시스템이 실행함 |
<시스템에 의뢰 방법> : 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 객체 생성 ③ 원격입력 액션을 등록 |
<(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 코틀린 |
'App(앱)_관련 공부 모음 > [교재] Andorid App_Kotlin 기반' 카테고리의 다른 글
12. [머티리얼 라이브러리] (0) | 2022.03.16 |
---|---|
11. [제트팩 라이브러리] (0) | 2022.03.14 |
09. [리소스 활용] (0) | 2022.03.09 |
08. [사용자 이벤트 처리하기] (0) | 2022.03.09 |
07. [뷰를 배치하는 레이아웃] (0) | 2022.03.08 |