RequiresApi vs TargetApi андроид андроид

В чем разница между RequiresApi и TargetApi?

Образец в kotlin:

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

ПРИМЕЧАНИЕ: FingerprintManager.AuthenticationCallback требуется api M

ПРИМЕЧАНИЕ 2: если я не использую ошибку TargetApi lint с ошибкой class requires api level 23...

Ответ 1

@RequiresApi - означает, что аннотированный элемент должен вызываться только на данном уровне API или выше.

@TargetApi - указывает, что Lint должен относиться к этому типу как таргетинг на определенный уровень API, независимо от цели проекта.

Ответ 2

Подобно тому, что сказал Майк, как вы можете видеть в документации:

Обозначает, что аннотированный элемент должен вызываться только на данном уровне API или выше.

Это похоже на более старую аннотацию @TargetApi, но более четко выражает, что это требование для вызывающего, а не используется для "подавления" предупреждений в методе, превышающем minSdkVersion.

Как вы можете видеть здесь, это фактически приводит к тому, что вызывающий агент проверяет API, который использовался при вызове этого метода, вместо того, чтобы просто удалять предупреждение из вашей IDE/LINT.

Вы можете сравнить это с аннотациями @NonNull или @Null, они обеспечивают, чтобы вызывающий пользователь мог/не мог отправлять в функцию нулевые значения.

Ответ 3

Из JavaDocs в https://developer.android.com/reference/android/support/annotation/RequiresApi.html:

[@RequiresApi] Это похоже на старую аннотацию @TargetApi, но более четко выражает, что это требование для вызывающего, а не для "подавления" предупреждений в методе, превышающем minSdkVersion.

Я полагаю, что они функционально эквивалентны, но @RequiresApi кажется более новым и имеет более высокую вероятность расширения, чтобы включить больше функциональных возможностей.

Ответ 4

Оба они предназначены для обработки функций, добавленных к новым уровням API Android, не влияя на другие уровни API.

RequiresApi

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

Здесь говорится, что аннотированный элемент должен вызываться только на данном уровне API или выше. Аннотированный элемент ниже данного уровня API не будет вызывать.

TargetApi

@TargetApi(Build.VERSION_CODES.*api_code*)

Указывает, что Lint должен относиться к этому типу как таргетинг на определенный уровень API, независимо от цели проекта. Только для указанного уровня API. Не будет вызываться на другом уровне API.