एप्लिकेशन संदर्भ प्राप्त करने के लिए एक सुविधाजनक तरीका चाहते हैं, जो बहुसंख्यक अपनी खुद की कक्षा बनाते हैं जो फैली हुई है android.app.Application
।
मार्गदर्शक
आप अपनी परियोजना में निम्नलिखित की तरह पहली कक्षा बनाकर इसे पूरा कर सकते हैं:
import android.app.Application;
import android.content.Context;
public class App extends Application {
private static Application sApplication;
public static Application getApplication() {
return sApplication;
}
public static Context getContext() {
return getApplication().getApplicationContext();
}
@Override
public void onCreate() {
super.onCreate();
sApplication = this;
}
}
फिर, अपने AndroidManifest में आपको AndroidManifest.xml के टैग में अपनी कक्षा का नाम निर्दिष्ट करना चाहिए:
<application
...
android:name="com.example.App" >
...
</application>
फिर आप निम्न का उपयोग करके किसी भी स्थिर विधि में एप्लिकेशन संदर्भ प्राप्त कर सकते हैं:
public static void someMethod() {
Context context = App.getContext();
}
चेतावनी
अपने प्रोजेक्ट में उपरोक्त जैसा कुछ जोड़ने से पहले आपको विचार करना चाहिए कि प्रलेखन क्या कहता है:
एप्लिकेशन को उप-वर्ग करने की कोई आवश्यकता नहीं है। अधिकांश स्थिति में, स्थिर एकल एकल अधिक कार्यात्मक तरीके से समान कार्यक्षमता प्रदान कर सकते हैं। यदि आपके सिंगलटन को एक वैश्विक संदर्भ (उदाहरण के लिए प्रसारण रिसीवर्स को पंजीकृत करना) की आवश्यकता है, तो इसे पुनः प्राप्त करने के लिए फ़ंक्शन को एक संदर्भ दिया जा सकता है जो पहली बार सिंगलटन का निर्माण करते समय Context.getApplicationContext () का उपयोग करता है।
प्रतिबिंब
प्रतिबिंब का उपयोग करके एप्लिकेशन संदर्भ प्राप्त करने का एक और तरीका भी है। प्रतिबिंब को अक्सर एंड्रॉइड पर देखा जाता है और मुझे व्यक्तिगत रूप से लगता है कि इसका उपयोग उत्पादन में नहीं किया जाना चाहिए।
एप्लिकेशन संदर्भ को पुनः प्राप्त करने के लिए हमें एक छिपे हुए वर्ग ( एक्टिविटीथ्रेड ) पर एक विधि लागू करनी चाहिए जो एपीआई 1 के बाद से उपलब्ध है।
public static Application getApplicationUsingReflection() throws Exception {
return (Application) Class.forName("android.app.ActivityThread")
.getMethod("currentApplication").invoke(null, (Object[]) null);
}
एक और छिपा वर्ग ( AppGlobals ) है जो एक स्थिर तरीके से एप्लिकेशन संदर्भ प्राप्त करने का एक तरीका प्रदान करता है। यह संदर्भ का उपयोग करता है ActivityThread
इसलिए वास्तव में निम्नलिखित विधि और ऊपर पोस्ट किए गए के बीच कोई अंतर नहीं है:
public static Application getApplicationUsingReflection() throws Exception {
return (Application) Class.forName("android.app.AppGlobals")
.getMethod("getInitialApplication").invoke(null, (Object[]) null);
}
हैप्पी कोडिंग!