[안드로이드] 다이얼로그와 알림 - API 레벨 호환성 고려하기

·2022년 5월 17일
0

Doit 안드로이드

목록 보기
9/12
post-thumbnail

다이얼로그와 알림 - API 레벨 호환성 고려하기

build.gradle 파일을 설명하면서 SDK 버전을 설정하는 targetSdkminSdk에 관해 살펴봤다. 두 항목에 설정하는 값은 API 레벨을 의미하며 앱 개발에 큰 영향을 주는 중요한 정보이다.

  • API 레벨 설정
    minSdk 21
    targetSdk 31

만약 위와 같이 설정했다면 targetSdk에 설정한 31 버전의 API로 앱을 개발한다는 의미이다. 그런데 minSdk를 21로 지정했으므로 이 앱은 21 버전 (안드로이드 5.0 롤리팝) 기기부터 설치할 수 있다. 결국 이 앱은 31 버전의 API로 개발하지만 21 버전 기기에서도 오류가 발생하지 않고 동작해야 한다.

따라서 앱을 개발할 때 minSdk 설정값보다 상위 버전에서 제공하는 API를 사용한다면 호환성(compatibility)를 고려해야 한다. 예를 들어 안드로이드 API 문서 에서 Notification 이라는 클래스를 찾으면 밑 그림처럼 소개하고 있다.

클래스 이름 위에 'Added in API level 1'이라고 표시된 정보는 이 클래스가 API 레벨 1에 추가되었다는 것을 나타낸다. 따라서 Notification 클래스는 minSdk를 21로 설정한 앱에서 API 레벨 호환성 문제가 발생하지 않는다.

그런데 Notification.CallStyle 이라는 클래스는 API 레벨이 31이다. 즉, 31 버전에서 추가된 클래스

Notification.CallStyle 클래스는 31 버전 하위에서는 제공하지 않으므로 이 클래스를 사용해 입을 개발하면 31 버전 하위 기기에서는 오류가 발생한다.

즉, 사용할 API가 추가된 상위 버전에서는 문제가 없지만 하위 버전에서는 오류가 발생한다. 이처럼 API 레벨 호환성 문제가 발생하는 클래스나 함수를 사용하면 안드로이드 스튜디오에서 경고나 오류 메시지를 표시한다.

메시지를 보면 앱의 minSdk가 21로 지정되었으므로 Notification.CallStyle 클래스를 사용하면 문제가 발생한다는 의미다. 이처럼 API 레벨 호환성에 문제가 있는 API를 사용할 때는 @기호로 시작하는 애너테이션(annotation)을 추가해 오류를 해결할 수 있다.

-API 호환성 애너테이션 1

@RequiresApi(Build.VERSION_CODES.S)
fun noti(){
	(...생략...)
	val builder : Notification.Builder = Notification.Builder(this, "1")
    .setStyle(Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent)
    )
    (...생략...)
}

@RequiresApi 애너테이션 또는 @TargetApi 애너테이션을, API 레벨 호환성에 문제가 있는 API를 사용한 함수나 클래스 선언부 위에 추가하면 오류가 발생하지 않는다.

-API 호환성 애너테이션 2

@TargetApi(Build.VERSION_CODES.S)
fun noti(){
	(...생략...)
	val builder : Notification.Builder = Notification.Builder(this, "1")
    .setStyle(Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent)
    )
    (...생략...)
}
profile
SOOP

0개의 댓글