हाँ, आप ऐसा कर सकते हैं। वास्तव में एक से अधिक तरीके हैं। (नोट: इस उत्तर का एकमात्र एंड्रॉइड विशिष्ट हिस्सा प्लेटफ़ॉर्म संस्करण को ढूंढने का तरीका है।)
मान लीजिए कि कक्षा X
में संस्करण 2.0 में void y()
विधि है, लेकिन इससे पहले नहीं।
विधि का पता लगाने के लिए प्रतिबिंब का उपयोग करने के लिए किसी भी संकलन समय निर्भरताओं को प्रस्तुत करने के साथ इस विधि को आमंत्रित करने का एक तरीका है और invoke
पर कॉल करें। उदाहरण के लिए:
X x = ...
if (BUILD.VERSION.RELEASE.compareTo("2.0") >= 0) {
// (exception handling omitted ...)
Method m = c.getClass().getDeclaredMethod("y");
m.invoke(x);
}
एक और तरीका है इस तरह अपने आवेदन के लिए एक संस्करण अनुकूलता एडाप्टर एपीआई बनाने के लिए है:
/** Version compatibility adapter API */
interface Compat {
void doY();
}
/** Adapter class for version 1 */
class CompatV1 {
public void y(X x) {
// do nothing
}
}
/** Adapter class for version 2 */
class CompatV2 {
public void y(X x) {
x.y();
}
}
//
// Code to instantiate the relevant adapter for the current platform.
//
Class<?> compatClass;
// (Exception handling omitted)
if (BUILD.VERSION.RELEASE.compareTo("2.0") < 0) {
compatClass = Class.forName("...CompatV1");
} else {
compatClass = Class.forName("...CompatV2");
}
// (Exception handling omitted)
Compat compat = (Compat) compatClass.newInstance();
// The adapter object can be passed around as a parameter, wrapped
// as a singleton or injected using dependency injection.
// Invoke X.y() as follows:
X x = ...
compat.y(x);
दूसरे संस्करण थोड़ा दिग्गज लग रहा है, लेकिन यह लाभ है कि गतिशील (धीमी, गैर-प्रकार-सुरक्षित) कोड केवल एक बार निष्पादित किया जाता है, और यह कि संस्करण विशिष्ट कोड शेष कोड से अलग होता है। वास्तविक जीवन में, आप शायद एडाप्टर इंटरफ़ेस में कई विधियां डाल देंगे।
इस दृष्टिकोण को संगतता API को डिज़ाइन करने के तरीके के बारे में थोड़ा और विचार करने की आवश्यकता है ताकि यह शेष कोड से संस्करण निर्भरताओं को स्पष्ट रूप से अलग कर सके। आपको एडाप्टर एपीआई को संशोधित करना पड़ सकता है, और प्रत्येक नई (असंगत) प्रमुख रिलीज के लिए नई एडाप्टर कक्षाएं बनाना पड़ सकता है।
अंत में, यदि प्लेटफ़ॉर्म API परिवर्तन है कि आप पुराने संस्करण हैं कि कक्षाओं में या तरीकों का उपयोग कर आवश्यक के लिए अनुकूल करने की जरूरत है नए संस्करण में हटा दिया, तो आप अपने विभिन्न अनुकूलक वर्गों (जैसे CompatV*
संकलित करने के लिए की आवश्यकता होगी कक्षाएं) विभिन्न एंड्रॉइड एसडीके का उपयोग कर। यह आपकी बिल्ड प्रक्रियाओं को और अधिक जटिल बना देगा।
अन्य के लिए "लेता है" इस समस्या पर, एंड्रॉयड ब्लॉग पर निम्नलिखित लेख पढ़ें:
अपने जवाब के अलावा, यहां कुछ नमूना तकनीक का प्रदर्शन परियोजनाओं हैं: http://github.com/commonsguy/cw-advandroid/tree/ मास्टर/संपर्क/पिक/http://github.com/commonsguy/cw-advandroid/tree/master/Contacts/Spinners/ – CommonsWare