안드로이드 12에서는 알림에 대한 변경이 있어서, PendingIntent를 만들 때 FLAG_MUTABLE 또는 FLAG_IMMUTABLE을 지정해야 합니다. 그렇지 않으면, 알림의 일부 속성을 업데이트하는 동안 예외가 발생할 수 있습니다. 이 포스트에서는 이러한 문제를 해결하기 위한 방법을 살펴보겠습니다.
1. FLAG_IMMUTABLE 또는 FLAG_MUTABLE이란?
FLAG_IMMUTABLE 또는 FLAG_MUTABLE은 PendingIntent에 대한 플래그입니다. PendingIntent는 다른 애플리케이션이나 시스템에서 액세스할 수 있는 권한을 제어하기 위해 사용됩니다. FLAG_IMMUTABLE은 PendingIntent가 생성될 때 읽기 전용으로 설정되며, FLAG_MUTABLE은 PendingIntent가 생성될 때 쓰기 가능하도록 설정됩니다.
2. 문제 해결 방법
FLAG_IMMUTABLE 또는 FLAG_MUTABLE을 사용하여 PendingIntent를 만들 수 있습니다.
API 레벨 30 이전까지, FLAG_IMMUTABLE이 설정되지 않는 한 PendingIntent는 기본적으로 변경 가능했다. 하지만 API 레벨 31 부터는 PendingIntent를 사용하면 FLAG 변수로 FLAG_IMMUTABLE 또는 FLAG_MUTABLE을 사용하여 PendingIntent 사용시 변경 가능성을 명시적으로 지정해야한다(꼭 필요한 경우가 아니라면 FLAG_IMMUTABLE을 사용하도록 개발자 문서에 명시되어있다).
3. 적용 방법
FLAG_MUTABLE 또는 FLAG_IMMUTABLE 플래그를 사용하여 PendingIntent를 만들려면, PendingIntent를 생성하는 모든 코드에서 플래그를 추가해야 합니다. 이를 수행하는 가장 간단한 방법은 PendingIntent를 만드는 메소드에 플래그를 추가하는 것입니다.
예를 들어, NotificationCompat.Builder를 사용하여 알림을 만들 때, 다음과 같이 PendingIntent.FLAG_MUTABLE 플래그를 추가할 수 있습니다.
val intent = Intent(context, MyBroadcastReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_MUTABLE)
val builder = NotificationCompat.Builder(context, channelId)
.setContentTitle(title)
.setContentText(text)
.setSmallIcon(icon)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.build()
NotificationManagerCompat.from(context).notify(notificationId, builder)
4. 다른 해결 방법
위와 같은 방법으로 해결이 안된다면 app gradle의 종속성(dependencies)안에 해당 라이브러리 추가하시면 됩니다.
implementation 'androidx.work:work-runtime-ktx:2.7.0'
5. 결론
FLAG_IMMUTABLE 또는 FLAG_MUTABLE을 사용하여 PendingIntent를 만들지 않으면, Android 12에서 알림에 대한 변경 사항이 발생할 때 예외가 발생할 수 있습니다. FLAG_MUTABLE 또는 FLAG_IMMUTABLE을 사용하여 PendingIntent를 만들 수 있으며, NotificationCompat.Builder를 사용하여 PendingIntent를 만들 때 플래그를 추가할 수 있습니다. 이를 통해 Android 12에서 예기치 않은 예외가 발생하지 않도록 할 수 있습니다
'개발 > Android' 카테고리의 다른 글
[Android] RecyclerView를 동적으로 만들기 (0) | 2023.02.23 |
---|---|
[Android] RecyclerView와 ListView의 차이점 (0) | 2023.02.23 |
[Android] kotlin-android-extensions deprecated (0) | 2023.02.20 |
[Android] Service와 IntentService의 차이점 (0) | 2023.02.17 |
[Android] 기술 면접 질문 50개 모음 (0) | 2023.02.15 |
댓글