RequiresApi против TargetApi Android аннотации
в чем разница между RequiresApi
и TargetApi
?
образец в Котлине:
@RequiresApi(api = Build.VERSION_CODES.M)
@TargetApi(Build.VERSION_CODES.M)
class FingerprintHandlerM() : FingerprintManager.AuthenticationCallback()
Примечание: FingerprintManager.AuthenticationCallback
требуется api M
примечание 2: Если я не использую TargetApi lint fail с ошибкой class requires api level 23...
5 ответов
@RequiresApi
- обозначает, что аннотированный элемент должен вызываться только на заданном уровне API или выше.
@TargetApi
- указывает, что Lint должен рассматривать этот тип как таргетинг на заданный уровень API, независимо от цели проекта.
похоже на то, что сказал Майк, как вы можете видеть в документации:
означает, что аннотированный элемент должен вызываться только на заданном уровне API или выше.
Это похоже по цели на более старую аннотацию @TargetApi, но более четко выражает, что это требование к вызывающему объекту, а не используется для "подавления" предупреждений в методе, которые превышают minSdkVersion.
Как вы можете видеть здесь, это фактически принуждение вызывающего абонента к проверке API, который использовался при вызове этого метода, а не просто удаление предупреждения из IDE/LINT.
вы можете сравнить это с аннотациями @NonNull или @Null, они обеспечивают, чтобы вызывающий объект мог / не мог отправлять значения null в функцию.
из JavaDocs в https://developer.android.com/reference/android/support/annotation/RequiresApi.html:
[@RequiresApi] это похоже по назначению на более старую аннотацию @TargetApi, но более четко выражает, что это требование для вызывающего абонента, а не используется для "подавления" предупреждений в методе, которые превышают minSdkVersion.
Я думаю, что они функционально эквивалентны, но @RequiresApi
вроде бы новее и имеет более высокую вероятность расширения, чтобы включить больше функциональности.
сначала я предположу, что ваша версия min api ниже, чем api, который вы собираетесь вызвать, потому что именно там эти аннотации имеют какой-либо смысл
@RequiresApi(Build.VERSION_CODES.N_MR1)
public void hello() { // codes that call system apis introduced in android N_MR1}
когда метод аннотируется этим, в любое время, когда вы вызываете этот метод, вы получаете хорошее красное предупреждение о том, что этот вызов требует версии api, которая выше вашей версии min api, но это не мешает вам компилировать и строить apk, он просто рухнет на более низких версиях android, как я тестировал он.
@TargetApi
это не помогает вообще, он подавляет предупреждения о вызове новых API в вашем методе, но когда вы вызываете этот метод откуда-то еще, нет предупреждения о корпии вообще, и вы все равно можете построить и установить свой apk только для того, чтобы встретить сбой при вызове этого метода.
оба они предназначены для обработки функции, добавленной к новым уровням API android, не влияя на другие уровни API.
RequiresApi
@RequiresApi(api = Build.VERSION_CODES.*api_code*)
здесь говорится, что аннотированный элемент должен вызываться только на данном уровне API или выше. Аннотированный элемент ниже заданного уровня API не будет вызывать.
TargetApi
@TargetApi(Build.VERSION_CODES.*api_code*)
указывает, что Lint должен рассматривать этот тип как таргетинг на данный уровень API, нет важно, какова цель проекта. Предназначен только для указанного уровня API. Не будет вызываться на другом уровне API.