web-dev-qa-db-fra.com

Requiert vs vs TargetApi Android annotations

Quelle est la différence entre RequiresApi et TargetApi?

Échantillon en kotlin:

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

REMARQUE: FingerprintManager.AuthenticationCallback requiert Api M

NOTE 2: si je n'utilise pas TargetApi lint, échouez avec l'erreur class requires api level 23...

79
Daniel Gomez Rico

@RequiresApi - Indique que l'élément annoté ne doit être appelé qu'au niveau d'API donné ou supérieur.

@TargetApi - Indique que Lint doit traiter ce type comme ciblant un niveau d'API donné, quelle que soit la cible du projet.

67
Abhay Gawade

Comme ce que Mike a dit, comme vous pouvez le constater dans la documentation:

Indique que l'élément annoté ne doit être appelé qu'au niveau d'API donné ou supérieur.

Son objectif est similaire à celui de l'ancienne annotation @TargetApi, mais il est plus clair qu'il s'agit d'une exigence imposée à l'appelant, plutôt que d'être utilisée pour "supprimer" les avertissements de la méthode dépassant minSdkVersion.

Comme vous pouvez le voir ici, il s’agit en réalité de demander à l’appelant de vérifier l’API utilisée lors de l’appel de cette méthode, au lieu de simplement supprimer l’avertissement de votre IDE/LINT.

Vous pouvez comparer cela aux annotations @NonNull ou @Null, car elles impliquent que l'appelant peut/ne peut pas envoyer de valeur NULL dans la fonction.

34
Jorge Aguilar

Je suppose d’abord que la version de votre api min est inférieure à celle que vous allez appeler, car c’est là que ce type d’annotations prend tout son sens.

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

Lorsqu'une méthode est annotée avec cela, chaque fois que vous appelez cette méthode, vous recevez un avertissement rouge Nice indiquant que cet appel nécessite une version de l'API supérieure à celle de votre version de l'API minimale, mais cela ne vous empêche pas de compiler et de construire votre apk, il va simplement planter sur les versions inférieures de Android comme je l'ai testé.

@TargetApi

Cela n'aide pas du tout, il supprime les avertissements d'appeler de nouveaux apis dans votre méthode, mais lorsque vous appelez cette méthode depuis un autre endroit, il n'y a aucun avertissement de charpie, et vous pouvez toujours construire et installer votre apk uniquement pour répondre à une crash lorsque cette méthode est appelée.

23
ssynhtn

Depuis les JavaDocs dans https://developer.Android.com/reference/Android/support/annotation/RequiresApi.html :

[@RequiresApi] Cela a un objectif similaire à celui de l'ancienne annotation @TargetApi, mais indique plus clairement qu'il s'agit d'une exigence imposée à l'appelant, plutôt que d'être utilisée pour "supprimer" les avertissements dans la méthode dépassant minSdkVersion.

Je suppose qu'ils sont fonctionnellement équivalents mais @RequiresApi semble plus récent et a plus de chance d'être étendu pour inclure plus de fonctionnalités.

21
Mike Laren

Les deux sont destinés à la fonctionnalité de gestion ajoutée aux nouveaux niveaux d'API Android) sans affecter les autres niveaux d'API.

RequiertApi

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

Ici, il est indiqué que l'élément annoté ne doit être appelé qu'au niveau d'API donné ou supérieur. L'élément annoté situé en dessous du niveau de l'API donné n'appelle pas.

TargetApi

@TargetApi(Build.VERSION_CODES.*api_code*)

Indique que Lint doit traiter ce type comme ciblant un niveau d'API donné, quelle que soit la cible du projet. Destiné uniquement au niveau d'API spécifié. Ne sera pas appelé sur un autre niveau d'API.

6
jeevan venugopal