Membutuhkan anotasi android Api vs TargetApi

98

Apa perbedaan antara RequiresApidan TargetApi?

Sampel di kotlin:

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

CATATAN: FingerprintManager.AuthenticationCallbackmembutuhkan apiM

CATATAN 2: jika saya tidak menggunakan lint TargetApi gagal dengan kesalahan class requires api level 23...

Daniel Gomez Rico
sumber

Jawaban:

87

@RequiresApi - Menunjukkan bahwa elemen beranotasi hanya boleh dipanggil pada level API tertentu atau lebih tinggi.

@TargetApi - Menunjukkan bahwa Lint harus memperlakukan jenis ini sebagai penargetan level API tertentu, apa pun target proyeknya.

Abhay
sumber
45

Pertama-tama saya akan menganggap versi min api Anda lebih rendah dari api yang akan Anda panggil, karena di sanalah jenis anotasi ini masuk akal

@RequiresApi(Build.VERSION_CODES.N_MR1)
public void hello() { // codes that call system apis introduced in android N_MR1}

Ketika sebuah metode dianotasi dengan ini, kapan pun Anda memanggil metode itu, Anda menerima peringatan merah yang bagus bahwa panggilan ini membutuhkan versi api yang lebih tinggi dari versi api min Anda, tetapi itu tidak menghentikan Anda dari mengompilasi dan membangun apk Anda, itu hanya akan mogok di versi android yang lebih rendah saat saya mengujinya.

@TargetApi

Ini tidak membantu sama sekali, ini menekan peringatan untuk memanggil apis baru dalam metode Anda, tetapi ketika Anda memanggil metode ini dari tempat lain, tidak ada peringatan lint sama sekali, dan Anda masih dapat membangun dan menginstal apk Anda hanya untuk memenuhi crash ketika metode itu dipanggil.

ssynhtn
sumber
3
Saya benar-benar merasa lebih komprehensif dan mudah dipahami daripada jawaban lain yang tersedia di halaman ini. Oleh karena itu +1.
Anand Kumar Jha
2
Ini satu-satunya jawaban yang menjelaskan teori + praktek, itu harus diterima.
Dmitriy Pavlukhin
37

Mirip dengan apa yang dikatakan Mike, seperti yang Anda lihat di dokumentasi:

Menunjukkan bahwa elemen beranotasi hanya boleh dipanggil pada level API tertentu atau lebih tinggi.

Tujuannya serupa dengan anotasi @TargetApi yang lebih lama, tetapi lebih jelas menyatakan bahwa ini adalah persyaratan pada pemanggil, daripada digunakan untuk "menyembunyikan" peringatan dalam metode yang melebihi minSdkVersion.

Seperti yang Anda lihat di sini, ini sebenarnya memaksa pemanggil untuk memverifikasi API yang telah digunakan saat memanggil metode ini, alih-alih hanya menghapus peringatan dari IDE / LINT Anda.

Anda dapat membandingkan ini dengan anotasi @NonNull atau @Null, yang menegaskan bahwa pemanggil dapat / tidak dapat mengirim nilai null ke dalam fungsi.

Jorge Aguilar
sumber
21

Dari JavaDocs di https://developer.android.com/reference/android/support/annotation/RequiresApi.html :

[@RequiresApi] Tujuannya serupa dengan anotasi @TargetApi yang lebih lama, tetapi lebih jelas menyatakan bahwa ini adalah persyaratan pada pemanggil, daripada digunakan untuk "menyembunyikan" peringatan dalam metode yang melebihi minSdkVersion.

Saya kira mereka secara fungsional setara tetapi @RequiresApitampaknya lebih baru dan memiliki peluang lebih tinggi untuk diperluas untuk menyertakan lebih banyak fungsionalitas.

Mike Laren
sumber
@Penn Care untuk menjelaskan mengapa ini salah?
hamena314
6

Keduanya untuk menangani fitur yang ditambahkan ke level API Android baru tanpa memengaruhi level API lainnya.

MembutuhkanApi

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

Di sini dikatakan bahwa elemen beranotasi hanya boleh dipanggil pada level API tertentu atau lebih tinggi. Elemen beranotasi di bawah level API yang diberikan tidak akan dipanggil.

TargetApi

@TargetApi(Build.VERSION_CODES.*api_code*)

Menunjukkan bahwa Lint harus memperlakukan jenis ini sebagai menargetkan level API tertentu, apa pun target proyeknya. Hanya dimaksudkan untuk level API tertentu. Tidak akan dipanggil di level API lain.

jeevan venugopal
sumber
Ketika saya menggunakan @RequiresApi, AS menggarisbawahi pemanggilan metode dengan warna merah dan juga seluruh kelas mengandung kesalahan.
CoolMind
@ CoolMind, apakah Anda menggunakan "@RequiresApi" di dalam metode apa pun?
jeevan venugopal
Tidak, saya menambahkannya sebelum metode, seperti @TargetApi.
CoolMind
@CoolMind coba gunakan "@RequiresApi" ke metode yang Anda panggil. Atau lakukan panggilan seperti ini. if (Build.VERSION.SDK_INT> = Build.VERSION_CODES. * api_code *) {// nama metode Anda}
jeevan venugopal
Ya, if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {berhasil, tetapi saya sudah memilikinya dalam metode. Terima kasih!
CoolMind