इसे प्राप्त करने के लिए सबसे आम तरीकों का संकलन :
- आशय के अंदर डेटा भेजें
- स्थैतिक क्षेत्र
- का हाशपैप
WeakReferences
- स्थायी वस्तुएँ (साइक्लाइट, शेयर प्राथमिकताएँ, फ़ाइल, आदि)
टीएल; डीआर : डेटा साझा करने के दो तरीके हैं: आशय के एक्स्ट्रा में डेटा पास करना या इसे कहीं और सहेजना। यदि डेटा आदिम है, स्ट्रिंग्स या उपयोगकर्ता-परिभाषित ऑब्जेक्ट: इसे इरादे के हिस्से के रूप में भेजें (उपयोगकर्ता द्वारा परिभाषित ऑब्जेक्ट को लागू करना होगा Parcelable
)। यदि पासिंग ऑब्जेक्ट्स किसी एकल में एक उदाहरण को कहीं और सहेजते हैं और उन्हें लॉन्च की गई गतिविधि से एक्सेस करते हैं।
कैसे और क्यों प्रत्येक दृष्टिकोण को लागू करने के कुछ उदाहरण हैं:
इंटेंट्स के अंदर डेटा भेजें
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("some_key", value);
intent.putExtra("some_other_key", "a value");
startActivity(intent);
दूसरी गतिविधि पर:
Bundle bundle = getIntent().getExtras();
int value = bundle.getInt("some_key");
String value2 = bundle.getString("some_other_key");
यदि आप आदिम डेटा या स्ट्रिंग्स पास कर रहे हैं तो इस विधि का उपयोग करें । आप उन वस्तुओं को भी पास कर सकते हैं जो लागू होते हैं Serializable
।
हालांकि लुभाने के लिए, आपको उपयोग करने से पहले दो बार सोचना चाहिए Serializable
: यह त्रुटि प्रवण है और बहुत धीमा है। तो सामान्य तौर पर: यदि संभव हो तो दूर रहेंSerializable
। यदि आप जटिल उपयोगकर्ता-परिभाषित ऑब्जेक्ट पास करना चाहते हैं, तो Parcelable
इंटरफ़ेस पर एक नज़र डालें । इसे लागू करना कठिन है, लेकिन इसकी तुलना में इसमें काफी गति है Serializable
।
डिस्क पर बने बिना डेटा साझा करें
दी गई स्मृति में इसे सहेजकर गतिविधियों के बीच डेटा साझा करना संभव है, ज्यादातर मामलों में, दोनों गतिविधियां एक ही प्रक्रिया में चलती हैं।
नोट: कभी-कभी, जब उपयोगकर्ता आपकी गतिविधि को छोड़ देता है (इसे छोड़ने के बिना), तो एंड्रॉइड आपके एप्लिकेशन को मारने का फैसला कर सकता है। ऐसे परिदृश्य में, मैंने ऐसे मामलों का अनुभव किया है जिसमें एंड्रॉइड ऐप को मारने से पहले दिए गए इरादे का उपयोग करके अंतिम गतिविधि को लॉन्च करने का प्रयास करता है। इस स्थिति में, डेटा एक सिंगलटन में संग्रहीत किया जाता है (या तो आपका याApplication
) चला जाएगा और खराब चीजें हो सकती हैं। इस तरह के मामलों से बचने के लिए, आप या तो ऑब्जेक्ट्स को जारी रखने के लिए डेटा का उपयोग करने या उसे जाँचने के लिए बनाए रखते हैं ताकि यह सुनिश्चित हो सके।
एकल वर्ग का उपयोग करें
डेटा रखने के लिए एक वर्ग रखें:
public class DataHolder {
private String data;
public String getData() {return data;}
public void setData(String data) {this.data = data;}
private static final DataHolder holder = new DataHolder();
public static DataHolder getInstance() {return holder;}
}
लॉन्च की गई गतिविधि से:
String data = DataHolder.getInstance().getData();
एप्लिकेशन सिंगलटन का उपयोग करें
एप्लिकेशन सिंगलटन एक उदाहरण है, android.app.Application
जिसे ऐप लॉन्च करने पर बनाया जाता है। आप एक कस्टम प्रदान कर सकते हैं Application
:
import android.app.Application;
public class MyApplication extends Application {
private String data;
public String getData() {return data;}
public void setData(String data) {this.data = data;}
}
गतिविधि शुरू करने से पहले:
MyApplication app = (MyApplication) getApplicationContext();
app.setData(someData);
फिर, लॉन्च की गई गतिविधि से:
MyApplication app = (MyApplication) getApplicationContext();
String data = app.getData();
स्थैतिक क्षेत्र
विचार मूल रूप से सिंगलटन के समान है, लेकिन इस मामले में आप डेटा तक स्थिर पहुंच प्रदान करते हैं:
public class DataHolder {
private static String data;
public static String getData() {return data;}
public static void setData(String data) {DataHolder.data = data;}
}
लॉन्च की गई गतिविधि से:
String data = DataHolder.getData();
का हाशपैप WeakReferences
एक ही विचार है, लेकिन कचरा संग्रहकर्ता को अप्राप्त वस्तुओं को हटाने की अनुमति देता है (जैसे जब उपयोगकर्ता गतिविधि को समाप्त करता है):
public class DataHolder {
Map<String, WeakReference<Object>> data = new HashMap<String, WeakReference<Object>>();
void save(String id, Object object) {
data.put(id, new WeakReference<Object>(object));
}
Object retrieve(String id) {
WeakReference<Object> objectWeakReference = data.get(id);
return objectWeakReference.get();
}
}
गतिविधि शुरू करने से पहले:
DataHolder.getInstance().save(someId, someObject);
लॉन्च की गई गतिविधि से:
DataHolder.getInstance().retrieve(someId);
आशय के अतिरिक्त का उपयोग करके आपको ऑब्जेक्ट आईडी पास करना पड़ सकता है या नहीं करना चाहिए। यह सब आपकी विशिष्ट समस्या पर निर्भर करता है।
डिस्क के लिए वस्तुओं को जारी रखें
अन्य गतिविधि शुरू करने से पहले डिस्क में डेटा को बचाने के लिए विचार है।
लाभ: आप अन्य स्थानों से गतिविधि लॉन्च कर सकते हैं और, यदि डेटा पहले से ही कायम है, तो यह ठीक काम करना चाहिए।
नुकसान: यह बोझिल है और इसे लागू करने में अधिक समय लगता है। अधिक कोड की आवश्यकता है और इस प्रकार बग को शुरू करने की अधिक संभावना है। यह काफी धीमा भी होगा।
वस्तुओं को बनाए रखने के कुछ तरीकों में शामिल हैं: