एंड्रॉइड एनोटेशन के लिए आवश्यक है


98

क्या अंतर है RequiresApiऔर TargetApi?

कोटलिन में नमूना:

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

नोट: FingerprintManager.AuthenticationCallbackएपीआई की आवश्यकता हैM

नोट 2: अगर मैं टारगेट का उपयोग नहीं करता हूं तो त्रुटि के साथ लिंट विफल रहता है class requires api level 23...

जवाबों:


87

@RequiresApi - यह दर्शाता है कि एनोटेट तत्व को केवल दिए गए एपीआई स्तर या उच्चतर पर बुलाया जाना चाहिए।

@TargetApi - इंगित करता है कि लिंट को दिए गए एपीआई स्तर को लक्षित करने के रूप में इस प्रकार का व्यवहार करना चाहिए, कोई फर्क नहीं पड़ता कि परियोजना लक्ष्य क्या है।


42

मैं पहली बार मान सकता हूँ कि आपका मिनी एपीआई संस्करण आपके द्वारा कॉल की जाने वाली एपीआई से कम है, क्योंकि इस तरह के एनोटेशन से कुछ समझ में आता है

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

जब इस पद्धति को एनोटेट किया जाता है, तो कभी भी आप उस पद्धति को कॉल करते हैं, तो आपके पास एक अच्छी लाल चेतावनी प्राप्त होती है कि इस कॉल के लिए एपीआई संस्करण की आवश्यकता होती है जो कि आपके मिन एपीपी संस्करण से अधिक है, लेकिन यह आपको अपने एपीके को संकलित करने और बनाने से नहीं रोकता है, यह जैसा कि मैंने इसे परीक्षण किया है, बस Android के निचले संस्करणों पर दुर्घटनाग्रस्त हो जाएगा।

@TargetApi

यह बिल्कुल भी मदद नहीं करता है, यह आपके तरीके में नई एप्स को कॉल करने की चेतावनी को दबा देता है, लेकिन जब आप इस पद्धति को कहीं और से कॉल करते हैं, तो कोई लिंट चेतावनी नहीं होती है, और आप अभी भी केवल एक को पूरा करने के लिए अपनी एपीके का निर्माण और इंस्टॉल कर सकते हैं दुर्घटना जब उस विधि को कहा जाता है।


2
मुझे वास्तव में इस पृष्ठ पर उपलब्ध अन्य उत्तरों के बजाय इसे अधिक व्यापक और समझने में आसान लगा। इसलिए +1।
आनंद कुमार झा

1
यह एकमात्र उत्तर है जो सिद्धांत + अभ्यास की व्याख्या करता है, इसे वास्तव में स्वीकार किया जाना चाहिए।
दिमित्री पावलुकिन

37

माइक ने जैसा कहा, वैसा ही जैसा कि आप प्रलेखन में देख सकते हैं:

यह दर्शाता है कि एनोटेट तत्व को केवल दिए गए एपीआई स्तर या उच्चतर पर बुलाया जाना चाहिए।

यह पुराने @TargetApi एनोटेशन के उद्देश्य के समान है, लेकिन अधिक स्पष्ट रूप से व्यक्त करता है कि यह कॉलर पर एक आवश्यकता है, इसके बजाय उस विधि के भीतर चेतावनियों को "दबाने" के लिए उपयोग किया जा रहा है जो मिन्सडेकवर्सन से अधिक है।

जैसा कि आप यहां देख सकते हैं, यह वास्तव में आपके आईडीई / एलआईटी से चेतावनी को हटाने के बजाय, इस विधि में कॉल करते समय उपयोग किए जाने वाले एपीआई को सत्यापित करने के लिए कॉलर को लागू कर रहा है।

आप इसकी तुलना @NonNull या @Null एनोटेशन से कर सकते हैं, वे कहते हैं कि कॉलर फ़ंक्शन में शून्य मान भेज / नहीं सकता / सकती है।


21

JavaDocs से https://developer.android.com/reference/android/support/annotation/RequiresApi.html :

[@RequiresApi] यह पुराने @TargetApi एनोटेशन के उद्देश्य के समान है, लेकिन अधिक स्पष्ट रूप से व्यक्त करता है कि यह कॉलर पर एक आवश्यकता है, बजाय इसके कि minSdkVersion से अधिक की विधि के भीतर "दबाने" के लिए उपयोग किया जा रहा है।

मुझे लगता है कि वे कार्यात्मक रूप से समतुल्य हैं, लेकिन @RequiresApiनए लगते हैं और अधिक कार्यक्षमता को शामिल करने के लिए विस्तारित होने की संभावना अधिक है।


@Pern केयर यह समझाने के लिए कि यह गलत क्यों है?
hamena314

6

वे दोनों अन्य एपीआई स्तरों को प्रभावित किए बिना नए एंड्रॉइड एपीआई स्तरों में जोड़े गए फीचर को संभालने के लिए हैं।

RequiresApi

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

यहां यह कहता है कि एनोटेट तत्व को केवल दिए गए एपीआई स्तर या उच्चतर पर बुलाया जाना चाहिए। दिए गए API स्तर से नीचे का एनोटेट तत्व कॉल नहीं करेगा।

TargetApi

@TargetApi(Build.VERSION_CODES.*api_code*)

इंगित करता है कि लिंट को इस तरह का व्यवहार करना चाहिए जैसे कि किसी दिए गए एपीआई स्तर को लक्षित करना, चाहे वह परियोजना का लक्ष्य कुछ भी हो। केवल निर्दिष्ट एपीआई स्तर के लिए। अन्य एपीआई स्तर पर नहीं बुलाया जाएगा।


जब मैंने उपयोग किया @RequiresApi, तो AS ने एक विधि कॉल को लाल के साथ रेखांकित किया और एक पूरी कक्षा को एक त्रुटि के रूप में।
CoolMind

@CoolMind क्या आपने किसी विधि के अंदर "@RequiresApi" का उपयोग किया है?
जीवन वेणुगोपाल

नहीं, मैंने इसे एक विधि से पहले जोड़ा, जैसे @TargetApi
कूलमैन्ड

@CoolMind "@RequiresApi" को उस विधि का उपयोग करने का प्रयास करता है जिसे आप कॉल कर रहे हैं। या कॉल को इस तरह से घेरें। if (Build.VERSION.SDK_INT> = Build.VERSION_CODES। * api_code *) {// आपकी विधि का नाम}
जीवन वेणुगोपाल

हां, if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {काम करता है, लेकिन मेरे पास पहले से ही यह विधि है। धन्यवाद!
कूलमैन्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.