RequiresApiとTargetApiのAndroidアノテーション


98

RequiresApiとはTargetApiどう違いますか?

Kotlinのサンプル:

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

注:FingerprintManager.AuthenticationCallbackAPIが必要ですM

注2:TargetApi lintを使用しない場合、エラーで失敗する class requires api level 23...

回答:


87

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

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


42

最初に、最小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を呼び出す警告を抑制しますが、このメソッドを別の場所から呼び出すと、糸くずの警告はまったく発生せず、apkをビルドしてインストールするだけで、そのメソッドが呼び出されるとクラッシュします。


2
このページで利用できる他の回答よりも、包括的で理解しやすいと思いました。したがって、+ 1。
Anand Kumar Jha 2018

1
これは理論と実践を説明する唯一の答えであり、実際に受け入れられるべきです。
Dmitriy Pavlukhin

37

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

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

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

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

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


21

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

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

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


@Pennなぜこれが間違っているのか説明してください。
hamena314 2018年

6

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

RequiresApi

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

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

TargetApi

@TargetApi(Build.VERSION_CODES.*api_code*)

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


私がを使用したとき@RequiresApi、ASはメソッド呼び出しに赤とクラス全体に下線を付け、エラーが含まれていることを示しました。
CoolMind

@CoolMindメソッド内で「@RequiresApi」を使用しましたか?
jeevan venugopal

いいえ、メソッドの前に追加しました@TargetApi
CoolMind

@CoolMindは、呼び出し元のメソッドに対して「@RequiresApi」を使用しようとします。または、このように通話を囲みます。if(Build.VERSION.SDK_INT> = Build.VERSION_CODES。* api_code *){//メソッド名}
jeevan venugopal

はい、if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {機能しますが、メソッドにはすでにあります。ありがとう!
CoolMind
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.