অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে ক্রিয়াকলাপগুলির মধ্যে আমি কীভাবে ডেটা পাস করব?


1347

আমার একটি দৃশ্য আছে যেখানে লগইন পৃষ্ঠার মাধ্যমে লগ ইন করার পরে, buttonপ্রতিটিটিতে একটি সাইন-আউট থাকবেactivity

ক্লিক করার পরে sign-out, আমি session idসাইন-আউট ব্যবহারকারীর সাইন- আউটটি পাস করব । যে কেউ কীভাবে সবার জন্য session idউপলব্ধ থাকতে পারে সে সম্পর্কে আমাকে গাইড করতে পারেactivities ?

এই ক্ষেত্রে কোনও বিকল্প


14
আমি রেফার পাসওয়ার্ড বৈশিষ্ট্যে লগইন ডেটা রাখার জন্য অংশীদারিটিকে এর দরকারী ব্যবহার করেছি
শরীফ

এটি আমার পক্ষে কাজ করে। stackoverflow.com/a/7325248/2125322 ধন্যবাদ দর্শন কম্পিউটিং
matasoy

stackoverflow.com/a/37774966/6456129 সহায়ক হতে পারে
Yessy

এই জাতীয় ক্ষেত্রে ভাগ করে নেওয়া পদ্ধতির সাথে কমোমটিলগুলি ক্লাস করার চেষ্টা করুন ... এটি কোডটি কোনও জায়গায় পরিষ্কার এবং সম্পর্কিত ডেটা রাখবে। এবং আপনি সহজেই কোনও ডিফল্ট অ্যাপ্লিকেশন ডেটা সাফ না করে সুনির্দিষ্ট প্রিফেরেন্সফিলকে সাফ করার কেবল একটি পদ্ধতি দিয়ে নির্দিষ্ট সেট ডেটা সাফ করতে সক্ষম হবেন ...
মুহাম্মাদ তাইয়েব

উত্তর:


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
হ্যাঁ, আপনি প্রতিটি ক্রিয়াকলাপে সেশন আইডিটি উপলব্ধ করতে হবে যেখানে আপনি ব্যবহারকারীকে সাইন আউট করার অনুমতি দিতে চান। বিকল্পভাবে, আপনি এটি অ্যাপ্লিকেশন অবজেক্টে সংরক্ষণ করতে পারেন, তবে তারপরে আপনাকে সেশনের অবস্থা পরিচালনা করতে হবে (এটি ব্যবহারের আগে এটি বৈধ কিনা তা পরীক্ষা করে দেখুন)।
এরিখ ডগলাস

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); ? মানে, আমি কি কার্যকলাপকে একটি কল ক্রিয়াকলাপ বি করতে পারি , এবং এটি ক্রিয়াকলাপ এ তে ডেটা ফেরত দেয় ? আমি কি বিভ্রান্ত
ফ্রান্সিসকো মোরালেস


আমি স্ট্রিং ভেরিয়েবল পছন্দ করি। আপনি সর্বদা পূর্ণসংখ্যায় একটি স্ট্রিং রূপান্তর করতে পারেন বা পরে ভাসতে পারেন।
ব্যবহারকারী 914425

140

পাসিং ইন্টেন্ট এক্সট্রা ভাল পদ্ধতি is

আবেদন বস্তুর যদিও অন্য উপায়, এবং এটা যখন একাধিক কার্যক্রম জুড়ে একই রাষ্ট্র সঙ্গে তার আচরণ (যেমন পেতে / এটি সর্বত্র লাগাতে থাকার থেকে ভিন্ন) কখনও কখনও সহজ, বা প্রিমিটিভের এবং স্ট্রিং চেয়ে আরো জটিল অবজেক্ট।

আপনি অ্যাপ্লিকেশনটি প্রসারিত করতে পারেন, এবং তারপরে সেখানে যা যা চান সেট করুন / পাবেন এবং যে কোনও ক্রিয়াকলাপ থেকে (একই অ্যাপ্লিকেশনটিতে) get অ্যাপ্লিকেশন () সহ অ্যাক্সেস করতে পারবেন ।

এও মনে রাখবেন যে স্ট্যাটিক্সের মতো আপনি দেখতে পাচ্ছেন এমন অন্যান্য পদ্ধতির সমস্যা হতে পারে কারণ এগুলি মেমরি ফাঁস হতে পারে । অ্যাপ্লিকেশন এটিও সমাধান করতে সহায়তা করে।


8
স্ট্যাটিক্স সমস্যার জন্য +1। অনক্রিট / অনটার্মিনেট পদ্ধতি অ্যাপ্লিকেশন ক্লাসের সাথে একটি সিঙ্গলটনের সংমিশ্রণটি দিয়ে সম্ভবত ক্লিন আপটি সমাধান করা যেতে পারে।
Syd

10
আরে, আমি জানি এই থ্রেডটি বেশ কিছুক্ষণ আগে ছিল, তবে প্রদত্ত লিঙ্কটি এখন একটি শেষ। আমি কোথাও উদাহরণ খুঁজে পেতে পারি?
জুইসি

কিভাবে অ্যাপ্লিকেশন ব্যবহার করে এটি অর্জন করবেন? @ চর্লিকোলিনস
কে

খুব পুরানো বই :) গিথুব.com
চার্লি কলিন্স

@ জুইসি মেমরি ফাঁস সম্পর্কিত অ্যান্ড্রয়েড বিকাশকারী ব্লগ পোস্ট আর অবৈধ।
এড্রিক

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));

আপনি যে মানটি প্রেরণ করেছেন তা হ'লString :

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

আপনি যে মানটি প্রেরণ করেছেন তা হ'ল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প্রাপ্তরা যা একটি মন্তব্য আইএমও মূল্যবান, উত্তর নয়।
মার্মেল

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 । দ্বিতীয় ক্রিয়াকলাপ শেষ হলে এটি বলা হয়। আপনি ফলাফলের কোডটি পরীক্ষা করে নিশ্চিত করতে পারেন যে এটি আসলে দ্বিতীয় কার্যকলাপ Ac (আপনি একই প্রধান ক্রিয়াকলাপ থেকে একাধিক বিভিন্ন ক্রিয়াকলাপ শুরু করার সময় এটি কার্যকর হয়))
  • রিটার্ন থেকে আপনি যে ডেটা পেয়েছেন তা বের করুন 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);
            }
        }
    }
}

দ্বিতীয় ক্রিয়াকলাপ

  • আপনি পূর্ববর্তী ক্রিয়াকলাপে যে ডেটাটি আবার পাঠাতে চান তাতে ডেটা রাখুন IntentIntentকী-মান জোড় ব্যবহার করে ডেটা সংরক্ষণ করা হয় । আমি 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
ওহ! ধন্যবাদ! এটি আমি যা খুঁজছিলাম বেশ তা ছিল। ক্যামেরা বা অন্যান্য বহিরাগত ব্যবহার করার সময় এটি পরিষ্কার হয়ে গেছে যে আমি ফলাফলগুলি প্রত্যাশা করেছিলাম তবে আমি অভ্যন্তরীণভাবে এটি ব্যবহার করার কথা ভাবিনি। আপনি এটিকে এত খোলাখুলিভাবে প্রথম লিখেছেন।
ব্যবহারকারী3195231

45

আপডেট নোট যে আমি SharedPreferences ব্যবহারের কথা উল্লেখ করেছি । এটির একটি সহজ এপিআই রয়েছে এবং এটি অ্যাপ্লিকেশনটির ক্রিয়াকলাপগুলিতে অ্যাক্সেসযোগ্য। তবে এটি একটি আনাড়ি সমাধান এবং আপনি যদি সংবেদনশীল ডেটা দিয়ে যান তবে এটি একটি সুরক্ষা ঝুঁকি। ইন্টেন্টগুলি ব্যবহার করা ভাল। এটিতে ওভারলোডেড পদ্ধতির একটি বিস্তৃত তালিকা রয়েছে যা ক্রিয়াকলাপের মধ্যে বিভিন্ন ডেটা প্রকারের আরও ভালভাবে স্থানান্তর করতে ব্যবহার করা যেতে পারে। ইন্টেন্ট.পুটেক্সট্রাটিতে একবার দেখুন । এই লিঙ্কটি পুটেক্সট্রার ব্যবহারটি বেশ ভালভাবে উপস্থাপন করেছে।

ক্রিয়াকলাপগুলির মধ্যে ডেটা পাস করার ক্ষেত্রে, আমার পছন্দসই পদ্ধতির প্রাসঙ্গিক ক্রিয়াকলাপের জন্য একটি স্থিতিশীল পদ্ধতি তৈরি করা দরকার যাতে প্রয়োজনীয় পরামিতিগুলি উদ্দেশ্যটি চালু করে। যা তখন সহজেই সেটআপ দেয় এবং প্যারামিটারগুলি পুনরুদ্ধার করে। সুতরাং এটি দেখতে পারেন

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
আমি আপনার উত্তরটি সবচেয়ে পছন্দ করি ... উদ্দেশ্যটির মাধ্যমে এটি পাস করার অর্থ হ'ল প্রায় আমি যেখানেই কোনও ক্রিয়াকলাপ শুরু করি আপনাকে সেশনআইড অন্তর্ভুক্ত করতে হবে remember এটিকে ভাগ করা পছন্দসইগুলিতে রেখে আপনি যে কোনও কার্যকলাপ থেকে যে কোনও সময় এটি পেতে পারেন। : 0)
বাইটবেন্ডার

@ বাইটবেন্ডার আমি জানি যে প্রতিক্রিয়াটির জন্য এটি একটু দেরি হয়েছে, আমি প্রশংসা করি যে আপনি এর সদৃশতার জন্য আমার মূল উত্তরটি পছন্দ করেছেন তবে আমি ভাগ করে নেওয়া পছন্দগুলিতে সেশন আইডি সংরক্ষণ করতে সতর্ক থাকব। আপনার যদি এটি অবশ্যই হার্ড স্টোরেজে সঞ্চয় করে থাকে তবে এনক্রিপশন ব্যবহার করুন। আপনি যদি জেডব্লিউটি নিয়োগ করে এমন একটি প্রমাণীকরণ ফ্রেমওয়ার্ক ব্যবহার করতে পারেন তবে এতে রিফ্রেশ টোকেন অন্তর্ভুক্ত থাকবে যা দীর্ঘমেয়াদী স্টোরেজের জন্য নিরাপদ, এবং তারপরে সহজেই প্রমাণীকরণ টোকেন অ্যাক্সেস করতে, এবং ক্রিয়াকলাপে ওভারহেড হ্রাস করতে রিফ্রেশ টোকেনগুলি কাস্টম অ্যাপ্লিকেশন অবজেক্টের সর্বজনীন সম্পত্তি হিসাবে বর্তমান সেশন টোকেনকে রাখে অভিপ্রায় স্বাক্ষর।
রাগ করুনআইজি

38

নিম্নলিখিতগুলি করার চেষ্টা করুন:

একটি সাধারণ "সহায়ক" শ্রেণি তৈরি করুন (আপনার ইন্টেন্টের জন্য কারখানা), এটির মতো:

import android.content.Intent;

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

এটি আপনার সমস্ত ইন্টেন্টের কারখানা হবে। যতবার আপনার নতুন ইনটেন্টের প্রয়োজন হয়, ইনটেন্টহেল্পারে একটি স্ট্যাটিক ফ্যাক্টরি পদ্ধতি তৈরি করুন। একটি নতুন ইন্টেন্ট তৈরি করতে আপনার এটি ঠিক এটি বলা উচিত:

IntentHelper.createYourSpecialIntent(getIntent());

আপনার ক্রিয়াকলাপে। আপনি যখন "সেশনে" কিছু তথ্য "সংরক্ষণ" করতে চান তখন কেবল নীচেরটি ব্যবহার করুন:

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

এবং এই উদ্দেশ্য পাঠান। লক্ষ্য কার্যকলাপে আপনার ক্ষেত্রটি নিম্নলিখিত হিসাবে উপলব্ধ হবে:

getIntent().getStringExtra("YOUR_FIELD_NAME");

সুতরাং এখন আমরা একই পুরানো সেশনের মতো ইনটেন্ট ব্যবহার করতে পারি (সার্লেলেট বা জেএসপি এর মতো )।


28

আপনি পার্সেবল ক্লাস করে কাস্টম ক্লাস অবজেক্টগুলিও পাস করতে পারেন । এটিকে পার্সেলেবল করার সর্বোত্তম উপায় হ'ল আপনার ক্লাসটি লিখুন এবং তারপরে এটি http://www.parcelabler.com/ এর মতো কোনও সাইটে পেস্ট করুন । বিল্ড ক্লিক করুন এবং আপনি নতুন কোড পাবেন। এগুলি সমস্ত অনুলিপি করুন এবং মূল শ্রেণীর সামগ্রীগুলি প্রতিস্থাপন করুন। Then-

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
ওম ... এটি ওও নীতিগুলি লঙ্ঘন করে না?
খ্রিস্টান ভাইলমা

2
@ ক্রিশ্চিয়ানভিয়েলমা ভাল, এটি অনেকটা ধূসর অঞ্চলের মতো ... আপনি এটি অনেক উপায়ে করতে পারেন, আমার কাছে এটি পরিষ্কার "দূরে সরে যাওয়ার" মতো মনে হচ্ছে, তাই ... সিদ্ধান্তটি গ্রহণ করা আপনার (বিকাশকারী) উপর নির্ভর করে যদি এটি হয় আপনার পক্ষে ভাল কাজ করে বা না, আমি এটি পছন্দ করি কারণ এটি অনুসরণ করা সহজ, তবে এটি খুব দ্রুত নোংরা হতে পারে ...
কম্পিউটারসায়সন

2
তুমি কেন বলছো এটা নোংরা হয়ে যায়? আইওএস কি এর সাথে মিলে যায় এমন "সম্পত্তি" সেট করে ভিউকন্ট্রোলারদের মধ্যে ডেটা পাস করার জন্য এটি করে না? অভিপ্রায় ব্যবহারের চেয়ে এটি অনেক সহজ
টেরি বু

2
হ্যাঁ, আপনি দৃশ্য নিয়ন্ত্রণকারীদের মধ্যে ডেটা পাস করেন, তবে স্থির বৈশিষ্ট্য সহ নয় । সমস্যাটি হ'ল এটি পছন্দসই ক্রিয়াকলাপের উদাহরণ হিসাবে সম্পত্তি নয়। অ্যান্ড্রয়েড যেভাবে স্টার্টঅ্যাক্টিভিটি () এর মাধ্যমে ক্রিয়াকলাপ শুরু করে, তা তাত্ক্ষণিকভাবে বস্তুটি তাত্ক্ষণিকভাবে তৈরি করে না এবং বিকাশকারীকে একটি উদাহরণ পরিবর্তনশীল সেট করার অনুমতি দেয় না। এটি বেশ বিরক্তিকর ...
শান

20

ক্রিয়াকলাপগুলির মধ্যে ডেটা পাস করার সবচেয়ে সুবিধাজনক উপায় হ'ল উদ্দেশ্যগুলি পাস করা passing আপনি যেখান থেকে ডেটা প্রেরণ করতে চান সেখানে প্রথম ক্রিয়াকলাপে আপনার কোড যুক্ত করা উচিত,

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 সালে প্রবেশ আরকে প্রস্তাবিত হিসাবে সদৃশ । এবং 6 টি উত্তর দ্বারা প্রস্তাবিত i.putExtras()/ / হ্রাস করা যেতে পারে getIntent().getString()...
মুরমেল

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
সদৃশ: Bundleভিত্তিক ব্যবস্থা ইতিমধ্যে প্রস্তাবিত PRABEESH আর কে 2012 সালে এবং অজয় Venugopal , কৃষ্ণ । এবং আরও 8 টি উত্তর দ্বারা প্রস্তাবিত i.putExtras()/ getIntent().getString()যা হ্রাস করা যেতে পারে ...
মুরমেল

11

আপনি অভিপ্রায় অবজেক্ট ব্যবহার করে ক্রিয়াকলাপের মধ্যে ডেটা প্রেরণ করতে পারেন। আপনার দুটি কার্যক্রম আছে বিবেচনা করুন FirstActivityএবং SecondActivity

ফার্স্টঅ্যাক্টিভিটির ভিতরে:

অভিপ্রায় ব্যবহার:

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

সেকেন্ডঅ্যাক্টিভিটির ভিতরে

Bundle bundle= getIntent().getExtras();

কী দ্বারা ফার্স্টএকটিভিটি থেকে মানগুলি পাস করতে এখন আপনি বিভিন্ন বান্ডিল শ্রেণির পদ্ধতি ব্যবহার করতে পারেন।

যেমন bundle.getString("key"), bundle.getDouble("key"), bundle.getInt("key")ইত্যাদি


1
সদৃশ: Bundleভিত্তিক পদ্ধতির ইতিমধ্যে 2012 সালে প্রবেশ আর কে এবং অজয় ভেণুগোপাল প্রস্তাব করেছিলেন । এবং 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);

সেকেন্ডফ্রেগমেন্টের অভ্যন্তর গ্রহণ করতে

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

বড় বিটম্যাপ স্থানান্তর করা হচ্ছে

আপনি যদি ব্যেন্ডার লেনদেনে ব্যর্থ হন তবে এর অর্থ আপনি একটি উপাদান থেকে অন্য ক্রিয়াকলাপে বড় উপাদান স্থানান্তর করে বাইন্ডার লেনদেন বাফারকে ছাড়িয়ে যাচ্ছেন।

সুতরাং সেই ক্ষেত্রে আপনাকে বিটম্যাপটি বাইটের অ্যারে হিসাবে সংকুচিত করতে হবে এবং তারপরে এটি অন্য ক্রিয়াকলাপে সঙ্কুচিত করতে হবে , ভালো

ফার্স্টঅ্যাক্টিভিটিতে

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

এখানে আমার সেরা অনুশীলনটি রয়েছে এবং যখন প্রকল্পটি বিশাল এবং জটিল হয় it

মনে করুন যে আমার 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);
    }
}

আমি এখানে আমার লগইনঅ্যাক্টিভিটিতে ডেটা পাস করব pass

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

পরিপূরক উত্তর: কী স্ট্রিংয়ের জন্য নামকরণ কনভেনশন

ডেটা পাস করার প্রকৃত প্রক্রিয়া ইতিমধ্যে উত্তর দেওয়া হয়েছে, তবে বেশিরভাগ উত্তরগুলি ইনটেন্টের মূল নামের জন্য হার্ড কোডিং স্ট্রিং ব্যবহার করে। এটি কেবলমাত্র আপনার অ্যাপ্লিকেশনের মধ্যেই ব্যবহৃত হয়ে থাকে। তবে ডকুমেন্টেশনটি ব্যবহার করার পরামর্শ দেয় recommendEXTRA_* স্ট্যান্ডার্ডযুক্ত ডেটা ধরণের জন্য ধ্রুবকগুলি ।

উদাহরণ 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";

আপনি যদি নিজের অ্যাপ্লিকেশনে কীটি ব্যবহার করেন তবে প্যাকেজের নামটি অন্তর্ভুক্ত করা কেবল একটি সম্মেলন। তবে আপনি যদি এমন কোনও পরিষেবা তৈরি করেন যা অন্য অ্যাপ্লিকেশনগুলি ইন্টেন্টের সাথে কল করতে পারে তবে নামকরণের বিরোধগুলি এড়াতে হবে a

প্রথম ক্রিয়াকলাপ:

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;
 }
}

আপনার ফার্স্টঅ্যাক্টিভিটি থেকে

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

সেকেন্ডএকটিভিটিতে

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

সদৃশ: অভিপ্রায় পদ্ধতির ইতিমধ্যে প্রস্তাব করা হয় সবচেয়ে বেশি উত্তর ভোট দিয়েছেন এবং সাহিল মহাজন Mj এর উত্তর এবং মায়াঙ্ক Saini এর উত্তর এবং Md। রহমানের উত্তর , Dilavar M এর উত্তর , অ্যান্ড্রয়েড বিকাশকারীর উত্তর , 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);

সদৃশ এই পদ্ধতির ইতিমধ্যে propsed ছিল রবি Parsania 2014 সালে
Murmel

5

বান্ডেল অবজেক্টের মাধ্যমে এই ক্রিয়াকলাপের পরামিতিগুলি থেকে অন্য ক্রিয়াকলাপ শুরু করুন

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

অন্য ক্রিয়াকলাপটি পুনরুদ্ধার করুন (আপনার ক্রিয়াকলাপ)

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

এটি সহজ ধরণের ডেটা টাইপের জন্য ঠিক। তবে আপনি যদি ক্রিয়াকলাপের মধ্যে জটিল ডেটা পাস করতে চান তবে আপনাকে প্রথমে এটি সিরিয়ালাইজ করা দরকার।

এখানে আমরা কর্মচারী মডেল আছে

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

    getters...
    setters...
}

আপনি এর মতো জটিল ডেটা সিরিয়াল করতে গুগল সরবরাহ করেছেন জিসন লিব ব্যবহার করতে পারেন

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);

এটি optionচ্ছিকভাবে পরিবর্তনগুলি অটোস্যাভ করে এবং পঠন-পাঠনের প্রক্রিয়াটিকে হুডের নীচে এক করে দেয় যাতে আপনার স্ট্যান্ডার্ড অ্যান্ড্রয়েডের মতো স্পষ্টভাবে কোনও সম্পাদক পুনরুদ্ধার করার দরকার নেই।

বিকল্পভাবে আপনি একটি ব্যবহার করতে পারেন Intent। বাষ্পের এপিআইতে আপনি একটিতে চেইনযোগ্য ওভারলোডেড .put(...)পদ্ধতিটিও ব্যবহার করতে পারেন VaporIntent:

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

এবং অন্যান্য উত্তরে উল্লিখিত হিসাবে এটি অতিরিক্ত হিসাবে পাস করুন। আপনি আপনার থেকে অতিরিক্তগুলি পুনরুদ্ধার করতে পারেন Activityএবং এছাড়াও আপনি যদি এটি ব্যবহার করেন তবে VaporActivityস্বয়ংক্রিয়ভাবে আপনার জন্য এটি করা হয়ে থাকে যাতে আপনি ব্যবহার করতে পারেন:

this.extras()

Activityআপনি স্যুইচ করেছেন অন্য প্রান্তে এগুলি পুনরুদ্ধার করতে।

আশা করি এটি কারও আগ্রহী :)


@ বানীশ্যাখেক হ্যাঁ দুঃখিত, এটি কিছুক্ষণ ধরে রাখেনি। প্রকল্পটি সাহায্য করার ক্ষেত্রে সরাসরি গিথুবকে নির্দেশ করার জন্য আপডেট লিঙ্কটি রয়েছে। পুনশ্চ. নিশ্চিত নয় যে আমি এই লাইসেন্সটির জন্য কী ভাবছিলাম ... ক্ষমাপ্রার্থী
দারিয়াস

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. আবেদন

অভিপ্রায় ডেটা পাস করার কিছু সীমা থাকে। প্রচুর পরিমাণে ডেটার জন্য আপনি অ্যাপ্লিকেশন স্তরের ডেটা ভাগ করে নেওয়া এবং এটি SharedPreferences এ সঞ্চয় করে আপনার অ্যাপের আকার বাড়িয়ে তোলে


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 gc = (GlobalClass) getApplication();

তারপরে আপনি উদাহরণস্বরূপ কল করতে পারেন:

gc.getVitaminA()

আবেদন উপেক্ষা করা - এই সদৃশ আপনারা কে কে এর উত্তর
Murmel
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.