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.