web-dev-qa-db-ja.com

RequiresApiとTargetApi Androidアノテーション

RequiresApiTargetApiの違いは何ですか?

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...で失敗します

79

@RequiresApi-注釈付き要素は、特定のAPIレベル以上でのみ呼び出す必要があることを示します。

@TargetApi-プロジェクトのターゲットが何であれ、Lintはこのタイプを特定のAPIレベルをターゲットとして扱う必要があることを示します。

67
Abhay Gawade

あなたがドキュメントで見ることができるように、マイクが言ったことに似ています:

注釈付き要素は、指定されたAPIレベル以上でのみ呼び出す必要があることを示します。

これは古い@TargetApiアノテーションと目的が似ていますが、メソッド内でminSdkVersionを超える警告を「抑制する」ために使用されるのではなく、これが呼び出し側の要件であることをより明確に表しています。

ここでわかるように、これは実際にIDE/LINTから警告を削除するのではなく、このメソッドを呼び出すときに使用されるAPIを検証するように呼び出し元に強制します。

これを@NonNullまたは@Nullアノテーションと比較できます。これらは、呼び出し側がnull値を関数に送信できるかどうかを強制します。

34
Jorge Aguilar

私は最初にあなたの最小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警告はまったくありません。そのメソッドが呼び出されるとクラッシュします。

23
ssynhtn

https://developer.Android.com/reference/Android/support/annotation/RequiresApi.html のJavaDocsから:

[@RequiresApi]これは古い@TargetApiアノテーションと目的が似ていますが、メソッド内でminSdkVersionを超える警告を「抑制する」ために使用されるのではなく、これが呼び出し側の要件であることをより明確に表現します。

機能的には同等ですが、@RequiresApiはより新しいようで、より多くの機能を含むように拡張される可能性が高くなります。

21
Mike Laren

どちらも、他のAPIレベルに影響を与えることなく、新しいAndroid AP​​Iレベルに追加された機能を処理するためのものです。

RequiresApi

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

ここでは、注釈付き要素は特定のAPIレベル以上でのみ呼び出されるべきであると述べています。指定されたAPIレベルの下の注釈付き要素は呼び出しません。

TargetApi

@TargetApi(Build.VERSION_CODES.*api_code*)

プロジェクトのターゲットに関係なく、Lintはこのタイプを特定のAPIレベルをターゲットとして扱う必要があることを示します。指定されたAPIレベル専用です。他のAPIレベルでは呼び出されません。

6