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...
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