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 сбой с ошибкой class requires api level 23...

1170   5  

5 ответов:

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

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

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

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

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

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

вы можете сравнить это с аннотациями @NonNull или @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 в вашем методе, но когда вы вызываете этот метод откуда-то еще, нет никакого предупреждения lint вообще, и вы все равно можете построить и установить свой 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.

Comments

    Ничего не найдено.