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.