Je suppose d'abord que votre version d'API min est inférieure à l'API que vous allez appeler, car c'est là que ce type d'annotations a un 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 ceci, chaque fois que vous appelez cette méthode, vous recevez un joli avertissement rouge indiquant que cet appel nécessite une version api supérieure à votre version min api, mais cela ne vous empêche pas de compiler et de construire votre apk, il va simplement planter sur les versions inférieures d'Android comme je l'ai testé.
@TargetApi
Cela n'aide pas du tout, cela supprime les avertissements d'appels de nouveaux apis dans votre méthode, mais lorsque vous appelez cette méthode ailleurs, il n'y a aucun avertissement de peluche, et vous pouvez toujours créer et installer votre apk uniquement pour rencontrer un planter lorsque cette méthode est appelée.
Similaire à ce que Mike a dit, comme vous pouvez le voir dans la documentation:
Comme vous pouvez le voir ici, cela oblige en fait l'appelant à vérifier l'API qui a été 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, elles imposent que l'appelant puisse / ne puisse pas envoyer de valeurs nulles dans la fonction.
la source
À partir des JavaDocs dans https://developer.android.com/reference/android/support/annotation/RequiresApi.html :
Je suppose qu'ils sont fonctionnellement équivalents mais
@RequiresApi
semblent être plus récents et ont plus de chances d'être étendus pour inclure plus de fonctionnalités.la source
Les deux sont destinés à la fonctionnalité de gestion ajoutée aux nouveaux niveaux d'API Android sans affecter les autres niveaux d'API.
Requiert Api
Ici, il est dit que l'élément annoté ne doit être appelé qu'au niveau d'API donné ou supérieur. L'élément annoté sous le niveau d'API donné ne sera pas appelé.
TargetApi
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é à un autre niveau d'API.
la source
@RequiresApi
, AS soulignait un appel de méthode avec du rouge et aussi une classe entière comme contenant une erreur.@TargetApi
.if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
ça marche, mais je l'ai déjà dans la méthode. Merci!