RequirApi vs TargetApi android ek açıklamaları


98

Nedir arasındaki fark RequiresApive TargetApi?

Kotlin'deki örnek:

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

NOT: FingerprintManager.AuthenticationCallbackAPI gerektirirM

NOT 2: TargetApi kullanmazsam hata vererek başarısız olur class requires api level 23...

Yanıtlar:


90

@RequiresApi - Ek açıklamalı öğenin yalnızca belirli API düzeyinde veya daha yüksek bir düzeyde çağrılması gerektiğini belirtir.

@TargetApi - Proje hedefi ne olursa olsun, Lint'in bu türü belirli bir API seviyesini hedefliyor olarak ele alması gerektiğini belirtir.


51

Öncelikle, min api sürümünüzün arayacağınız api sürümünden daha düşük olduğunu varsayacağım, çünkü bu tür ek açıklamaların mantıklı olduğu yer burasıdır.

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

Bir yönteme açıklama eklendiğinde, bu yöntemi her çağırdığınızda, bu çağrının min api sürümünüzden daha yüksek bir api sürümü gerektirdiğine dair hoş bir kırmızı uyarı alırsınız, ancak bu, apk'nizi derlemenizi ve oluşturmanızı engellemez. test ettiğim gibi android'in daha düşük sürümlerinde çökecek.

@TargetApi

Bu hiç yardımcı olmuyor, yönteminizde yeni apis çağırma uyarılarını bastırıyor, ancak bu yöntemi başka bir yerden çağırdığınızda, hiçbir tiftik uyarısı olmaz ve yine de apk'nizi yalnızca bir bu yöntem çağrıldığında çökme.


3
Bu sayfadaki diğer cevaplardan çok daha kapsamlı ve anlaşılması kolay buldum. Dolayısıyla +1.
Anand Kumar Jha

2
Teori + pratiği açıklayan tek cevap bu, gerçekten kabul edilmelidir.
Dmitriy Pavlukhin

37

Belgelerde de görebileceğiniz gibi, Mike'ın söylediğine benzer şekilde:

Ek açıklamalı öğenin yalnızca belirli API düzeyinde veya daha yüksek bir düzeyde çağrılması gerektiğini belirtir.

Bu, amaç olarak daha eski @TargetApi ek açıklamasına benzer, ancak bunun, minSdkVersion'ı aşan yöntem içindeki uyarıları "bastırmak" için kullanılmasından ziyade arayan için bir gereklilik olduğunu daha açık bir şekilde ifade eder.

Burada görebileceğiniz gibi, bu aslında uyarıyı IDE / LINT'inizden kaldırmak yerine, arayan kişiyi bu yöntemi çağırırken kullanılan API'yi doğrulamaya zorluyor.

Bunu @NonNull veya @Null ek açıklamalarıyla karşılaştırabilirsiniz, bunlar arayanın işleve boş değerler gönderebilmesini / gönderememesini zorunlu kılar.


21

JavaDocs'tan adresindeki :

[@RequiresApi] Bu, amaç olarak daha eski @TargetApi ek açıklamasına benzer, ancak bunun, minSdkVersion'ı aşan yöntem içindeki uyarıları "bastırmak" için kullanılmasından ziyade arayan için bir gereklilik olduğunu daha açık bir şekilde ifade eder.

Sanırım işlevsel olarak eşdeğerler ancak @RequiresApidaha yeni görünüyorlar ve daha fazla işlevsellik içerecek şekilde genişletilme şansı daha yüksek.


@Penn Care bunun neden yanlış olduğunu açıklamak için?
hamena314

5

Her ikisi de, diğer API seviyelerini etkilemeden yeni android API seviyelerine eklenen işleme özelliği içindir.

Gerektirir

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

Burada, açıklamalı öğenin yalnızca belirli API düzeyinde veya daha yüksek bir düzeyde çağrılması gerektiğini söylüyor. Verilen API seviyesinin altındaki ek açıklamalı öğe çağırmaz.

TargetApi

@TargetApi(Build.VERSION_CODES.*api_code*)

Proje hedefi ne olursa olsun, Lint'in bu türü belirli bir API seviyesini hedefliyor olarak ele alması gerektiğini belirtir. Yalnızca belirtilen API seviyesi içindir. Diğer API seviyesinde çağrılmaz.


Kullandığımda @RequiresApi, AS kırmızıyla bir yöntem çağrısının altını çizdi ve ayrıca bir hata içerdiğinden tüm bir sınıf.
CoolMind

@CoolMind herhangi bir yöntemde "@RequiresApi" kullandınız mı?
jeevan venugopal

Hayır, gibi bir yöntemden önce ekledim @TargetApi.
CoolMind

@CoolMind, aradığınız yönteme "@RequiresApi" yi kullanmayı deneyin. Veya aramayı bu şekilde kuşatın. if (Build.VERSION.SDK_INT> = Build.VERSION_CODES. * api_code *) {// your method name}
jeevan venugopal

Evet, if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {işe yarıyor, ama zaten yöntemde var. Teşekkürler!
CoolMind
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.