Потрібні апірування від Android та TargetApi


98

Яка різниця між RequiresApiі TargetApi?

Зразок в котлін:

@RequiresApi(api = Build.VERSION_CODES.M)
@TargetApi(Build.VERSION_CODES.M)
class FingerprintHandlerM() : FingerprintManager.AuthenticationCallback()

ПРИМІТКА: FingerprintManager.AuthenticationCallbackпотрібні apiM

ПРИМІТКА 2: якщо я не використовую TargetApi, збій з помилками class requires api level 23...

Відповіді:


87

@RequiresApi - Позначає, що анотований елемент слід викликати лише на заданому рівні API або вище.

@TargetApi - Вказує на те, що Lint повинен розглядати цей тип як націлений на певний рівень API, незалежно від того, якою є мета проекту.


42

Спочатку я припущу, що ваша версія min api нижча за api, яку ви збираєтесь викликати, тому що саме тут подібні анотації мають сенс

@RequiresApi(Build.VERSION_CODES.N_MR1)
public void hello() { // codes that call system apis introduced in android N_MR1}

Коли метод анотується цим, щоразу, коли ви викликаєте цей метод, ви отримуєте приємне червоне попередження про те, що для цього виклику потрібна версія API, яка перевищує вашу мінімальну версію API, але це не заважає вам компілювати та створювати свій apk, це просто вийде з ладу на нижчих версіях Android, як я це тестував.

@TargetApi

Це зовсім не допомагає, воно пригнічує попередження про виклик нового apis у вашому методі, але коли ви викликаєте цей метод звідкись ще, попередження про ворсинки взагалі не існує, і ви все одно можете створити та встановити свій apk лише для задоволення збій, коли цей метод викликається.


2
Я дійсно вважав це більш вичерпним і легким для розуміння, ніж інші відповіді, наявні на цій сторінці. Звідси +1.
Ананд Кумар Джа

1
Це єдина відповідь, яка пояснює теорію + практику, її дійсно слід прийняти.
Дмитро Павлухін

37

Подібно до того, що сказав Майк, як ви можете бачити в документації:

Позначає, що анотований елемент слід викликати лише на заданому рівні API або вище.

Це за призначенням подібне до попередньої анотації @TargetApi, але більш чітко виражається, що це вимога для абонента, а не використовується для "придушення" попереджень у межах методу, що перевищує minSdkVersion.

Як ви бачите тут, це насправді змушує абонента перевірити API, який використовується під час виклику в цьому методі, а не просто видаляти попередження з IDE / LINT.

Ви можете порівняти це з анотаціями @NonNull або @Null; вони примушують, що абонент може / не може надсилати нульові значення функції.


21

З JavaDocs https://developer.android.com/reference/android/support/annotation/RequiresApi.html :

[@RequiresApi] Це аналогічно за старою анотацією @TargetApi, але більш чітко виражається, що це вимога для абонента, а не використовується для "придушення" попереджень у межах методу, що перевищує minSdkVersion.

Я вважаю, що вони функціонально еквівалентні, але, @RequiresApiздається, новіші та мають більший шанс бути розширеним, щоб включити більше функціоналу.


@Penn Care пояснить, чому це неправда?
hamena314

6

Вони обидва для обробки функцій, доданих до нових рівнів API для Android, не впливаючи на інші рівні API.

ПотрібенАпі

@RequiresApi(api = Build.VERSION_CODES.*api_code*)

Тут йдеться про те, що анотований елемент слід викликати лише на заданому рівні API або вище. Повідомлений елемент нижче заданого рівня API не дзвонить.

TargetApi

@TargetApi(Build.VERSION_CODES.*api_code*)

Вказує, що Lint повинен сприймати цей тип як націлений на заданий рівень API, незалежно від того, якою є мета проекту. Призначений лише для визначеного рівня API. Не буде викликано на іншому рівні API.


Коли я використовував @RequiresApi, AS підкреслював виклик методу червоним кольором, а також цілий клас як такий, що містить помилку.
CoolMind

@CoolMind Ви використовували "@RequiresApi" всередині будь-якого методу?
jeevan venugopal

Ні, я додав його перед методом, як @TargetApi.
CoolMind

@CoolMind спробуйте використовувати "@RequiresApi" для методу, з якого ви телефонуєте. Або оточуйте дзвінок так. if (Build.VERSION.SDK_INT> = Build.VERSION_CODES. * api_code *) {// ваше ім'я методу}
jeevan venugopal

Так, if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {працює, але я вже маю це в методі. Дякую!
CoolMind
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.