एंड्रॉइड एप्लिकेशन में मैं गतिविधियों के बीच डेटा कैसे पास करूं?


1348

मेरे पास एक परिदृश्य है, जहां लॉगिन पृष्ठ के माध्यम से प्रवेश करने के बाद, buttonप्रत्येक पर एक साइन-आउट होगा activity

क्लिक करने पर sign-out, मैं session idसाइन-आउट करने के लिए उपयोगकर्ता के हस्ताक्षरित पास को पार करूंगा । क्या कोई मुझे बता सकता है कि सभी को कैसे session idउपलब्ध रखा जाए activities?

इस मामले का कोई विकल्प


14
मैं sharedpreference इस्तेमाल किया अपनी उपयोगी भी पर याद पासवर्ड सुविधा लॉगिन डेटा रखने के लिए
शरीफ

यह मेरे लिए काम करता है। stackoverflow.com/a/7325248/2125322 धन्यवाद दर्शन कम्प्यूटिंग
matasoy

stackoverflow.com/a/37774966/6456129 मददगार हो सकता है
येसी

ऐसे मामलों के लिए साझाकरण विधि के साथ commomUtils वर्ग बनाने का प्रयास करें ... यह एक जगह पर कोड को साफ और संबंधित डेटा रखेगा। और आप आसानी से उस विशिष्ट prefrencesFile को साफ़ करने के केवल एक विधि के साथ डेटा के विशिष्ट सेट को साफ़ करने में सक्षम होंगे, बिना किसी डिफ़ॉल्ट एप्लिकेशन डेटा को साफ़ किए ...
Muahmmad Tayyib

जवाबों:


1265

ऐसा करने का सबसे आसान तरीका सत्र आईडी पास करना होगा जिसमें Intentआप गतिविधि शुरू करने के लिए साइन इन गतिविधि का उपयोग कर रहे हैं:

Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);

अगली गतिविधि पर उस इरादे पर पहुँचें:

String sessionId = getIntent().getStringExtra("EXTRA_SESSION_ID");

डॉक्स उद्देश्य के लिए अधिक जानकारी ( "अतिरिक्त" शीर्षक अनुभाग में देखो) है।


ठीक है अगर मैं सफल लॉगिन पर साइनआउट करने के लिए सत्र आईडी पास करता हूं और क्या यह किसी भी गतिविधि पृष्ठ पर साइनआउट करने के लिए काम करेगा या मैन्युअल रूप से मुझे इसे प्रत्येक गतिविधि पर मूल्य प्रदान करना होगा ??? उपरोक्त प्रक्रिया का उपयोग ??
उमर

5
हां, आपको सत्र आईडी को प्रत्येक गतिविधि के लिए उपलब्ध कराना होगा, जहां आप उपयोगकर्ता को साइनआउट करने की अनुमति देना चाहते हैं। वैकल्पिक रूप से, आप इसे एप्लिकेशन ऑब्जेक्ट में संग्रहीत कर सकते हैं, लेकिन फिर आपको सत्र की स्थिति (यदि उपयोग करने से पहले यह मान्य है, आदि की जांच करें) का प्रबंधन करना होगा।
Erich Douglass

1
कृपया ध्यान रखें कि प्रलेखन निम्नलिखित इंगित करता है: इरादे में विस्तारित डेटा जोड़ें। नाम में एक पैकेज उपसर्ग शामिल होना चाहिए, उदाहरण के लिए ऐप com.android.contacts "com.android.contacts.ShowAll" जैसे नामों का उपयोग करेगा।
सेर्गेई फेडोरोव

1
और अन्य गतिविधि उपयोग के डेटा को पढ़ने के लिएLong session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
फ़रीद

1
हम डेटा का उपयोग करके कैसे पास कर सकते हैं setDataऔर शोध के दो दृष्टिकोणों में क्या अंतर है? इनमे से कौन बेहतर है?
होसिन अकाजानी

1402

अपनी वर्तमान गतिविधि में, एक नया बनाएँ Intent:

String value="Hello world";
Intent i = new Intent(CurrentActivity.this, NewActivity.class);    
i.putExtra("key",value);
startActivity(i);

फिर नई गतिविधि में, उन मूल्यों को पुनः प्राप्त करें:

Bundle extras = getIntent().getExtras();
if (extras != null) {
    String value = extras.getString("key");
    //The key argument here must match that used in the other activity
}

एक गतिविधि से दूसरी गतिविधि तक चर पास करने के लिए इस तकनीक का उपयोग करें।


58
बस उन लोगों के लिए एक जानकारी जो मेरे जैसे अंधे हैं: यदि आप अपनी वर्तमान गतिविधि में पूर्णांक डालते हैं, तो आपको इसे नए माध्यम से प्राप्त करना होगा extras.getInt("new_variable_name")। यदि आप इसे getString()एंड्रॉइड के माध्यम से प्राप्त करने की कोशिश करते हैं, तो यह है कि एक इंट दिया गया था और अशक्त है!
बिश

4
यदि गतिविधि पहले से ही चल रही है, तो startActivity(i);क्या करने की आवश्यकता है ? मेरा मतलब है, क्या मैं गतिविधि A को कॉल गतिविधि B बना सकता हूं , और वह गतिविधि A को डेटा लौटाता है ? क्या मैं भ्रमित हूँ?
फ्रांसिस्को कॉर्लेस मोरेल्स


मैं स्ट्रिंग चर पसंद करते हैं। आप हमेशा एक स्ट्रिंग को पूर्णांक में बदल सकते हैं या बाद में फ्लोट कर सकते हैं।
user914425

140

पासिंग आशय अतिरिक्त एक अच्छा दृष्टिकोण है के रूप में एरिक का उल्लेख किया।

आवेदन वस्तु हालांकि एक और तरीका है, और यह जब कई गतिविधियों में एक ही राज्य के साथ काम कर (के रूप में मिलता है / यह हर जगह डाल करने के लिए होने के खिलाफ) कभी कभी आसान है, या पुरातन और स्ट्रिंग्स तुलना में अधिक जटिल वस्तुओं।

आप अनुप्रयोग का विस्तार कर सकते हैं, और फिर सेट कर सकते हैं / जो भी आप चाहते हैं और इसे किसी भी गतिविधि से प्राप्त कर सकते हैं (उसी आवेदन में) getApplication () के साथ

यह भी ध्यान रखें कि अन्य दृष्टिकोण जो आप देख सकते हैं, जैसे कि स्टेटिक्स, समस्याग्रस्त हो सकते हैं क्योंकि वे मेमोरी लीक का कारण बन सकते हैं । एप्लिकेशन इसे भी हल करने में मदद करता है।


8
स्टेटिक्स समस्या के लिए +1। शायद onCreate / onTerminate विधि अनुप्रयोग वर्ग के साथ एक सिंगलटन के संयोजन से सफाई को हल किया जा सकता है।
सीडब्लू

10
अरे, मुझे पता है कि यह धागा कुछ समय पहले था, लेकिन प्रदान की गई लिंक अब एक मृत अंत है। क्या मुझे उदाहरण मिल सकता है?
जुइके

एप्लिकेशन का उपयोग करके इसे कैसे प्राप्त करें? @CharlieCollins
Banee Ishaque कश्मीर

इसका एक ताजा उदाहरण यहाँ एक बहुत पुरानी किताब से है :) github.com/charlieCollins/android-in-ults/blob/master/ch07/…
चार्ली कोलिन्स

@JuiCe मेमोरी लीक पर Android डेवलपर्स ब्लॉग पोस्ट अब अमान्य है।
एड्रिक

94

स्रोत वर्ग:

Intent myIntent = new Intent(this, NewActivity.class);
myIntent.putExtra("firstName", "Your First Name Here");
myIntent.putExtra("lastName", "Your Last Name Here");
startActivity(myIntent)

गंतव्य वर्ग (न्यूक्विटी क्लास):

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.view);

    Intent intent = getIntent();

    String fName = intent.getStringExtra("firstName");
    String lName = intent.getStringExtra("lastName");
}

3
क्या इरादे कभी भी अशक्त हो सकते हैं? क्या हमें जांचना चाहिए कि यह अशक्त नहीं है?
माइक्रो


85

आपको अपना इरादा बताते हुए एक्स्ट्रा भेजना होगा।

ऐशे ही:

Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);

अब OnCreateअपने तरीके पर SecondActivityआप एक्स्ट्रा को इस तरह ला सकते हैं।

यदि आपके द्वारा भेजा गया मूल्य इसमें थाlong :

long value = getIntent().getLongExtra("Variable name which you sent as an extra", defaultValue(you can give it anything));

यदि आपके द्वारा भेजा गया मूल्य a थाString :

String value = getIntent().getStringExtra("Variable name which you sent as an extra");

यदि आपके द्वारा भेजा गया मूल्य a थाBoolean :

Boolean value = getIntent().getBooleanExtra("Variable name which you sent as an extra", defaultValue);

3
कृपया ध्यान रखें कि प्रलेखन निम्नलिखित इंगित करता है: इरादे में विस्तारित डेटा जोड़ें। नाम में एक पैकेज उपसर्ग शामिल होना चाहिए, उदाहरण के लिए ऐप com.android.contacts "com.android.contacts.ShowAll" जैसे नामों का उपयोग करेगा।
सेर्गेई फेडोरोव

यह शीर्ष सर्वाधिक मतदान वाले उत्तर का एक डुप्लिकेट है जो इस उत्तर से 2 साल पहले और साहिल महाजन एमजे के उत्तर के लिए है जो 1 वर्ष पुराना है। केवल अंतर: उदाहरण booleanऔर longगेटर्स जो एक टिप्पणी IMO के लायक है, एक उत्तर नहीं।
२०:५० बजे मुरम

48

यह मुझे चीजों को संदर्भ में देखने में मदद करता है। यहाँ दो उदाहरण हैं।

डेटा अग्रेषित करना

यहां छवि विवरण दर्ज करें

मुख्य गतिविधि

  • वह डेटा डालें जिसे आप एक कुंजी-मूल्य जोड़ी के साथ एक इरादे में भेजना चाहते हैं। देखकुंजी के लिए नामकरण सम्मेलनों के लिए इस उत्तर को ।
  • के साथ दूसरी गतिविधि शुरू करें startActivity

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // get the text to pass
        EditText editText = (EditText) findViewById(R.id.editText);
        String textToPass = editText.getText().toString();

        // start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra(Intent.EXTRA_TEXT, textToPass);
        startActivity(intent);
    }
}

दूसरी गतिविधि

  • आप दूसरी गतिविधि शुरू getIntent()करने के लिए उपयोग करते हैं Intent। तब आप getExtras()पहले गतिविधि में परिभाषित कुंजी के साथ डेटा निकाल सकते हैं । चूँकि हमारा डेटा एक स्ट्रिंग है जिसका उपयोग हम getStringExtraयहाँ करेंगे ।

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        // get the text from MainActivity
        Intent intent = getIntent();
        String text = intent.getStringExtra(Intent.EXTRA_TEXT);

        // use the text in a TextView
        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText(text);
    }
}

डेटा वापस पास करना

यहां छवि विवरण दर्ज करें

मुख्य गतिविधि

  • इसके साथ दूसरा गतिविधि प्रारंभ करें startActivityForResult, यह एक मनमाना परिणाम कोड प्रदान करता है।
  • अवहेलना onActivityResult । दूसरी गतिविधि समाप्त होने पर इसे कहा जाता है। आप यह सुनिश्चित कर सकते हैं कि परिणाम कोड की जाँच करके वास्तव में यह दूसरी गतिविधि है। (यह तब उपयोगी है जब आप एक ही मुख्य गतिविधि से कई अलग-अलग गतिविधियाँ शुरू कर रहे हैं।)
  • रिटर्न से आपको जो डेटा मिला है, उसे निकालें Intent। डेटा को एक कुंजी-मूल्य जोड़ी का उपयोग करके निकाला जाता है। मैं कुंजी के लिए किसी भी स्ट्रिंग का उपयोग कर सकता हूं, लेकिन मैं पूर्वनिर्धारित का उपयोग करूंगा Intent.EXTRA_TEXTक्योंकि मैं पाठ भेज रहा हूं।

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {

                // get String data from Intent
                String returnString = data.getStringExtra(Intent.EXTRA_TEXT);

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

दूसरी गतिविधि

  • वह डेटा डालें जिसे आप पिछली गतिविधि में वापस भेजना चाहते हैं Intent। डेटा Intentएक कुंजी-मूल्य जोड़ी का उपयोग करके संग्रहीत किया जाता है । मैंने इस्तेमाल करना चुनाIntent.EXTRA_TEXT अपनी कुंजी के ।
  • के लिए परिणाम सेट करें RESULT_OK और अपना डेटा रखने वाले इरादे को जोड़ें।
  • finish()दूसरी गतिविधि को बंद करने के लिए कॉल करें।

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra(Intent.EXTRA_TEXT, stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

3
वाह धन्यवाद! यह वह था जो मैं ढूंढ रहा था। कैमरा या अन्य एक्सटर्नल का उपयोग करते समय यह काफी स्पष्ट है कि मुझे परिणाम वापस मिलने की उम्मीद है, लेकिन मैंने आंतरिक रूप से इसका उपयोग करने के बारे में नहीं सोचा था। आप इसे पहली बार खुले तौर पर रख रहे हैं।
user3195231

45

अपडेट किया गया ध्यान दें कि मैंने SharedPreference के उपयोग का उल्लेख किया था । इसमें एक साधारण एपीआई है और यह एक एप्लिकेशन की गतिविधियों के लिए सुलभ है। लेकिन यह एक अनाड़ी समाधान है, और यदि आप संवेदनशील डेटा के आसपास से गुजरते हैं तो यह एक सुरक्षा जोखिम है। इंटेंट का उपयोग करना सबसे अच्छा है। इसमें अतिभारित तरीकों की एक व्यापक सूची है जिसका उपयोग गतिविधियों के बीच कई अलग-अलग डेटा प्रकारों को बेहतर रूप से स्थानांतरित करने के लिए किया जा सकता है। इरादे पर एक नजर है । यह लिंक putExtra के उपयोग को काफी अच्छी तरह से प्रस्तुत करता है।

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

public class MyActivity extends Activity {
    public static final String ARG_PARAM1 = "arg_param1";
...
public static getIntent(Activity from, String param1, Long param2...) {
    Intent intent = new Intent(from, MyActivity.class);
        intent.putExtra(ARG_PARAM1, param1);
        intent.putExtra(ARG_PARAM2, param2);
        return intent;
}

....
// Use it like this.
startActivity(MyActvitiy.getIntent(FromActivity.this, varA, varB, ...));
...

फिर आप इच्छित गतिविधि के लिए एक इरादा बना सकते हैं और सुनिश्चित कर सकते हैं कि आपके पास सभी पैरामीटर हैं। आप टुकड़ों के लिए अनुकूलित कर सकते हैं। ऊपर एक सरल उदाहरण है, लेकिन आपको यह विचार मिलता है।


2
मुझे आपका उत्तर सबसे अच्छा लगता है ... इसे इरादे से पास करने का अर्थ है कि लगभग हर जगह मैं एक गतिविधि शुरू करता हूं जिसे आपको सत्रांक शामिल करने के लिए याद रखना होगा। इसे शेयर्डप्रिफरेंस में डालकर आप इसे किसी भी गतिविधि से कभी भी प्राप्त कर सकते हैं। : 0)
बाइटबेंडर

@bytebender मुझे पता है कि इस प्रतिक्रिया के लिए थोड़ा देर हो चुकी है, मैं इसकी सराहना करता हूं कि आपको इसकी अनुकरणीयता के लिए मेरा मूल उत्तर पसंद है, लेकिन मैं साझा प्राथमिकताओं में सत्र आईडी संग्रहीत करने के लिए सावधान रहूंगा। अगर आपको इसे हार्ड स्टोरेज पर स्टोर करना है तो एन्क्रिप्शन का इस्तेमाल करें। यदि आप JWT को रोजगार देने वाले प्रमाणीकरण ढाँचों का उपयोग कर सकते हैं, तो इसमें रिफ्रेशटॉकेन शामिल होंगे जो दीर्घकालिक भंडारण के लिए अधिक सुरक्षित होते हैं, और फिर वर्तमान सत्र टोकन को एक सार्वजनिक अनुप्रयोग संपत्ति की सार्वजनिक संपत्ति के रूप में रखने के लिए आसानी से प्रमाणीकरण टोकन तक पहुँचते हैं, और गतिविधि पर ओवरहेड को कम करते हैं। आशय के हस्ताक्षर।
नाराजगी

38

निम्नलिखित करने की कोशिश करें:

एक सरल "सहायक" वर्ग (अपने इरादों के लिए कारखाना) बनाएं, जैसे:

import android.content.Intent;

public class IntentHelper {
    public static final Intent createYourSpecialIntent(Intent src) {
          return new Intent("YourSpecialIntent").addCategory("YourSpecialCategory").putExtras(src);
    }
}

यह आपके सभी इरादों के लिए कारखाना होगा। हर बार आपको एक नए इरादे की आवश्यकता होती है, IntentHelper में एक स्थिर कारखाना विधि बनाएं। एक नया इरादा बनाने के लिए आपको इसे इस तरह कहना चाहिए:

IntentHelper.createYourSpecialIntent(getIntent());

आपकी गतिविधि में। जब आप "सत्र" में कुछ डेटा को "सेव" करना चाहते हैं, तो बस निम्नलिखित का उपयोग करें:

IntentHelper.createYourSpecialIntent(getIntent()).putExtra("YOUR_FIELD_NAME", fieldValueToSave);

और इस आशय को भेजें। लक्ष्य गतिविधि में आपका क्षेत्र इस प्रकार उपलब्ध होगा:

getIntent().getStringExtra("YOUR_FIELD_NAME");

तो अब हम एक ही पुराने सत्र (जैसे सर्वलेट या जेएसपी ) में इंटेंट का उपयोग कर सकते हैं ।


28

आप कस्टम क्लास ऑब्जेक्ट्स को पार्सलेबल क्लास बनाकर भी पास कर सकते हैं । इसे पार्सल करने का सबसे अच्छा तरीका है कि आप अपनी कक्षा को लिखें और फिर इसे http://www.parcelabler.com/ जैसी साइट पर पेस्ट करें । बिल्ड पर क्लिक करें और आपको नया कोड मिलेगा। यह सब कॉपी करें और मूल वर्ग सामग्री को बदलें। फिर-

Intent intent = new Intent(getBaseContext(), NextActivity.class);
Foo foo = new Foo();
intent.putExtra("foo", foo);
startActivity(intent);

और NextActivity में परिणाम प्राप्त करें जैसे-

Foo foo = getIntent().getExtras().getParcelable("foo");

अब आप बस foo ऑब्जेक्ट का उपयोग कर सकते हैं जैसे आपने उपयोग किया होगा।


23

एक अन्य तरीका सार्वजनिक स्थैतिक क्षेत्र का उपयोग करना है जिसमें आप डेटा संग्रहीत करते हैं, अर्थात:

public class MyActivity extends Activity {

  public static String SharedString;
  public static SomeObject SharedObject;

//...

5
मुझे वास्तव में आश्चर्य है कि आपके सुझाव को वोट क्यों नहीं मिले, यह सरल और अधिक व्यावहारिक है।
पोरिज्म

7
उम ... यह OO सिद्धांतों का उल्लंघन नहीं करता है?
क्रिश्चियन विल्मा

2
@ChristianVielma अच्छी तरह से, यह एक ग्रे क्षेत्र की तरह अधिक है ... आप इसे कई तरीके से कर सकते हैं, मेरे लिए ऐसा लगता है कि यह एक साफ "दूर" है, इसलिए ... निर्णय लेने के लिए यह आपके (डेवलपर) पर है आपके लिए अच्छा है या नहीं, मुझे यह पसंद है क्योंकि इसका पालन करना आसान है, लेकिन यह बहुत जल्दी गंदा हो सकता है ...
ComputerSaysNo

2
आप यह क्यों कहते हैं कि यह गंदा हो जाता है? क्या आईओएस "गुण" जो कि इस के समान है, सेट करके व्यूकंट्रोलर्स के बीच डेटा पास करने के लिए ऐसा नहीं करता है? यह बहुत आसान है इंटेंट का उपयोग करने से
टेरी बू

2
हां, आप दृश्य नियंत्रकों के बीच डेटा पास करते हैं, लेकिन स्थिर गुणों के साथ नहीं । समस्या यह है कि वांछित गतिविधि उदाहरण पर एक संपत्ति नहीं है। जिस तरह से एंड्रॉइड startActivity () के माध्यम से गतिविधियों को लॉन्च करता है, यह तुरंत ऑब्जेक्ट को तुरंत नहीं करता है और डेवलपर को एक उदाहरण चर सेट करने की अनुमति देता है। यह बहुत कष्टप्रद है ...
शॉन

20

गतिविधियों के बीच डेटा पास करने का सबसे सुविधाजनक तरीका इंटेंट पास करना है। पहली गतिविधि में जहां से आप डेटा भेजना चाहते हैं, आपको कोड जोड़ना चाहिए,

String str = "My Data"; //Data you want to send
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("name",str); //Here you will add the data into intent to pass bw activites
v.getContext().startActivity(intent);

आपको भी आयात करना चाहिए

import android.content.Intent;

फिर अगले एकिटविटी (सेकंडएक्टिविटी) में, आपको निम्नलिखित कोड का उपयोग करके डेटा को इरादे से प्राप्त करना चाहिए।

String name = this.getIntent().getStringExtra("name");

2
यह शीर्ष सर्वाधिक मतदान वाले उत्तर का एक डुप्लिकेट है जो 1 वर्ष और भी अधिक समय से है।
मूरमेल

19

आप उपयोग कर सकते हैं SharedPreferences...

  1. लॉगिंग। में समय स्टोर सत्र आईडीSharedPreferences

    SharedPreferences preferences = getSharedPreferences("session",getApplicationContext().MODE_PRIVATE);
    Editor editor = preferences.edit();
    editor.putString("sessionId", sessionId);
    editor.commit();
  2. प्रस्थान करें। साझाकरणों में समय लाने वाला सत्र आईडी

    SharedPreferences preferences = getSharedPreferences("session", getApplicationContext().MODE_PRIVATE);
    String sessionId = preferences.getString("sessionId", null);

यदि आपके पास आवश्यक सत्र आईडी नहीं है, तो साझाकरण हटा दें:

SharedPreferences settings = context.getSharedPreferences("session", Context.MODE_PRIVATE);
settings.edit().clear().commit();

यह बहुत उपयोगी है, क्योंकि एक बार जब आप मूल्य को बचाते हैं और फिर गतिविधि को कहीं भी पुनः प्राप्त करते हैं।


17

मानक दृष्टिकोण।

Intent i = new Intent(this, ActivityTwo.class);
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
String getrec=textView.getText().toString();
Bundle bundle = new Bundle();
bundle.putString(“stuff”, getrec);
i.putExtras(bundle);
startActivity(i);

अब आपकी दूसरी गतिविधि में बंडल से आपका डेटा पुनः प्राप्त होता है:

बंडल प्राप्त करें

Bundle bundle = getIntent().getExtras();

डेटा निकालें ...

String stuff = bundle.getString(“stuff”); 

1
2012 में PRABEESH RK द्वारा पहले से ही प्रस्तावित डुप्लिकेट । और इसे 6 अन्य उत्तरों द्वारा प्रस्तावित i.putExtras()/ को कम किया जा सकता getIntent().getString()है ...
Murmel

17

गतिविधि से

 int n= 10;
 Intent in = new Intent(From_Activity.this,To_Activity.class);
 Bundle b1 = new Bundle();
 b1.putInt("integerNumber",n);
 in.putExtras(b1);
 startActivity(in);

गतिविधि के लिए

 Bundle b2 = getIntent().getExtras();
 int m = 0;
 if(b2 != null)
  {
     m = b2.getInt("integerNumber");
  }

1
डुप्लिकेट: 2012 में PRABEESH RK और अजय वेणुगोपाल , कृष्णाBundle द्वारा पहले से ही आधारित दृष्टिकोण प्रस्तावित था । और 8 अन्य उत्तरों द्वारा प्रस्तावित / को कम किया जा सकता है ...i.putExtras()getIntent().getString()
मूरमेल

11

आप आशय वस्तु का उपयोग करके गतिविधियों के बीच डेटा भेज सकते हैं। आप दो गतिविधियों अर्थात् है पर विचार करें FirstActivityऔर SecondActivity

FirstActivity के अंदर:

आशय का उपयोग करना:

i = new Intent(FirstActivity.this,SecondActivity.class);
i.putExtra("key", value);
startActivity(i)

सेकंडएक्टिविटी के अंदर

Bundle bundle= getIntent().getExtras();

अब आप Key द्वारा FirstActivity से प्राप्त मानों को प्राप्त करने के लिए विभिन्न बंडल क्लास विधियों का उपयोग कर सकते हैं।

उदाहरण के लिए bundle.getString("key"), bundle.getDouble("key"), bundle.getInt("key")आदि


1
डुप्लिकेट: 2012 और अजय वेणुगोपाल में Bundleपहले से ही आधारित दृष्टिकोण PRABEESH RK द्वारा प्रस्तावित किया गया था । और 7 अन्य उत्तरों द्वारा प्रस्तावित / को कम किया जा सकता है ...i.putExtras()getIntent().getString()
मूरमेल

11

यदि आप एक्टिविटीज / फ्रेग्मेंट्स के बीच बिटमैप को ट्रान्सफर करना चाहते हैं


गतिविधि

एक्टिविटीज के बीच एक बिटमैप पारित करने के लिए

Intent intent = new Intent(this, Activity.class);
intent.putExtra("bitmap", bitmap);

और एक्टिविटी क्लास में

Bitmap bitmap = getIntent().getParcelableExtra("bitmap");

टुकड़ा

टुकड़े के बीच एक बिटमैप पारित करने के लिए

SecondFragment fragment = new SecondFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("bitmap", bitmap);
fragment.setArguments(bundle);

SecondFragment के अंदर प्राप्त करने के लिए

Bitmap bitmap = getArguments().getParcelable("bitmap");

बड़े बिटमैप को स्थानांतरित करना

यदि आप बाइंडर लेन-देन में विफल हो रहे हैं, तो इसका मतलब है कि आप बड़े तत्व को एक गतिविधि से दूसरी गतिविधि में स्थानांतरित करके बाइंडर लेनदेन बफर से अधिक हो रहे हैं।

तो उस स्थिति में आपको बिटमैप को बाइट के सरणी के रूप में संपीड़ित करना होगा और फिर इसे इस तरह से एक अन्य गतिविधि में अनलॉकर करना होगा

FirstActivity में

Intent intent = new Intent(this, SecondActivity.class);

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPG, 100, stream);
byte[] bytes = stream.toByteArray(); 
intent.putExtra("bitmapbytes",bytes);

और सेकंडएक्टिविटी में

byte[] bytes = getIntent().getByteArrayExtra("bitmapbytes");
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

9
Intent intent = new Intent(YourCurrentActivity.this, YourActivityName.class);
intent.putExtra("NAme","John");
intent.putExtra("Id",1);
startActivity(intent);

आप इसे दूसरी गतिविधि में पुनः प्राप्त कर सकते हैं। दो तरीके:

int id = getIntent.getIntExtra("id", /* defaltvalue */ 2);

दूसरा तरीका है:

Intent i = getIntent();
String name = i.getStringExtra("name");


8

यहां मेरा सबसे अच्छा अभ्यास है और यह बहुत बड़ा है जब परियोजना विशाल और जटिल है।

मान लीजिए कि मेरे पास 2 गतिविधियां हैं, LoginActivityऔर HomeActivity। मैं से 2 मानकों (उपयोगकर्ता नाम और पासवर्ड) पास करना चाहते LoginActivityकरने के लिए HomeActivity

पहले मैं अपना निर्माण करता हूं HomeIntent

public class HomeIntent extends Intent {

    private static final String ACTION_LOGIN = "action_login";
    private static final String ACTION_LOGOUT = "action_logout";

    private static final String ARG_USERNAME = "arg_username";
    private static final String ARG_PASSWORD = "arg_password";


    public HomeIntent(Context ctx, boolean isLogIn) {
        this(ctx);
        //set action type
        setAction(isLogIn ? ACTION_LOGIN : ACTION_LOGOUT);
    }

    public HomeIntent(Context ctx) {
        super(ctx, HomeActivity.class);
    }

    //This will be needed for receiving data
    public HomeIntent(Intent intent) {
        super(intent);
    }

    public void setData(String userName, String password) {
        putExtra(ARG_USERNAME, userName);
        putExtra(ARG_PASSWORD, password);
    }

    public String getUsername() {
        return getStringExtra(ARG_USERNAME);
    }

    public String getPassword() {
        return getStringExtra(ARG_PASSWORD);
    }

    //To separate the params is for which action, we should create action
    public boolean isActionLogIn() {
        return getAction().equals(ACTION_LOGIN);
    }

    public boolean isActionLogOut() {
        return getAction().equals(ACTION_LOGOUT);
    }
}

यहां बताया गया है कि मैं अपनी LoginActivity में डेटा कैसे पास करता हूं

public class LoginActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        String username = "phearum";
        String password = "pwd1133";
        final boolean isActionLogin = true;
        //Passing data to HomeActivity
        final HomeIntent homeIntent = new HomeIntent(this, isActionLogin);
        homeIntent.setData(username, password);
        startActivity(homeIntent);

    }
}

अंतिम चरण, यहां बताया गया है कि मैं डेटा कैसे प्राप्त करता हूं HomeActivity

public class HomeActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        //This is how we receive the data from LoginActivity
        //Make sure you pass getIntent() to the HomeIntent constructor
        final HomeIntent homeIntent = new HomeIntent(getIntent());
        Log.d("HomeActivity", "Is action login?  " + homeIntent.isActionLogIn());
        Log.d("HomeActivity", "username: " + homeIntent.getUsername());
        Log.d("HomeActivity", "password: " + homeIntent.getPassword());
    }
}

किया हुआ! कूल :) मैं सिर्फ अपना अनुभव साझा करना चाहता हूं। यदि आप छोटे प्रोजेक्ट पर काम कर रहे हैं तो यह बड़ी समस्या नहीं होनी चाहिए। लेकिन जब आपकी बड़ी परियोजना पर काम कर रहे हैं, तो यह वास्तव में दर्द होता है जब आप बग्स को रीफैक्टरिंग या फिक्स करना चाहते हैं।


7

पूरक उत्तर: कुंजी स्ट्रिंग के लिए नामकरण परंपराएं

डेटा पास करने की वास्तविक प्रक्रिया का उत्तर पहले ही दिया जा चुका है, हालाँकि अधिकांश उत्तर आशय में प्रमुख नाम के लिए कठिन कोडित तारों का उपयोग करते हैं। यह आमतौर पर ठीक है जब केवल आपके ऐप के भीतर उपयोग किया जाता है। हालाँकि, दस्तावेज़EXTRA_* मानकीकृत डेटा प्रकारों के लिए स्थिरांक का उपयोग करने की सलाह देता है

उदाहरण 1: Intent.EXTRA_*कुंजियों का उपयोग करना

पहली गतिविधि

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, "my text");
startActivity(intent);

दूसरी गतिविधि:

Intent intent = getIntent();
String myText = intent.getExtras().getString(Intent.EXTRA_TEXT);

उदाहरण 2: खुद को परिभाषित करना static final कुंजी

यदि Intent.EXTRA_*स्ट्रिंग्स में से कोई भी आपकी आवश्यकताओं के अनुरूप नहीं है, तो आप पहली गतिविधि की शुरुआत में अपने स्वयं को परिभाषित कर सकते हैं।

static final String EXTRA_STUFF = "com.myPackageName.EXTRA_STUFF";

यदि आप केवल अपने ऐप में कुंजी का उपयोग कर रहे हैं, तो पैकेज नाम शामिल करना केवल एक सम्मेलन है। लेकिन यह नामकरण संघर्ष से बचने के लिए एक आवश्यकता है यदि आप किसी प्रकार की सेवा बना रहे हैं जिसे अन्य ऐप एक इंटेंट के साथ कॉल कर सकते हैं।

पहली गतिविधि:

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(EXTRA_STUFF, "my text");
startActivity(intent);

दूसरी गतिविधि:

Intent intent = getIntent();
String myText = intent.getExtras().getString(FirstActivity.EXTRA_STUFF);

उदाहरण 3: स्ट्रिंग संसाधन कुंजी का उपयोग करना

यद्यपि प्रलेखन में उल्लेख नहीं किया गया है, यह उत्तर गतिविधियों के बीच निर्भरता से बचने के लिए स्ट्रिंग संसाधन का उपयोग करने की सलाह देता है।

strings.xml

 <string name="EXTRA_STUFF">com.myPackageName.MY_NAME</string>

पहली गतिविधि

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(getString(R.string.EXTRA_STUFF), "my text");
startActivity(intent);

दूसरी गतिविधि

Intent intent = getIntent();
String myText = intent.getExtras().getString(getString(R.string.EXTRA_STUFF));

7

आप उपयोग कर सकते हैं Intent

Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
mIntent.putExtra("data", data);
startActivity(mIntent);

एक और तरीका सिंगलटन पैटर्न का भी उपयोग किया जा सकता है :

public class DataHolder {

 private static DataHolder dataHolder;
 private List<Model> dataList;

 public void setDataList(List<Model>dataList) {
    this.dataList = dataList;
 }

 public List<Model> getDataList() {
    return dataList;
 }

 public synchronized static DataHolder getInstance() {
    if (dataHolder == null) {
       dataHolder = new DataHolder();
    }
    return dataHolder;
 }
}

अपनी FirstActivity से

private List<Model> dataList = new ArrayList<>();
DataHolder.getInstance().setDataList(dataList);

सेकंडएक्टिविटी पर

private List<Model> dataList = DataHolder.getInstance().getDataList();

डुप्लिकेट: आशय दृष्टिकोण पहले से ही द्वारा प्रस्तावित है शीर्ष सबसे जवाब मतदान और के साहिल महाजन एम.जे. का जवाब और के मयंक सैनी के जवाब और । मोहम्मद रहमान के जवाब , दिलावर एम का जवाब , Android डेवलपर का जवाब , sahulab । सिंगलटन: रोडियन
अल्टशुलर

6

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

पहले आपको Bundleकक्षा के उपयोग के साथ डेटा को आशय वस्तु में संलग्न करना होगा । फिर startActivity()या तो startActivityForResult()विधियों का उपयोग करके गतिविधि को कॉल करें ।

आप इसके बारे में अधिक जानकारी पा सकते हैं, उदाहरण के लिए ब्लॉग पोस्ट पासिंग डेटा से एक गतिविधि तक


यह कमोबेश उसी तरह है, जो सीधे प्रदान की गई विधियों का उपयोग कर रहा है ( Intent#putExtra())। लेकिन एक Bundleऔर जोड़ता है और चीजों को और अधिक जटिल बनाता है।
मूरेल

6

आप साझा प्राथमिकता आज़मा सकते हैं, यह गतिविधियों के बीच डेटा साझा करने का एक अच्छा विकल्प हो सकता है

सत्र आईडी बचाने के लिए -

SharedPreferences pref = myContexy.getSharedPreferences("Session 
Data",MODE_PRIVATE);
SharedPreferences.Editor edit = pref.edit();
edit.putInt("Session ID", session_id);
edit.commit();

उन्हें पाने के लिए -

SharedPreferences pref = myContexy.getSharedPreferences("Session Data", MODE_PRIVATE);
session_id = pref.getInt("Session ID", 0);

डुप्लिकेट: यह दृष्टिकोण 2014 में रवि परसनिया द्वारा पहले से ही समाप्त कर दिया गया था
1

5

इस गतिविधि से एक और गतिविधि शुरू करें बंडल ऑब्जेक्ट के माध्यम से पैरामीटर पास करें

Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "xyz@gmail.com");
startActivity(intent);

एक और गतिविधि (YourActivity) पर लिया गया

String s = getIntent().getStringExtra("USER_NAME");

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

यहां हमारे पास एम्प्लाई मॉडल है

class Employee{
    private String empId;
    private int age;
    print Double salary;

    getters...
    setters...
}

आप इस तरह के जटिल डेटा को क्रमबद्ध करने के लिए Google द्वारा प्रदान किए गए Gson lib का उपयोग कर सकते हैं

String strEmp = new Gson().toJson(emp);
Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("EMP", strEmp);
startActivity(intent);

Bundle bundle = getIntent().getExtras();
String empStr = bundle.getString("EMP");
            Gson gson = new Gson();
            Type type = new TypeToken<Employee>() {
            }.getType();
            Employee selectedEmp = gson.fromJson(empStr, type);

5

Kotlin

फर्स्ट एक्टिविटी से पास

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)

दूसरी गतिविधि में जाओ

val value = getIntent().getStringExtra("key")

सुझाव

हमेशा अधिक प्रबंधित तरीके से निरंतर फ़ाइल में कुंजियाँ रखें।

companion object {
    val KEY = "key"
}

4
/*
 * If you are from transferring data from one class that doesn't
 * extend Activity, then you need to do something like this.
 */ 

public class abc {
    Context context;

    public abc(Context context) {
        this.context = context;
    }

    public void something() {
        context.startactivity(new Intent(context, anyone.class).putextra("key", value));
    }
}

4

चार्ली कॉलिंस ने मुझे एक सही जवाब दिया Application.class। मुझे पता नहीं था कि हम इसे आसानी से उप-वर्ग कर सकते हैं। यहां कस्टम एप्लिकेशन क्लास का उपयोग करके एक सरलीकृत उदाहरण दिया गया है।

AndroidManifest.xml

android:nameअपनी एप्लिकेशन क्लास का उपयोग करने के लिए विशेषता दें ।

...
<application android:name="MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
....

MyApplication.java

इसे वैश्विक संदर्भ धारक के रूप में उपयोग करें। यह एक ही प्रक्रिया के भीतर ठीक काम करता है।

public class MyApplication extends Application {
    private MainActivity mainActivity;

    @Override
    public void onCreate() {
        super.onCreate();
    }

    public void setMainActivity(MainActivity activity) { this.mainActivity=activity; }
    public MainActivity getMainActivity() { return mainActivity; }
}

MainActivity.java

आवेदन उदाहरण के लिए वैश्विक "सिंगलटन" संदर्भ सेट करें।

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((MyApplication)getApplication()).setMainActivity(this);
    }
    ...

}

MyPreferences.java

एक सरल उदाहरण जहां मैं किसी अन्य गतिविधि से एक मुख्य गतिविधि का उपयोग करता हूं।

public class MyPreferences extends PreferenceActivity
            implements SharedPreferences.OnSharedPreferenceChangeListener {
    @SuppressWarnings("deprecation")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        PreferenceManager.getDefaultSharedPreferences(this)
            .registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
        if (!key.equals("autostart")) {
            ((MyApplication)getApplication()).getMainActivity().refreshUI();
        }
    }
}

4

मैंने हाल ही में वाष्प एपीआई , एक jQuery स्वाद वाला एंड्रॉइड फ्रेमवर्क जारी किया है जो इस तरह के कार्यों को सरल बनाता है। जैसा कि उल्लेख किया गया है, SharedPreferencesएक ऐसा तरीका है जिससे आप ऐसा कर सकते हैं।

VaporSharedPreferencesइसे सिंगलटन के रूप में लागू किया गया है, इसलिए यह एक विकल्प है, और वाष्प एपीआई में यह एक भारी अधिभार .put(...)विधि है, इसलिए आपको स्पष्ट रूप से उस डेटाटाइप के बारे में चिंता करने की ज़रूरत नहीं है जो आप कर रहे हैं - यह प्रदान करने का समर्थन करता है। यह धाराप्रवाह भी है, इसलिए आप कॉल को चेन कर सकते हैं:

$.prefs(...).put("val1", 123).put("val2", "Hello World!").put("something", 3.34);

यह वैकल्पिक रूप से स्वतः-परिवर्तन भी करता है, और पढ़ने और लिखने की प्रक्रिया को एक-हुड के रूप में एकीकृत करता है ताकि आपको मानक एंड्रॉइड में एक संपादक को स्पष्ट रूप से पुनः प्राप्त करने की आवश्यकता न हो।

वैकल्पिक रूप से आप एक का उपयोग कर सकते हैं Intent। वाष्प एपीआई में आप .put(...)एक पर श्रृंखलाबद्ध अतिभारित विधि का उपयोग कर सकते हैं VaporIntent:

$.Intent().put("data", "myData").put("more", 568)...

और इसे एक अतिरिक्त के रूप में पास करें, जैसा कि अन्य उत्तरों में वर्णित है। आप अपने से एक्स्ट्रा को पुनः प्राप्त कर सकते हैं Activity, और इसके अलावा यदि आप इसका उपयोग कर रहे हैं तो VaporActivityयह आपके लिए स्वचालित रूप से किया जाता है ताकि आप उपयोग कर सकें:

this.extras()

दूसरे छोर पर उन्हें पुनः प्राप्त करने के लिए Activity स्विच करने के लिए।

आशा है कि कुछ के लिए ब्याज की है :)


@BaneeIshaqueK को खेद है, थोड़ी देर के लिए इसे बनाए नहीं रखा। यदि यह मदद करता है तो इस परियोजना के लिए सीधे गीथब को इंगित करने के लिए लिंक को अपडेट किया है। ps। मुझे यकीन नहीं है कि मैं उस लाइसेंस के लिए क्या सोच रहा था ... माफी
डेरियस

4

पहली गतिविधि:

Intent intent = new Intent(getApplicationContext(), ClassName.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);

दूसरी गतिविधि:

String str= getIntent().getStringExtra("Variable name which you sent as an extra");

4

आप 3 तरीकों से एप्लिकेशन में गतिविधियों के बीच डेटा पास कर सकते हैं

  1. इरादा
  2. SharedPreferences
  3. आवेदन

इरादे में डेटा पास करने की कुछ सीमा होती है। बड़ी मात्रा में डेटा के लिए आप एप्लिकेशन स्तर डेटा साझाकरण का उपयोग कर सकते हैं और इसे साझाकरण में संग्रहीत करके आपके ऐप का आकार बढ़ा सकते हैं


3

एक वैश्विक वर्ग का उपयोग करें:

public class GlobalClass extends Application
{
    private float vitamin_a;


    public float getVitaminA() {
        return vitamin_a;
    }

    public void setVitaminA(float vitamin_a) {
        this.vitamin_a = vitamin_a;
    }
}

आप इस वर्ग के बसने वालों और प्राप्तकर्ताओं को अन्य सभी वर्गों से बुला सकते हैं। ऐसा करें, आपको हर एक्टिविटी में एक GlobalClass-Object बनाने की आवश्यकता है:

GlobalClass gc = (GlobalClass) getApplication();

तब आप उदाहरण के लिए कॉल कर सकते हैं:

gc.getVitaminA()

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