गतिविधियों के बीच डेटा साझा करने का सबसे अच्छा तरीका क्या है?


239

मेरे पास एक गतिविधि है जो पूरे ऐप में उपयोग की जाने वाली मुख्य गतिविधि है और इसमें कई चर हैं। मेरे पास दो अन्य गतिविधियां हैं जो मैं पहली गतिविधि से डेटा का उपयोग करने में सक्षम होना चाहूंगा। अब मुझे पता है कि मैं ऐसा कुछ कर सकता हूं:

GlobalState gs = (GlobalState) getApplication();
String s = gs.getTestMe();

हालाँकि मैं बहुत सारे चर साझा करना चाहता हूं और कुछ बड़े भी हो सकते हैं इसलिए मैं ऊपर की तरह उनकी प्रतियां नहीं बनाना चाहता।

क्या तरीकों को प्राप्त करने और सेट करने के बिना चर को सीधे प्राप्त करने और बदलने का एक तरीका है? मुझे याद है कि Google देव साइट पर एक लेख पढ़ते हुए कहा गया है कि यह एंड्रॉइड पर प्रदर्शन के लिए अनुशंसित नहीं है।


2
Android 2.3 (जिंजरब्रेड) के रूप में, Dalvik द्वारा स्वचालित रूप से प्रदर्शन / सेट का अनुकूलन किया जाता है; यह केवल तभी प्रासंगिक है जब आप Android के पुराने संस्करणों को लक्षित कर रहे हैं।
स्टेलारवर्टक्स

ध्यान दें कि उदाहरण स्ट्रिंग डेटा की प्रतिलिपि नहीं करता है। बल्कि यह उसी स्ट्रिंग ऑब्जेक्ट का संदर्भ बनाता है।
कोड-अपरेंटिस

यह विश्वास करना कठिन है, किसी अन्य गतिविधि से गतिविधि शुरू करने और पहली से दूसरी तक किसी भी जटिल वस्तु को पारित करने की कोई संभावना क्यों नहीं है? क्रमबद्धता के बिना, वस्तु और उस सभी प्रयास को सहेजना। क्या यह सुरक्षा छेद है या क्या अन्य कारण वस्तु संदर्भ को पास करने के खिलाफ है यदि दोनों गतिविधियाँ एक ही ऐप में हैं? (मैं समझता हूं कि अगर वे अलग-अलग ऐप में हैं तो यह अलग है)
ड्रॉइडम


LiveData सबसे अच्छा, सबसे हालिया समाधान है। नीचे मेरे जवाब की जाँच करें।
अमीर उलवाल

जवाबों:


476

इसे प्राप्त करने के लिए सबसे आम तरीकों का संकलन :

  • आशय के अंदर डेटा भेजें
  • स्थैतिक क्षेत्र
  • का हाशपैप 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);

आशय के अतिरिक्त का उपयोग करके आपको ऑब्जेक्ट आईडी पास करना पड़ सकता है या नहीं करना चाहिए। यह सब आपकी विशिष्ट समस्या पर निर्भर करता है।

डिस्क के लिए वस्तुओं को जारी रखें

अन्य गतिविधि शुरू करने से पहले डिस्क में डेटा को बचाने के लिए विचार है।

लाभ: आप अन्य स्थानों से गतिविधि लॉन्च कर सकते हैं और, यदि डेटा पहले से ही कायम है, तो यह ठीक काम करना चाहिए।

नुकसान: यह बोझिल है और इसे लागू करने में अधिक समय लगता है। अधिक कोड की आवश्यकता है और इस प्रकार बग को शुरू करने की अधिक संभावना है। यह काफी धीमा भी होगा।

वस्तुओं को बनाए रखने के कुछ तरीकों में शामिल हैं:


11
मैं तर्क दूंगा कि यह बड़े / अधिक जटिल डेटा के लिए "सामान्य" तरीका नहीं है। स्टैटिक सिंगलटन या एप्लिकेशन ऑब्जेक्ट का उपयोग करना कहीं अधिक आसान है, और यह बहुत अच्छा काम करता है। अब जब ओपी ने कहा कि उदाहरण में एक स्ट्रिंग का उपयोग किया है, तो उसके लिए, आशय एकदम सही और पसंदीदा है।
चार्ली कोलिन्स

10
Serializable ने एंड्रॉइड प्रक्रिया मॉडल पर गंभीर प्रदर्शन के मुद्दों को पाया है। इसलिए उन्होंने पार्सल को पेश किया। उपरोक्त उत्तर में Serializable के बजाय Parcelable पढ़ें ।
सबिन सेबेस्टियन

3
यह setResultविधि के माध्यम से किया जाता है । साथ ही, उस स्थिति में, startActivityForResultविधि का उपयोग करके द्वितीयक गतिविधि को लागू करना होगा ।
क्रिश्चियन

2
महान सारांश! एकल नष्ट होने की समस्या के बारे में, बहुत सारी गतिविधियों और वस्तुओं वाले ऐप्स का एक सरल समाधान है: Activityपूरे उप-वर्ग का उपयोग करें , और इसकी onCreate()जाँच में सिंगलटन के किसी भी स्थिर क्षेत्र की, जिसे आप ऐप शुरू करते समय भरते हैं। यदि वह फ़ील्ड खाली है, तो अन्य गतिविधियों को मारने के लिए FLAG_ACTIVITY_CLEAR_TASKया गतिविधि का उपयोग करके प्रारंभ गतिविधि पर वापस जाएं BroadcastReceiver
जोंसक

1
मैं एप्लिकेशन क्लास में डेटा सहेजने की अनुशंसा नहीं करूंगा। यहाँ और पढ़ें: developerphil.com/dont-store-data-in-the-application-object
Shayan_Aryan

22

आप क्या उपयोग कर सकते हैं:

  1. गतिविधियों के बीच डेटा पास करना (जैसे क्रिस्टियन ने कहा)
  2. बहुत सारे स्थिर चर के साथ एक वर्ग का उपयोग करना (ताकि आप उन्हें कक्षा के उदाहरण के बिना और गेट्टर / सेटर के उपयोग के बिना कॉल कर सकें)
  3. डेटाबेस का उपयोग करना
  4. वरीयताएँ साझा की

आप जो चुनते हैं वह आपकी आवश्यकताओं पर निर्भर करता है। संभवतः जब आप "बहुत"


1
कृपया ध्यान दें कि स्टैटिक्स को प्रक्रिया मृत्यु पर मंजूरी दी जाती है
EpicPandaForce

@EpicPandaForce बेशक और जब डिवाइस को बंद कर दिया गया था।
वॉरेनफैथ

1
लेकिन अगर डिवाइस बंद कर दिया जाता है, तो ऐप MAINकार्रवाई से पुनरारंभ होता है । प्रक्रिया मृत्यु के बाद, आप जो भी गतिविधि अंतिम थी, उस पर फिर से शुरू करते हैं, जो कि ऐप में कहीं गहरा एक विस्तार पृष्ठ हो सकता है।
इपिकपांडफार्स

@EpicPandaForce लगता है कि आप मेरी विडंबना को याद कर रहे हैं, भले ही आप Cpt स्पष्ट नहीं हैं।
वॉरेनफैथ

16

Google आपको क्या करने की आज्ञा देता है! यहाँ: http://developer.android.com/resources/faq/framework.html#3

  • आदिम डेटा प्रकार
  • गैर-स्थायी वस्तुएँ
  • सिंगलटन वर्ग - मेरा पसंदीदा: डी
  • एक सार्वजनिक स्थैतिक क्षेत्र / विधि
  • वस्तुओं के लिए कमजोरियों का एक HashMap
  • लगातार ऑब्जेक्ट्स (एप्लिकेशन प्राथमिकताएं, फ़ाइलें, सामग्रीपॉइडर, SQLite DB)

1
स्थायी वस्तुओं के लिए Google लिंक: developer.android.com/guide/topics/data/data-storage.html
NicoMinsk

केवल एंटीपैटर्न, सिंग्लटन क्लास पहला डिज़ाइन पैटर्न है, स्टैटिक फील्ड / मेथड के साथ एक क्लास बहुत सारे व्यवहार करता है जैसे एकल और स्थैतिक वस्तुओं को बनाए रखने के लिए डेटाबेस बनाना कभी-कभी अच्छी बात नहीं है, निश्चित रूप से आपकी गलती नहीं है और आप सूची को संभव कर रहे हैं। इसे हासिल करने के तरीके, लेकिन मुझे आश्चर्य है कि Google ने इतनी मूर्खतापूर्ण चीज़, प्रदर्शन समस्याओं या क्या ?? या मैं Android तरीका नहीं समझ रहा हूँ ??
ला व्लोज़ मेरिल

लिंक टूट गया है :(
Shayan_Aryan

14

"हालांकि, मैं बहुत से चर साझा करना चाहता हूं और कुछ बड़े हो सकते हैं इसलिए मैं ऊपर की तरह उनकी प्रतियां नहीं बनाना चाहता।"

यह एक प्रतिलिपि नहीं बनाता है (विशेष रूप से स्ट्रिंग के साथ , लेकिन यहां तक ​​कि वस्तुओं को संदर्भ के मूल्य से पारित किया जाता है, न कि वस्तु ही, और गेट्टर की तरह जो उपयोग करने के लिए ठीक हैं - यकीनन अन्य साधनों की तुलना में उपयोग करने के लिए बेहतर है क्योंकि वे आम हैं और अच्छी तरह से समझ लिया)। पुराने "प्रदर्शन मिथकों", जैसे गेटर्स और सेटर का उपयोग नहीं करना, अभी भी कुछ मूल्य हैं, लेकिन डॉक्स में भी अपडेट किया गया है

लेकिन अगर आप ऐसा नहीं करना चाहते हैं, तो आप बस चर को सार्वजनिक कर सकते हैं या GlobalState में संरक्षित कर सकते हैं और उन्हें सीधे एक्सेस कर सकते हैं। और, आप एक स्थिर सिंगलटन बना सकते हैं जैसा कि एप्लिकेशन ऑब्जेक्ट JavaDoc इंगित करता है :

आमतौर पर एप्लिकेशन को उपवर्ग करने की कोई आवश्यकता नहीं है। ज्यादातर स्थिति में, स्थिर एकल एक ही कार्यक्षमता को अधिक मॉड्यूलर तरीके से प्रदान कर सकते हैं। यदि आपके सिंगलटन को एक वैश्विक संदर्भ की आवश्यकता है (उदाहरण के लिए प्रसारण रिसीवर को पंजीकृत करने के लिए), तो इसे पुनः प्राप्त करने के लिए फ़ंक्शन को एक संदर्भ दिया जा सकता है जो पहली बार सिंगलटन का निर्माण करते समय Context.getApplicationContext () का उपयोग करता है।

इंटेंट डेटा का उपयोग करना , क्योंकि अन्य उत्तर यहां नोट डेटा को पारित करने का एक और तरीका है, लेकिन इसका उपयोग आमतौर पर छोटे डेटा और सरल प्रकारों के लिए किया जाता है। आप बड़ा / अधिक जटिल डेटा पास कर सकते हैं, लेकिन यह केवल एक स्थिर एकल का उपयोग करने की तुलना में अधिक शामिल है। आवेदन वस्तु अभी भी एंड्रॉयड एप्लिकेशन घटकों हालांकि बीच बड़े / अधिक जटिल गैर लगातार डेटा साझा (क्योंकि यह किसी Android ऐप्लिकेशन में एक अच्छी तरह से परिभाषित जीवन चक्र है) के लिए मेरे निजी पसंदीदा है।

साथ ही, जैसा कि अन्य ने नोट किया है, यदि डेटा बहुत जटिल हो जाता है और लगातार बने रहने की आवश्यकता होती है तो आप SQLite या फाइलसिस्टम का भी उपयोग कर सकते हैं।


1
वास्तव में, मैंने हाल ही में डॉक्स में इस पर ठोकर खाई: हाल ही में developer.android.com/guide/appendix/faq/framework.html#3 । "गैर-निरंतर जटिल वस्तुओं" के लिए यह एक स्थिर सिंगलटन बनाने और फाड़ने के लिए एप्लिकेशन वर्ग का उपयोग करने की सिफारिश करता है! इस तरह से आपको अच्छी तरह से परिभाषित जीवनचक्र एप्लीकेशन प्रदान करता है, और एक स्थिर सिंगलटन के उपयोग में आसानी होती है।
चार्ली कोलिन्स

2
faq के उस खंड को अब हटा दिया गया है (मैं केवल "गैर-स्थायी वस्तुओं" और अनुप्रयोग वर्ग का कोई उल्लेख नहीं देखता हूं)। वैसे भी आप विस्तृत कर सकते हैं?
टोनी चैन

1
यह वर्तमान में developer.android.com/guide/faq/framework.html#3 पर है "मैं किसी एकल एप्लिकेशन के भीतर गतिविधियों / सेवाओं के बीच डेटा कैसे पास करूं?", और अनुप्रयोग वर्ग का कोई उल्लेख नहीं है।
जेरी

मुझे एक एप्लिकेशन ऑब्जेक्ट का उपयोग करना पसंद है, जिसे आपने "एंड्रॉइड इन एक्शन" में सेट किया है। लेकिन कई भावी नियोक्ता इसे पसंद नहीं करते हैं जब वे इसे कोड चुनौतियों में देखते हैं। वे गलत हो सकते हैं, लेकिन वे अपने वजन के आसपास फेंक देते हैं। BTW: कि 'Framework.html # 3 लिंक अब काम नहीं करता है।
मैट जे।

7

आप अपनी इच्छित किसी भी ऑब्जेक्ट पर एप्लिकेशन वर्ग और टैग का विस्तार कर सकते हैं , वे आपके आवेदन में कहीं भी उपलब्ध हैं


मैं एप्लिकेशन क्लास में डेटा सहेजने की अनुशंसा नहीं करूंगा। यहाँ और पढ़ें: developerphil.com/dont-store-data-in-the-application-object
Shayan_Aryan

4

गतिविधियों के बीच डेटा साझा करने का एक नया और बेहतर तरीका है, और वह है LiveData । विशेष रूप से एंड्रॉइड डेवलपर के पृष्ठ से इस उद्धरण की सूचना:

तथ्य यह है कि LiveData ऑब्जेक्ट जीवनचक्र-जागरूक हैं इसका मतलब है कि आप उन्हें कई गतिविधियों, टुकड़ों और सेवाओं के बीच साझा कर सकते हैं। उदाहरण को सरल रखने के लिए, आप LiveData वर्ग को एक सिंगलटन के रूप में लागू कर सकते हैं

इसका निहितार्थ बहुत बड़ा है - किसी भी मॉडल डेटा को एक LiveDataरैपर के अंदर एक सामान्य एकल वर्ग में साझा किया जा सकता है । यह ViewModelपरीक्षणीयता की खातिर उनके संबंधित गतिविधियों से इंजेक्ट किया जा सकता है । और आपको मेमोरी लीक को रोकने के लिए कमजोर संदर्भों के बारे में चिंता करने की आवश्यकता नहीं है।


2

ऊपर वर्णित कमजोर संदर्भ दृष्टिकोण, और http://developer.android.com/guide/faq/ramam.html में हैशमैप का उपयोग करना मेरे लिए समस्याग्रस्त लगता है। पूरी प्रविष्टियाँ कैसे पुनः प्राप्त की जाती हैं, न कि केवल मानचित्र मान? आप इसे किस दायरे में आवंटित करते हैं? जैसा कि ढांचा गतिविधि जीवन चक्र के नियंत्रण में है, भागीदार गतिविधियों में से एक होने के कारण यह अपने ग्राहकों के अग्रिम में नष्ट होने पर रनटाइम त्रुटियों का जोखिम उठाता है। यदि एप्लिकेशन इसका मालिक है, तो कुछ गतिविधि को एक मान्य कुंजी और संभावित रूप से एकत्र किए गए कमजोर संदर्भ के साथ प्रविष्टियों को होल्ड करने से रोकने के लिए प्रवेश को स्पष्ट रूप से हटा देना चाहिए। इसके अलावा, एक क्लाइंट को क्या करना चाहिए जब किसी कुंजी के लिए दिया गया मान शून्य है?

यह मुझे लगता है कि एक WeakHashMap अनुप्रयोग या एक सिंगलटन के भीतर एक बेहतर विकल्प है। मानचित्र में एक मूल्य एक प्रमुख वस्तु के माध्यम से पहुँचा जाता है, और जब कुंजी का कोई मजबूत संदर्भ मौजूद नहीं होता है (अर्थात सभी गतिविधियां कुंजी के साथ की जाती हैं और यह क्या मैप करता है), GC मानचित्र प्रविष्टि को पुनः प्राप्त कर सकता है।


2

गतिविधियों के बीच डेटा साझा करने के विभिन्न तरीके हैं

1: इंटेंट का उपयोग करके गतिविधियों के बीच डेटा पास करना

Intent intent=new Intent(this, desirableActivity.class);
intent.putExtra("KEY", "Value");
startActivity(intent)

2: स्टेटिक कीवर्ड का उपयोग करते हुए, वैरिएबल को पब्लिक स्टैटिक के रूप में परिभाषित करें और किसी भी प्रोजेक्ट में उपयोग करें

      public static int sInitialValue=0;

classname.variableName का उपयोग करके परियोजना में कहीं भी उपयोग करें;

3: डेटाबेस का उपयोग करना

लेकिन इसकी थोड़ी लंबी प्रक्रिया, आपको जरूरत पड़ने पर कर्सर का उपयोग करके डेटा डालने और डेटा को इटर्नेट करने के लिए क्वेरी का उपयोग करना होगा। लेकिन कैश को साफ किए बिना डेटा खोने का कोई मौका नहीं है।

4: साझा प्राथमिकताएँ का उपयोग करना

डेटाबेस से बहुत आसान है। लेकिन कुछ सीमाएं हैं जो आप ArrayList, List और custome ऑब्जेक्ट्स को नहीं बचा सकते हैं।

5: Aplication क्लास में गेट्टर सेटर बनाएं और किसी भी प्रोजेक्ट में पहुँचें।

      private String data;
      public String getData() {
          return data;
      }

      public void setData(String data) {
          this.data = data;
      }

यहां सेट करें और गतिविधियों से प्राप्त करें

         ((YourApplicationClass)getApplicationContext()).setData("abc"); 

         String data=((YourApplicationClass)getApplicationContext()).getData();  

1

वैसे मेरे कुछ विचार हैं, लेकिन मुझे नहीं पता कि वे वही हैं जो आपकी तलाश में हैं।

आप एक ऐसी सेवा का उपयोग कर सकते हैं जो सभी डेटा रखती है और फिर डेटा रिट्रीवल के लिए अपनी गतिविधियों को सेवा में बांध देती है।

या अपने डेटा को क्रमिक या पार्सलेबल में पैकेज करें और उन्हें एक बंडल में संलग्न करें और गतिविधियों के बीच बंडल को पास करें।

यह सब आपकी तलाश में बिल्कुल नहीं हो सकता है, लेकिन आप एक साझाप्रेमीकरण या सामान्य रूप से वरीयता का उपयोग करने का भी प्रयास कर सकते हैं।

किसी भी तरह से मुझे बताएं कि आप क्या निर्णय लेते हैं।


1

मान लें कि आप गतिविधि का उपयोग कर गतिविधि दो को एक इरादे से बुला रहे हैं।
आप आशय के साथ डेटा पास कर सकते हैं ।putExtra (),

इसे अपने संदर्भ के लिए लें। Intent.putExtra के साथ सरणियाँ भेजना

आशा है कि आप क्या चाहते हैं।


1

यदि आपका इरादा वर्तमान गतिविधि से अन्य गतिविधियों को कॉल करने का है, तो आपको इंटेंट्स का उपयोग करना चाहिए । आपका ध्यान डेटा को बनाए रखने पर कम-से-कम इसे आवश्यकतानुसार साझा करने पर हो सकता है।

हालाँकि, अगर आपको वास्तव में इन मूल्यों को बनाए रखने की आवश्यकता है, तो आप उन्हें किसी प्रकार की संरचित पाठ फ़ाइल या डेटाबेस में स्थानीय संग्रहण पर जारी रख सकते हैं। एक गुण फ़ाइल, XML फ़ाइल या JSON फ़ाइल आपके डेटा को संग्रहीत कर सकती है और गतिविधि निर्माण के दौरान आसानी से पार्स की जा सकती है। यह भी मत भूलो कि आपके पास सभी Android उपकरणों पर SQLite है, इसलिए आप उन्हें डेटाबेस तालिका में संग्रहीत कर सकते हैं। आप मुख्य-मूल्य जोड़े को संग्रहीत करने और स्थानीय भंडारण के लिए मानचित्र को क्रमबद्ध करने के लिए मानचित्र का उपयोग भी कर सकते हैं, लेकिन यह सरल डेटा संरचनाओं के लिए उपयोगी होने के लिए बहुत बोझिल हो सकता है।


1

उपरोक्त सभी उत्तर महान हैं ... मैं अभी किसी को जोड़ रहा हूं किसी ने भी गतिविधियों के माध्यम से डेटा को बनाए रखने के बारे में अभी तक उल्लेख नहीं किया है और यह प्रासंगिक डेटा को बनाए रखने के लिए एंड्रॉइड SQLite डेटाबेस में बनाया गया है ... वास्तव में आप अपना स्थान रख सकते हैं databaseHelper एप्लिकेशन स्थिति में है और इसे पूरे एक्टिविटी में आवश्यकतानुसार कॉल करें .. या बस जरूरत पड़ने पर एक हेल्पर क्लास करें और DB कॉल करें ... बस आपको विचार करने के लिए एक और लेयर जोड़नी होगी ... लेकिन बाकी सभी उत्तर पर्याप्त होंगे साथ ही .. वास्तव में सिर्फ वरीयता


1

सक्रियण के बीच डेटा साझा करना उदाहरण लॉगिन के बाद ईमेल पास करना है

"ईमेल" वह नाम है जिसका उपयोग उस गतिविधि पर मूल्य को संदर्भित करने के लिए किया जा सकता है जिसे अनुरोध किया जा रहा है

लॉगिन पेज पर 1 कोड

Intent openLoginActivity = new Intent(getBaseContext(), Home.class);
    openLoginActivity.putExtra("email", getEmail);

होम पेज पर 2 कोड

Bundle extras = getIntent().getExtras();
    accountEmail = extras.getString("email");

1

और यदि आप डेटा ऑब्जेक्ट के साथ काम करना चाहते हैं, तो यह दो महत्वपूर्ण हैं:

सीरियल बनाम पार्सलेबल

  • Serializable एक मार्कर इंटरफ़ेस है, जिसका अर्थ है कि उपयोगकर्ता अपनी आवश्यकताओं के अनुसार डेटा को मार्शल नहीं कर सकता है। इसलिए जब ऑब्जेक्ट कार्यान्वित होता है तो Serializable Java इसे स्वचालित रूप से अनुक्रमित करेगा।
  • Parcelable android खुद का serialization प्रोटोकॉल है। पार्सलेबल में, डेवलपर्स मार्शलिंग और अनमरशलिंग के लिए कस्टम कोड लिखते हैं। इसलिए यह Serialization की तुलना में कम कचरा वस्तुओं का निर्माण करता है
  • अपने कस्टम कार्यान्वयन के कारण Serializable की तुलना में Parcelable का प्रदर्शन बहुत अधिक है। Android में वस्तुओं को क्रमबद्ध करते समय Parcelable आरोपण का उपयोग करने की अत्यधिक अनुशंसा की जाती है।

public class User implements Parcelable

यहाँ और जाँच करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.