support studio not nonnull annotation android android-support-library kotlin android-annotations

studio - Requiere anotaciones de Android vs TargetApi para Android



android support annotation nullable (5)

Ambos son para manejar la función agregada a los nuevos niveles de API de Android sin afectar los otros niveles de API.

RequiereApi

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

Aquí dice que el elemento anotado solo debe invocarse en el nivel de API dado o superior. El elemento anotado debajo del nivel API dado no llamará.

TargetApi

@TargetApi(Build.VERSION_CODES.*api_code*)

Indica que Lint debería tratar este tipo como un objetivo para un nivel API determinado, sin importar cuál sea el objetivo del proyecto. Solo para el nivel de API especificado. No se llamará en otro nivel de API.

¿Cuál es la diferencia entre RequiresApi y TargetApi ?

Muestra en kotlin:

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

NOTA: FingerprintManager.AuthenticationCallback requiere una API M

NOTA 2: si no uso TargetApi, la pelusa falla con la class requires api level 23... error class requires api level 23...


Desde los JavaDocs en https://developer.android.com/reference/android/support/annotation/RequiresApi.html :

[@RequiresApi] Esto es similar en propósito a la anotación @TargetApi anterior, pero expresa más claramente que este es un requisito para la persona que llama, en lugar de usarse para "suprimir" advertencias dentro del método que exceden la minSdkVersion.

Supongo que son funcionalmente equivalentes, pero @RequiresApi parece ser más nuevo y tiene una mayor probabilidad de extenderse para incluir más funcionalidad.


Primero supondré que su versión de la API mínima es más baja que la API a la que va a llamar, porque ahí es donde este tipo de anotaciones tiene 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 llame a ese método, recibirá una agradable advertencia roja de que esta llamada requiere una versión de API que es más alta que su versión de API mínima, pero no le impide compilar y construir su apk. simplemente se bloqueará 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 pelusa, y aún puede construir e instalar su apk solo para cumplir con un bloquearse cuando se llama a ese método.


Similar a lo que dijo Mike, como puedes ver en la documentación:

Denota que el elemento anotado solo debe invocarse en el nivel de API dado o superior.

Esto es similar en propósito a la anotación @TargetApi anterior, pero expresa más claramente que este es un requisito para la persona que llama, en lugar de usarse para "suprimir" advertencias dentro del método que exceden la minSdkVersion.

Como puede ver aquí, esto realmente 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, hacen cumplir que la persona que llama puede / no puede enviar valores nulos a la función.


@RequiresApi : indica que el elemento anotado solo debe @RequiresApi en el nivel de API dado o superior.

@TargetApi : indica que Lint debería tratar este tipo como un objetivo para un nivel API determinado, sin importar cuál sea el objetivo del proyecto.