RequirementsApi 대 TargetApi 안드로이드 주석


98

RequiresApi과 의 차이점은 TargetApi무엇입니까?

kotlin의 샘플 :

@RequiresApi(api = Build.VERSION_CODES.M)
@TargetApi(Build.VERSION_CODES.M)
class FingerprintHandlerM() : FingerprintManager.AuthenticationCallback()

참고 : FingerprintManager.AuthenticationCallbackAPI가 필요합니다.M

참고 2 : TargetApi를 사용하지 않으면 lint 오류가 발생합니다. class requires api level 23...

답변:


87

@RequiresApi -주석이 추가 된 요소가 지정된 API 레벨 이상에서만 호출되어야 함을 나타냅니다.

@TargetApi -Lint는 프로젝트 대상이 무엇이든 관계없이이 유형을 지정된 API 수준을 대상으로 처리해야 함을 나타냅니다.


42

먼저 최소 API 버전이 호출하려는 API보다 낮다고 가정하겠습니다. 왜냐하면 이런 종류의 주석이 의미가있는 곳이기 때문입니다.

@RequiresApi(Build.VERSION_CODES.N_MR1)
public void hello() { // codes that call system apis introduced in android N_MR1}

메서드에 주석이 추가되면 해당 메서드를 호출 할 때마다이 호출에 최소 API 버전보다 높은 API 버전이 필요하다는 멋진 빨간색 경고가 표시되지만 APK를 컴파일하고 빌드하는 것을 중단하지는 않습니다. 내가 테스트 한 것처럼 안드로이드의 낮은 버전에서 충돌합니다.

@TargetApi

이것은 전혀 도움이되지 않으며, 메서드에서 새 API 호출에 대한 경고를 억제하지만 다른 곳에서이 메서드를 호출 할 때 린트 경고가 전혀 발생하지 않으며 여전히 APK를 빌드하고 설치할 수 있습니다. 해당 메서드가 호출되면 충돌이 발생합니다.


2
이 페이지에서 제공되는 다른 답변보다 더 포괄적이고 이해하기 쉽습니다. 따라서 +1.
Anand Kumar Jha

1
이것은 이론 + 실습을 설명하는 유일한 대답이며, 실제로 받아 들여 져야합니다.
Dmitriy Pavlukhin 19.04.25

37

설명서에서 볼 수 있듯이 Mike가 말한 것과 비슷합니다.

주석이 추가 된 요소가 지정된 API 레벨 이상에서만 호출되어야 함을 나타냅니다.

이는 이전 @TargetApi 주석과 목적이 비슷하지만 minSdkVersion을 초과하는 메서드 내에서 경고를 "억제"하는 데 사용되는 것이 아니라 호출자에 대한 요구 사항임을 더 명확하게 표현합니다.

여기에서 볼 수 있듯이 이것은 실제로 IDE / LINT에서 경고를 제거하는 대신 호출자가이 메서드를 호출 할 때 사용 된 API를 확인하도록 강제하는 것입니다.

이것을 @NonNull 또는 @Null 주석과 비교할 수 있으며, 호출자가 null 값을 함수에 보낼 수 있거나 보낼 수 없도록 강제합니다.


21

https://developer.android.com/reference/android/support/annotation/RequiresApi.html 의 JavaDocs에서 :

[@RequiresApi] 이것은 이전 @TargetApi 주석과 목적이 비슷하지만, 이것이 minSdkVersion을 초과하는 메서드 내에서 경고를 "억제"하는 데 사용되는 것이 아니라 호출자에 대한 요구 사항임을 더 명확하게 표현합니다.

기능적으로는 동일하지만 @RequiresApi더 새로운 것으로 보이며 더 많은 기능을 포함하도록 확장 될 가능성이 더 높습니다.


@Penn Care가 왜 이것이 거짓인지 설명합니까?
hamena314

6

둘 다 다른 API 수준에 영향을주지 않고 새로운 Android API 수준에 추가 된 기능을 처리하기위한 것입니다.

필요 API

@RequiresApi(api = Build.VERSION_CODES.*api_code*)

여기에서는 주석이 달린 요소가 지정된 API 수준 이상에서만 호출되어야한다고 말합니다. 지정된 API 수준 아래의 주석이 추가 된 요소는 호출되지 않습니다.

TargetApi

@TargetApi(Build.VERSION_CODES.*api_code*)

Lint가 프로젝트 대상이 무엇이든 관계없이이 유형을 지정된 API 수준을 대상으로 처리해야 함을 나타냅니다. 지정된 API 수준에만 해당됩니다. 다른 API 수준에서는 호출되지 않습니다.


@RequiresApi내가을 사용할 때 AS는 빨간색으로 메서드 호출에 밑줄을 긋고 전체 클래스에도 오류가 포함되어 있습니다.
CoolMind

@CoolMind 어떤 메서드에서 "@RequiresApi"를 사용 했습니까?
jeevan venugopal

아니요, 같은 메서드 앞에 추가했습니다 @TargetApi.
CoolMind

@CoolMind는 호출하는 메서드에 "@RequiresApi"를 사용합니다. 또는 이와 같이 전화를 둘러싸십시오. if (Build.VERSION.SDK_INT> = Build.VERSION_CODES. * api_code *) {// 메서드 이름}
jeevan venugopal

예, if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {작동하지만 이미 방법에 있습니다. 감사!
CoolMind
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.