RequiresApi
とTargetApi
の違いは何ですか?
Kotlinのサンプル:
@RequiresApi(api = Build.VERSION_CODES.M)
@TargetApi(Build.VERSION_CODES.M)
class FingerprintHandlerM() : FingerprintManager.AuthenticationCallback()
注:FingerprintManager.AuthenticationCallback
にはapiが必要ですM
注2:TargetApiを使用しない場合、lintはエラーclass requires api level 23...
で失敗します
@RequiresApi
-注釈付き要素は、特定のAPIレベル以上でのみ呼び出す必要があることを示します。
@TargetApi
-プロジェクトのターゲットが何であれ、Lintはこのタイプを特定のAPIレベルをターゲットとして扱う必要があることを示します。
あなたがドキュメントで見ることができるように、マイクが言ったことに似ています:
注釈付き要素は、指定されたAPIレベル以上でのみ呼び出す必要があることを示します。
これは古い@TargetApiアノテーションと目的が似ていますが、メソッド内でminSdkVersionを超える警告を「抑制する」ために使用されるのではなく、これが呼び出し側の要件であることをより明確に表しています。
ここでわかるように、これは実際にIDE/LINTから警告を削除するのではなく、このメソッドを呼び出すときに使用されるAPIを検証するように呼び出し元に強制します。
これを@NonNullまたは@Nullアノテーションと比較できます。これらは、呼び出し側がnull値を関数に送信できるかどうかを強制します。
私は最初にあなたの最小APIバージョンがあなたが呼び出すAPIよりも低いと仮定します、なぜならそれはこれらの種類の注釈が意味をなす場所だからです
@RequiresApi(Build.VERSION_CODES.N_MR1)
public void hello() { // codes that call system apis introduced in Android N_MR1}
メソッドにこれを注釈すると、そのメソッドを呼び出すたびに、この呼び出しには最小APIバージョンよりも高いAPIバージョンが必要であるという素敵な赤い警告が表示されますが、apkのコンパイルとビルドは停止しません私がテストしたように、Androidの下位バージョンでクラッシュするだけです。
@TargetApi
これはまったく役に立たず、メソッドで新しいAPIを呼び出すことの警告を抑制しますが、他の場所からこのメソッドを呼び出すと、lint警告はまったくありません。そのメソッドが呼び出されるとクラッシュします。
https://developer.Android.com/reference/Android/support/annotation/RequiresApi.html のJavaDocsから:
[@RequiresApi]これは古い@TargetApiアノテーションと目的が似ていますが、メソッド内でminSdkVersionを超える警告を「抑制する」ために使用されるのではなく、これが呼び出し側の要件であることをより明確に表現します。
機能的には同等ですが、@RequiresApi
はより新しいようで、より多くの機能を含むように拡張される可能性が高くなります。
どちらも、他のAPIレベルに影響を与えることなく、新しいAndroid APIレベルに追加された機能を処理するためのものです。
RequiresApi
@RequiresApi(api = Build.VERSION_CODES.*api_code*)
ここでは、注釈付き要素は特定のAPIレベル以上でのみ呼び出されるべきであると述べています。指定されたAPIレベルの下の注釈付き要素は呼び出しません。
TargetApi
@TargetApi(Build.VERSION_CODES.*api_code*)
プロジェクトのターゲットに関係なく、Lintはこのタイプを特定のAPIレベルをターゲットとして扱う必要があることを示します。指定されたAPIレベル専用です。他のAPIレベルでは呼び出されません。