RequiresApi vs TargetApi Android Annotationen

98

Was ist der Unterschied zwischen RequiresApiund TargetApi?

Probe in Kotlin:

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

HINWEIS: FingerprintManager.AuthenticationCallbackerfordert APIM

HINWEIS 2: Wenn ich TargetApi nicht verwende, schlagen Flusen mit Fehler fehl class requires api level 23...

Daniel Gomez Rico
quelle

Antworten:

86

@RequiresApi - Gibt an, dass das mit Anmerkungen versehene Element nur auf der angegebenen API-Ebene oder höher aufgerufen werden soll.

@TargetApi - Gibt an, dass Lint diesen Typ als Ziel für eine bestimmte API-Ebene behandeln soll, unabhängig davon, um welches Projektziel es sich handelt.

Abhay
quelle
42

Ich gehe zunächst davon aus, dass Ihre Min-API-Version niedriger ist als die API, die Sie aufrufen werden, da diese Art von Anmerkungen hier Sinn macht

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

Wenn eine Methode damit kommentiert wird, erhalten Sie jedes Mal, wenn Sie diese Methode aufrufen, eine nette rote Warnung, dass für diesen Aufruf eine API-Version erforderlich ist, die höher als Ihre Min-API-Version ist, aber Sie nicht daran hindert, Ihre API zu kompilieren und zu erstellen wird nur auf niedrigeren Versionen von Android abstürzen, wie ich es getestet habe.

@TargetApi

Dies hilft überhaupt nicht, es unterdrückt Warnungen vor dem Aufruf neuer APIs in Ihrer Methode, aber wenn Sie diese Methode von einem anderen Ort aus aufrufen, gibt es überhaupt keine Flusenwarnung, und Sie können Ihre Apk trotzdem nur erstellen und installieren, um eine zu erfüllen Absturz, wenn diese Methode aufgerufen wird.

ssynhtn
quelle
2
Ich fand es wirklich umfassender und leichter zu verstehen als die anderen Antworten auf dieser Seite. Daher +1.
Anand Kumar Jha
1
Dies ist die einzige Antwort, die Theorie + Praxis erklärt. Sie sollte wirklich akzeptiert werden.
Dmitriy Pavlukhin
36

Ähnlich wie Mike sagte, wie Sie in der Dokumentation sehen können:

Gibt an, dass das mit Anmerkungen versehene Element nur auf der angegebenen API-Ebene oder höher aufgerufen werden soll.

Dies ähnelt in seinem Zweck der älteren @ TargetApi-Annotation, drückt jedoch deutlicher aus, dass dies eine Anforderung an den Aufrufer ist, anstatt zum "Unterdrücken" von Warnungen innerhalb der Methode verwendet zu werden, die die minSdkVersion überschreiten.

Wie Sie hier sehen können, wird der Aufrufer dadurch gezwungen, die API zu überprüfen, die beim Aufrufen dieser Methode verwendet wurde, anstatt nur die Warnung aus Ihrer IDE / LINT zu entfernen.

Sie können dies mit den Annotationen @NonNull oder @Null vergleichen. Sie erzwingen, dass der Aufrufer Nullwerte an die Funktion senden kann / kann.

Jorge Aguilar
quelle
21

Aus den JavaDocs in https://developer.android.com/reference/android/support/annotation/RequiresApi.html :

[@RequiresApi] Dies ähnelt in seinem Zweck der älteren @ TargetApi-Annotation, drückt jedoch deutlicher aus, dass dies eine Anforderung an den Aufrufer ist, anstatt zum "Unterdrücken" von Warnungen innerhalb der Methode verwendet zu werden, die die minSdkVersion überschreiten.

Ich nehme an, sie sind funktional gleichwertig, @RequiresApischeinen aber neuer zu sein und haben eine höhere Chance, um mehr Funktionen erweitert zu werden.

Mike Laren
quelle
@ Penn Möchtest du erklären, warum das falsch ist?
hamena314
6

Beide dienen zur Behandlung von Funktionen, die neuen Android-API-Ebenen hinzugefügt wurden, ohne die anderen API-Ebenen zu beeinflussen.

RequiresApi

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

Hier heißt es, dass das mit Anmerkungen versehene Element nur auf der angegebenen API-Ebene oder höher aufgerufen werden sollte. Das mit Anmerkungen versehene Element unterhalb der angegebenen API-Ebene wird nicht aufgerufen.

TargetApi

@TargetApi(Build.VERSION_CODES.*api_code*)

Gibt an, dass Lint diesen Typ als Ziel für eine bestimmte API-Ebene behandeln soll, unabhängig davon, um welches Projektziel es sich handelt. Nur für die angegebene API-Ebene gedacht. Wird auf einer anderen API-Ebene nicht aufgerufen.

Jeevan Venugopal
quelle
Bei meiner Verwendung @RequiresApiunterstrich AS einen Methodenaufruf mit Rot und einer ganzen Klasse als fehlerhaft.
CoolMind
@CoolMind haben Sie "@RequiresApi" in einer Methode verwendet?
Jeevan Venugopal
Nein, ich habe es vor einer Methode hinzugefügt, wie @TargetApi.
CoolMind
@CoolMind versucht, "@RequiresApi" für die Methode zu verwenden, von der aus Sie aufrufen. Oder umgeben Sie den Anruf so. if (Build.VERSION.SDK_INT> = Build.VERSION_CODES. * api_code *) {// Ihr Methodenname}
jeevan venugopal
Ja, if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {funktioniert, aber ich habe es bereits in der Methode. Vielen Dank!
CoolMind