2012-02-25 15 views
20

एंड्रॉइड में, क्या स्थैतिक तरीके के आवेदन को प्राप्त करने का कोई तरीका है? उदाहरण के लिए इसे पृष्ठभूमि थ्रेड से पुनर्प्राप्त करने के लिए।कहीं से भी संदर्भ कैसे प्राप्त करें?

धन्यवाद

+1

सामान्य तौर पर आप के माध्यम से एक संदर्भ संदर्भ पास करना चाहिए एक तर्क अगर आप किसी विधि को कॉल करते हैं जिसे इसकी आवश्यकता है * (लेकिन संदर्भ को संग्रहित न करें, यह स्मृति रिसाव का कारण बन सकता है) *। आप कुछ परिस्थितियों में इसके लिए एप्लिकेशन-ऑब्जेक्ट का भी उपयोग कर सकते हैं, [यह प्रश्न] देखें (http://stackoverflow.com/questions/987072/using-plication-context- हर जगह)। लेकिन उत्तर में वर्णित सीमाओं को ध्यान में रखें। –

उत्तर

50

सबसे आसान (और सही) तरीका है:

एक नया वर्ग

public class MyApp extends Application { 
    private static MyApp instance; 

    public static MyApp getInstance() { 
     return instance; 
    } 

    public static Context getContext(){ 
     return instance; 
     // or return instance.getApplicationContext(); 
    } 

    @Override 
    public void onCreate() { 
     instance = this; 
     super.onCreate(); 
    } 
} 
फिर अपने मेनिफ़ेस्ट में

परिभाषित करें आप पर "नाम" फ़ील्ड को इस वर्ग को जोड़ने की आवश्यकता "एप्लिकेशन" टैब। या XML को संपादित करने और

<application 
    android:name="com.example.app.MyApp" 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" 
    ....... 
    <activity 
     ...... 

रखा और फिर कहीं से भी आप कॉल कर सकते हैं

MyApp.getContext(); 

आशा है कि यह मदद करता है

+2

यह काम करेगा, लेकिन किसी भी सिंगलटन का उपयोग करने के साथ सावधान रहें, जिसका आप इसका दुरुपयोग नहीं करते हैं। [इस सवाल] का जवाब पढ़ें (http://stackoverflow.com/questions/7298731/when-to-call-activity- संदर्भ-या-अनुप्रयोग-संदर्भ/7298955 # 7298955) यह बताते हुए कि एप्लिकेशन कॉन्टेक्स्ट शायद ही कभी (संभवतः) सही संदर्भ का उपयोग क्यों करता है। बेस्ट वे: जब तक आप बस एक सार्वजनिक विधि का पर्दाफाश नहीं करते हैं जो आपके वर्गों के अंदर एक तर्क के रूप में एक संदर्भ के रूप में संदर्भ लेता है जिसके लिए संदर्भ (और इसे अपनी गतिविधि से पास किया जाता है) की आवश्यकता होती है, तो यह करने का यह तरीका है। एक्सप: सार्वजनिक शून्य abc (संदर्भ सी, int ए); और इसे किसी भी गतिविधि से कॉल करें। –

12

मूल रूप से आप प्रसंग के 2 प्रकार है - गतिविधि प्रसंग और Application Context

सबकुछ के लिए केवल एक संदर्भ का उपयोग करना आवश्यक नहीं है। यदि आप संदर्भ की आवश्यकता वाले हर मामले में एक संदर्भ का उपयोग करते हैं तो समस्याएं हैं। इस तरह कुछ का पालन करना सबसे अच्छा है - गतिविधि के अंदर गतिविधि संदर्भ का उपयोग करें और एप्लिकेशन संदर्भ किसी गतिविधि के दायरे से बाहर एक संदर्भ पारित करते समय, जो आपको memory leaks से बचने में मदद करेगा।

यदि आप इस आलेख को पढ़ते हैं तो आप दो संदर्भों के बीच अंतर देख सकते हैं।

ऐप्लिकेशन संदर्भ जब तक आपके आवेदन जिंदा है और गतिविधियों के जीवन चक्र पर निर्भर नहीं करता रहना होगा। यदि आप पर लंबे समय तक रहने वाली वस्तुओं को रखने के लिए योजना बनाते हैं, तो एप्लिकेशन ऑब्जेक्ट को याद रखें।

इसके बजाय गतिविधि प्रसंग गतिविधि के साथ जुड़ा हुआ है और रूप में कई बार के रूप में गतिविधि नष्ट हो जाता है को नष्ट कर दिया जा सकता है - बदलते स्क्रीन अभिविन्यास, वापस बटन आदि

+2

यह अच्छा जवाब है। – ctn

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