알림 띄우기
알림 구성
액션
알림에는 터치 이벤트 외에도 액션을 최대 3개까지 추가할 수 있습니다. 알림에서 간단한 이벤트는 액션으로 처리합니다. 알람 앱의 알람 취소, 전화 앱의 전화 수신이나 거부 등이 대표적인 예입니다.
액션도 사용자 이벤트 처리가 목적입니다. 따라서 알림 터치 이벤트와 마찬가지로 사용자가 액션을 터치할 때 실행할 인텐트 정보를 PendingIntent로 구성해서 등록해야 합니다. 실제 사용자가 액션을 터치하면 등록된 인텐트가 시스템에서 실행되어 이벤트가 처리되는 구조 입 니다. 액션을 등록할 때는 addAction() 함수를 이용합니다.
액션 등록 함수
open fun addAction(action: Notification.Action!): Notification.Builder
매개변수로 액션의 정보를 담는 Action 객체를 전달합니다. Action 객체는 Action.Builder로 만듭니다.
액션 빌더 생성자
Builder(icon: Int, title: CharSequence!, intent: PendingIntent!)
액션 등록하기
val actionIntent = Intent(this, OneReceiver::class.java)
val actionPendingIntent = PendingIntent.getBroadcast(this, 20, actionIntent,
PendingIntent.FLAG_IMMUTABLE)
builder.addAction(
NotificationCompat.Action.Builder(
android.R.drawable.stat_notify_more,
"Action",
actionPendingIntent
).build()
)
원격 입력
원격 입력 원격 입력 이란 알림에서 사용자 입력을 직접 받는 기법입니다. 원격 입력도 액션의 한 종류입니다. RemoteInput에 사용자 입력을 받는 정보를 설정한 후 액션에 추가하는 구조입니다.
val KEY_TEXT_REPLY = "key_text_reply"
var replyLabel: String = "답장"
var remoteInput: RemoteInput = RemoteInput.Builder(KEY_TEXT_REPLY).run {
setLabel(replyLabel)
build()
}
RemoteInput.Builder에 정보를 설정한 후 RemoteInput 객체를 생성합니다. 빌더에 들어가 는 정보는 이 RemoteInput의 입력을 식별하는 값과 입력란에 출력되는 힌트 문자열입니다. 식별 값은 개발자가 임의로 작성할 수 있으며 사용자가 입력한 글을 가져올 때 사용됩니다. 그런데 RemoteInput은 API 레벨 20에서 추가되었습니다. 따라서 앱의 minsdk를 20 아래로 설정했다면 API 레벨 호환성을 고려해서 작성해야 합니다. 이전처럼 조건문을 통해 처리를 해도 되지만 따로 호환성을 돕는 라이브러리가 있습니다. RemoteInput이 정의된 라이브 러리를 임포트 할 때 android.app.RemoteInput이 아닌 androidx.core.app.RemoteInput을 이용하면 됩니다.
RemoteInput도 액션이므로 액션의 터치 이벤트를 처리하기 위한 PendingIntent를 준비합니다.
val replyIntent - Intent(this, ReplyReceiver::class.java)
val replyPendingIntent = PendingIntent.getBroadcast(this, 30, replyIntent,
PendingIntent.FLAG_MUTABLE)
RemoteInput은 알림에서 사용자의 입력을 받는 것이므로 이벤트로 액티비티를 실행해 앱의 화면이 출력되게 하지 않고 브로드캐스트 리시버를 실행해 백그라운드에서 사용자 입력을 처리하는 게 일반적입니다.
원격 입력 액션 등록하기
builder.addAction(
NotificationCompat.Action.Builder(
R.drawable.send,
"답장",
replyPendingIntent
).addRemoteInput(remoteInput).build()
)
알림에서 사용자 입력은 앞의 코드로 처리하면 됩니다. 그런데 전송할 때 실행되는 브로드캐스트 리시버에서 사용자가 입력한 글을 받을 때는 다음과 같은 코드를 사용합니다.
val replyTxt = RemoteInput.getResultsFromIntent(intent)
?.getCharsequence("key_text_reply")
getCharSequence() 함수의 매개변수로 지정한 문자열이 RemoteInput을 만들 때 지정한 식별 값과 같아야 합니다. 또한 브로드캐스트 리시버에서 사용자의 입력 글을 받은 후 알림을 갱신해 줘야 합니다. 이때 RemoteInput의 알림을 띄울 때 사용했던 알림 객체의 식별 값을 지정합니다.
manager.notify(11, builder.build())
이 작업은 알림에 글을 잘 받았다는 신호를 보내는 것입니다. 이렇게 신호를 보내야 알림에서 글을 입력하는 부분이 사라집니다.
참고
https://developer.android.com/reference/android/app/RemoteInput