Сначала я предполагаю, что ваша версия min api ниже, чем api, который вы собираетесь вызвать, потому что именно здесь такие аннотации имеют смысл
@RequiresApi(Build.VERSION_CODES.N_MR1)
public void hello() {
Когда метод аннотируется этим, каждый раз, когда вы вызываете этот метод, вы получаете красивое красное предупреждение о том, что для этого вызова требуется версия api, которая выше, чем ваша минимальная версия api, но это не мешает вам компилировать и создавать свой apk, это просто вылетит на более низких версиях Android, как я это тестировал.
@TargetApi
Это совсем не помогает, оно подавляет предупреждения о вызове нового apis в вашем методе, но когда вы вызываете этот метод из другого места, предупреждения о ворсинах вообще не появляется, и вы все равно можете собрать и установить свой apk только для удовлетворения сбой при вызове этого метода.
Подобно тому, что сказал Майк, как вы можете видеть в документации:
Как вы можете видеть здесь, это фактически заставляет вызывающего абонента проверять API, который использовался при вызове этого метода, вместо того, чтобы просто удалять предупреждение из вашей IDE / LINT.
Вы можете сравнить это с аннотациями @NonNull или @Null, они предписывают, что вызывающий может / не может отправлять нулевые значения в функцию.
источник
Из JavaDocs в https://developer.android.com/reference/android/support/annotation/RequiresApi.html :
Я полагаю, что они функционально эквивалентны, но
@RequiresApi
кажутся более новыми и имеют больше шансов на расширение, чтобы включить больше функций.источник
Оба они предназначены для обработки функции, добавленной на новые уровни API Android, не влияя на другие уровни API.
ТребуетсяApi
@RequiresApi(api = Build.VERSION_CODES.*api_code*)
Здесь говорится, что аннотированный элемент должен вызываться только на заданном уровне API или выше. Аннотированный элемент ниже заданного уровня API не будет вызывать.
TargetApi
@TargetApi(Build.VERSION_CODES.*api_code*)
Указывает, что Lint должен рассматривать этот тип как нацеленный на данный уровень API, независимо от цели проекта. Предназначен только для указанного уровня API. Не будет вызывать другой уровень API.
источник
@RequiresApi
, AS подчеркивал вызов метода красным, а также весь класс как содержащий ошибку.@TargetApi
.if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
работает, но в методе уже есть. Благодарность!