एंड्रॉइड में ग्लोबल/शेयर्ड स्टेट प्रबंधित करना
"ग्लोबल वेरिएबल" एंड्रॉइड में मौजूद नहीं हैं जैसे वे C/C++ में होते हैं। इसके बजाय, हम दायरे और जीवनचक्र के आधार पर कई पैटर्न का उपयोग करते हैं: Application उपवर्ग, सिंगलटन, ViewModel, SharedPreferences, या डिपेंडेंसी इंजेक्शन (Hilt/Koin)।
पैटर्न 1 - Application उपवर्ग (प्रक्रिया-स्तरीय स्थिति)
// MyApp.java
public class MyApp extends Application {
private String globalToken;
public String getGlobalToken() { return globalToken; }
public void setGlobalToken(String token) { this.globalToken = token; }
}
मैनिफेस्ट में पंजीकृत करें: <application android:name=".MyApp" ...>।
कहीं भी एक्सेस करें: ((MyApp) getApplication()).getGlobalToken()।
पैटर्न 2 - सिंगलटन (सरल, लेकिन सावधानी से उपयोग करें)
public final class AppSettings {
private static final AppSettings INSTANCE = new AppSettings();
private String userName;
private AppSettings() {}
public static AppSettings getInstance() { return INSTANCE; }
public String getUserName() { return userName; }
public void setUserName(String userName) { this.userName = userName; }
}
उपयोग: AppSettings.getInstance().setUserName("अमित")।
चेतावनी: प्रक्रिया मृत्यु पर स्थिति खो जाती है; UI-संबंधित डेटा के लिए ViewModel पसंद करें।
पैटर्न 3 - ViewModel (UI-स्कोप्ड, कॉन्फिगरेशन-परिवर्तन सुरक्षित)
public class SharedViewModel extends ViewModel {
private final MutableLiveData sharedText = new MutableLiveData<>();
public LiveData getSharedText() { return sharedText; }
public void setSharedText(String text) { sharedText.setValue(text); }
}
गतिविधि/फ्रैगमेंट में:
SharedViewModel vm = new ViewModelProvider(requireActivity()).get(SharedViewModel.class); vm.getSharedText().observe(getViewLifecycleOwner(), text -> textView.setText(text));
पैटर्न 4 - SharedPreferences (स्थायी कुंजी-मान)
// सहेजें
getSharedPreferences("prefs", MODE_PRIVATE).edit().putString("key", "value").apply();
// लोड करें
String val = getSharedPreferences("prefs", MODE_PRIVATE).getString("key", "");
पैटर्न 5 - डिपेंडेंसी इंजेक्शन (Hilt उदाहरण)
@Module
@InstallIn(SingletonComponent.class)
public class AppModule {
@Provides @Singleton
static AppSettings provideSettings() { return new AppSettings(); }
}
इंजेक्ट करें: @Inject AppSettings settings;।
तुलना तालिका
| पैटर्न | स्कोप | प्रक्रिया मृत्यु पर जीवित रहता है | जीवनचक्र-जागरूक | उपयोग-मामला |
|---|---|---|---|---|
| Application उपवर्ग | प्रक्रिया | नहीं | नहीं | टोकन, कैश, इनिट क्रम |
| सिंगलटन | प्रक्रिया | नहीं | नहीं | सरल स्थिति, स्थिरांक |
| ViewModel | गतिविधि/फ्रैगमेंट ग्राफ | नहीं (लेकिन कॉन्फिग परिवर्तन पर जीवित रहता है) | हां | UI स्थिति, फॉर्म डेटा |
| SharedPreferences | स्थायी | हां | नहीं | उपयोगकर्ता प्राथमिकताएं, टोकन |
| Hilt/Koin (सिंगलटन) | कंटेनर-परिभाषित | नहीं | स्कोप के साथ | सेवाएं, रिपॉजिटरी, बड़े ऐप्स |
सर्वोत्तम अभ्यास
- UI स्थिति के लिए स्थिर क्षेत्रों से बचें — वे मेमोरी लीक और क्रैश का कारण बनते हैं।
- ViewModel को स्क्रीन-स्तरीय डेटा के लिए प्राथमिकता दें; यह घूर्णन से बचता है।
- Application का उपयोग केवल वास्तव में ग्लोबल, गैर-UI ऑब्जेक्ट्स (OkHttpClient, डेटाबेस इंस्टेंस) के लिए करें।
- SharedPreferences का उपयोग छोटे स्थायी मूल्यों के लिए करें; बड़े JSON के लिए DataStore/Room का उपयोग करें।
- DI फ्रेमवर्क मध्यम-बड़े प्रोजेक्ट्स में मैन्युअल सिंगलटन को प्रतिस्थापित करते हैं।
मूल उदाहरण की समीक्षा
दिया गया कोड एक सिंगलटन (singleToneClass) का उपयोग करता है लेकिन TextView पर क्लिक लिसनर के अंदर इसे एक्सेस करता है। यह छोटे डेमो के लिए काम करता है लेकिन उत्पादन के लिए स्केल नहीं करता। ऊपर दिए गए पैटर्न को अपनाएं।