Primero asumiré que su versión de min api es más baja que la api a la que va a llamar, porque ahí es donde este tipo de anotaciones tienen sentido
@RequiresApi(Build.VERSION_CODES.N_MR1)
public void hello() { // codes that call system apis introduced in android N_MR1}
Cuando se anota un método con esto, cada vez que llama a ese método, recibe una bonita advertencia roja de que esta llamada requiere una versión de la API que sea superior a su versión de la API mínima, pero no le impide compilar y construir su apk, simplemente fallará en versiones inferiores de Android cuando lo probé.
@TargetApi
Esto no ayuda en absoluto, suprime las advertencias de llamar a nuevas apis en su método, pero cuando llama a este método desde otro lugar, no hay ninguna advertencia de lint, y aún puede construir e instalar su apk solo para cumplir con un crash cuando se llama a ese método.
Similar a lo que dijo Mike, como puede ver en la documentación:
Como puede ver aquí, esto en realidad obliga a la persona que llama a verificar la API que se ha utilizado al llamar a este método, en lugar de simplemente eliminar la advertencia de su IDE / LINT.
Puede comparar esto con las anotaciones @NonNull o @Null, que imponen que la persona que llama puede / no puede enviar valores nulos a la función.
fuente
De los JavaDocs en https://developer.android.com/reference/android/support/annotation/RequiresApi.html :
Supongo que son funcionalmente equivalentes, pero
@RequiresApi
parecen ser más nuevos y tienen una mayor probabilidad de ampliarse para incluir más funciones.fuente
Ambos son para funciones de manejo agregadas a los nuevos niveles de API de Android sin afectar los otros niveles de API.
RequiereApi
Aquí dice que el elemento anotado solo debe invocarse en el nivel de API dado o superior. El elemento anotado debajo del nivel de API dado no llamará.
TargetApi
Indica que Lint debe tratar este tipo como dirigido a un nivel de API determinado, sin importar cuál sea el objetivo del proyecto. Solo destinado al nivel de API especificado. No se llamará en otro nivel de API.
fuente
@RequiresApi
, AS subrayó una llamada de método con rojo y también una clase completa que contenía un error.@TargetApi
.if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
funciona, pero ya lo tengo en el método. ¡Gracias!