2010-08-23 11 views
7

क्या कोड की एक साधारण रेखा है जो ओएस संस्करण आवश्यकताओं को पूरा करती है तो केवल कोड लोड करने की अनुमति देगी?एंड्रॉइड ओएस संस्करण के अनुसार केवल कोड की विशिष्ट लाइनों को लोड करना संभव है?

मान लें कि मेरे पास 2.2 के रूप में मेरा लक्ष्य ओएस है लेकिन न्यूनतम एसडीके एंड्रॉइड 1.5 के लिए 3 है, भले ही मेरे पास मेरे प्रोजेक्ट में कुछ कोड है जो 1.5 के साथ संगत नहीं है, फिर भी यह लक्ष्य ओएस 2.2 के बाद से संकलित होगा। वैसे भी, मैं ऐसी सुविधा का विज्ञापन करना चाहता हूं जिसके लिए 1.5 एसडीके में कोड की आवश्यकता नहीं है और यदि यह 1.5 फोन पर लोड हो तो क्रैश हो जाएगा। क्या इस तरह की एक साधारण चीज है जो मैं कर सकता हूं? तो मुझे पूरा ऐप 1.5 उपयोगकर्ताओं को उपलब्ध नहीं करना है?

if (Android OS == >2.1){ 
      //Insert code here that requires 2.1 and up} 
     else{ 
      //insert code that would appear is OS is <2.1} 
+0

अपने जवाब के अलावा, यहां कुछ नमूना तकनीक का प्रदर्शन परियोजनाओं हैं: http://github.com/commonsguy/cw-advandroid/tree/ मास्टर/संपर्क/पिक/http://github.com/commonsguy/cw-advandroid/tree/master/Contacts/Spinners/ – CommonsWare

उत्तर

11

हाँ, आप ऐसा कर सकते हैं। वास्तव में एक से अधिक तरीके हैं। (नोट: इस उत्तर का एकमात्र एंड्रॉइड विशिष्ट हिस्सा प्लेटफ़ॉर्म संस्करण को ढूंढने का तरीका है।)

मान लीजिए कि कक्षा 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* संकलित करने के लिए की आवश्यकता होगी कक्षाएं) विभिन्न एंड्रॉइड एसडीके का उपयोग कर। यह आपकी बिल्ड प्रक्रियाओं को और अधिक जटिल बना देगा।


अन्य के लिए "लेता है" इस समस्या पर, एंड्रॉयड ब्लॉग पर निम्नलिखित लेख पढ़ें:

0

आप Build.VERSION.RELEASE से सलाह ले सकते हैं, यह आप अपने Android प्रणाली के वर्तमान संस्करण देता है (1.5,1.6,2.1,2.2)

नहीं है के बारे में अधिक Build.VERSION

2

यहाँ एक और उदाहरण है w/ओ प्रतिबिंब http://android-developers.blogspot.com/2010/07/how-to-have-your-cupcake-and-eat-it-too.html

+0

फीडबर्नर पैरामीटर के साथ यूआरआई मेरे लिए विफल रहता है। ब्लॉग पोस्ट http://android-developers.blogspot.com/2010/07/how-to-have-your-cupcake-and-eat-it-too.html पर है –

संबंधित मुद्दे

 संबंधित मुद्दे