RequiresApi vs TargetApi annotations de Android

¿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 api M

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

    @RequiresApi – Indica que el elemento anotado solo debe @RequiresApi en el nivel API dado o más alto.

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

    Similar a lo que Mike dijo, como puedes ver en la documentation:

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

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

    Como puede ver aquí, esto está obligando 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 annotations @NonNull o @Null, hacen cumplir que la persona que llama puede / no puede enviar valores nulos a la function.

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

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

    Supongo que son funcionalmente equivalentes, pero @RequiresApi parece ser más nuevo y tiene más posibilidades de ampliarse para include más funcionalidades.

    Ambos son para manejar funciones agregadas a los nuevos niveles API de Android sin afectar los otros niveles API.

    Requiere Api

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

    Aquí dice que el elemento anotado solo debe invocarse en el nivel API dado o más alto. 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 nivel de API determinado, sin importar cuál sea el objective del proyecto. Solo para el nivel de API especificado. No se llamará en otro nivel de API.