ইন্টেন্টস ব্যবহার করে কীভাবে একটি অ্যান্ড্রয়েড ক্রিয়াকলাপ থেকে অন্য কোনও অ্যান্ড্রয়েডকে পাঠানো যায়?


849

ক্লাস ইন্টেন্টের পদ্ধতিটি ব্যবহার করে আমি কীভাবে একটি ক্রিয়াকলাপের কোনও বস্তুটিকে অন্য ক্রিয়াকলাপ থেকে অন্য কার্যকলাপে পাস করতে পারি ?putExtra()


@ ইউএমএ - আপনার প্রশ্নগুলিকে "সম্প্রদায় উইকি" হিসাবে চিহ্নিত করার দরকার নেই। এখানে এক নজরে
ডেভ ওয়েব

1
@ পরেশ: আপনার দেওয়া লিঙ্কটি ভেঙে গেছে। আপনি একটি বিকল্প প্রদান করতে পারেন?
অ্যান্টিপ্লেক্স



আমি একটি সহজ ও মার্জিত পদ্ধতি পাওয়া stackoverflow.com/a/37774966/6456129
Yessy

উত্তর:


751

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

দস্তাবেজগুলি থেকে, কীভাবে প্রয়োগ করা যায় তার জন্য একটি সাধারণ উদাহরণ:

// simple class that just has one member property as an example
public class MyParcelable implements Parcelable {
    private int mData;

    /* everything below here is for implementing Parcelable */

    // 99.9% of the time you can just ignore this
    @Override
    public int describeContents() {
        return 0;
    }

    // write your object's data to the passed-in Parcel
    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(mData);
    }

    // this is used to regenerate your object. All Parcelables must have a CREATOR that implements these two methods
    public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
        public MyParcelable createFromParcel(Parcel in) {
            return new MyParcelable(in);
        }

        public MyParcelable[] newArray(int size) {
            return new MyParcelable[size];
        }
    };

    // example constructor that takes a Parcel and gives you an object populated with it's values
    private MyParcelable(Parcel in) {
        mData = in.readInt();
    }
}

লক্ষ্য করুন যে প্রদত্ত পার্সেল থেকে পুনরুদ্ধার করার জন্য আপনার একাধিক ক্ষেত্র রয়েছে, আপনার অবশ্যই তাদের ঠিক একই ক্রমে এটি করা উচিত (এটি একটি ফিফোর পদ্ধতির ক্ষেত্রে)।

একবার আপনার জিনিসগুলি প্রয়োগ করার পরে Parcelableএটি পুটেক্সট্রা () দিয়ে আপনার উদ্দীপনাগুলিতে রাখার বিষয় মাত্র :

Intent i = new Intent();
i.putExtra("name_of_extra", myParcelableObject);

তারপরে আপনি getParcelableExtra () এর সাহায্যে এগুলি পিছনে টেনে আনতে পারেন :

Intent i = getIntent();
MyParcelable myParcelableObject = (MyParcelable) i.getParcelableExtra("name_of_extra");

যদি আপনার অবজেক্ট ক্লাস পার্সেবল এবং সিরিয়ালাইজেবল প্রয়োগ করে থাকে তবে নিশ্চিত হয়ে নিন যে আপনি নিম্নলিখিতগুলির মধ্যে একটিতে কাস্ট করেছেন do

i.putExtra("parcelable_extra", (Parcelable) myParcelableObject);
i.putExtra("serializable_extra", (Serializable) myParcelableObject);

14
যেখানে এমডাটা কোনও অবজেক্ট (যেমন জেএসএনওবজেক্ট) এবং কোনও ইনট নয় সেখানে কীভাবে এটি প্রয়োগ করা হবে?
পিটার আজতাই

301
কেন এই সমস্ত কিছু না করে কেবল বস্তুটি পাস করা যায় না? আমরা ইতিমধ্যে স্মৃতিতে থাকা একটি বস্তুটি পাস করতে চাই।
সেকলক

110
@ এটির বিটস অ্যাপসটি বিভিন্ন প্রক্রিয়ায় রয়েছে এবং আলাদা মেমরি ঠিকানার স্পেস রয়েছে, আপনি আপনার প্রক্রিয়াতে মেমরি ব্লকে কেবল পয়েন্টার (রেফারেন্স) প্রেরণ করতে পারবেন না এবং এটি অন্য কোনও প্রক্রিয়াতে উপলব্ধ হওয়ার প্রত্যাশা করছেন।
মার্চিনজ

12
আমি কি করতে পারি না যদি আমি অবজেক্টের শ্রেণি সিরিয়ালযোগ্য বা পার্সেবল করতে পারি না?
আমেল জোস

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

194

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

সেক্ষেত্রে আপনি কেবল স্ট্রিংয়ের মানটি স্ট্রিংয়ের মান থেকে (new Gson()).toJson(myObject);পুনরুদ্ধার করে রেখেছিলেন এবং fromJsonএটিকে আবার আপনার অবজেক্টে পরিণত করতে ব্যবহার করবেন।

তবে যদি আপনার অবজেক্টটি খুব জটিল না হয় তবে এটি ওভারহেডের পক্ষে মূল্যবান নাও হতে পারে এবং আপনি তার পরিবর্তে অবজেক্টের পৃথক মানগুলি পাস করার বিষয়টি বিবেচনা করতে পারেন।


19
আমি অনুমান করছি যেহেতু ফিক্সেড্ডের উত্তর বহিরাগত গ্রন্থাগারগুলি ব্যবহার না করে একই সমস্যার সমাধান করে, কেবল এতটাই পছন্দনীয় যে, আমি যে সমাধানটি দিয়েছি সে সম্পর্কে কারও কাছে কখনও যাওয়ার কারণ নেই (অজানা, সেই সময়ে, fiXedd এর উজ্জ্বল সমাধান)
ডেভিড হেডলুন্ড

5
আমি মনে করি যে এটি সঠিক। তদ্ব্যতীত, জেএসএন হ'ল ক্লায়েন্ট / সার্ভারের জন্য আরও উপযুক্ত এবং থ্রেড-টু-থ্রেড নয়।
মুবিবব

16
অগত্যা কোনও খারাপ ধারণা নয়, esp। যেহেতু আপনি প্রেরণ করতে চান এমন সমস্ত বস্তুর জন্য পার্সেবল কার্যকর করার চেয়ে জিসন ব্যবহার করা অনেক সহজ।
ইউভেনটেন

7
আইএম যেমন আমার অ্যাপ্লিকেশনটিতে জিএসএন ব্যবহার করছে এটি সত্যিই সহজ এবং দুর্দান্ত উপায়!
লার্স

16
উত্তম উত্তর, যদিও সম্পূর্ণ সমাধানটি হবে String s = (new Gson().toJson(client));এবং তারপরেCli client = new Gson().fromJson(s, Cli.class);
জোয়াকুইন ইরচুক

155

আপনি অভিপ্রায় মাধ্যমে সিরিয়ালাইজযোগ্য বস্তু প্রেরণ করতে পারেন

// send where details is object
ClassName details = new ClassName();
Intent i = new Intent(context, EditActivity.class);
i.putExtra("Editing", details);
startActivity(i);


//receive
ClassName model = (ClassName) getIntent().getSerializableExtra("Editing");

And 

Class ClassName implements Serializable {
} 

2
আপনি পার্সেলেবল অবজেক্টগুলিও অভিপ্রায় পাঠাতে পারেন।
টনি গিল

6
"সিরিয়ালাইজযোগ্যটি অ্যান্ড্রয়েডে কমিক্যালভাবে ধীর। এ বর্ণন stackoverflow.com/questions/5550670/...
উচ্চতম শ্রেণীয় দেবদূত এর

যদি ক্রিয়াকলাপটি ইতিমধ্যে চলমান থাকে, তখন কি স্টার্টঅ্যাক্টিভিটি করার দরকার আছে (i); ? মানে, আমি কি কার্যকলাপকে একটি কল ক্রিয়াকলাপ বি করতে পারি , এবং এটি ক্রিয়াকলাপ এ তে ডেটা ফেরত দেয় ? আমি কি বিভ্রান্ত
ফ্রান্সিসকো

3
@ আপনি যদি প্রচুর অবজেক্টকে সিরিয়ালাইজ করছেন তবে সীরাফিমের পারফরম্যান্সের বিষয়টি বিবেচনা করে তবে কোনও বিষয়কে সিরিয়ালাইজ করা হলে 1 এমএস বা 10 এমএস লাগে তা ব্যবহারকারী লক্ষ্য করবেন না। যদি কোনও অভিপ্রায় অতিরিক্ত ইতিমধ্যে থাকে Serializableতবে তা নয় Parcelable, এটি তৈরি করার ঝামেলা খুব কম Parcelable
কেভিন ক্রামউইদে

67

যে পরিস্থিতিতে আপনি জানেন যে কোনও অ্যাপ্লিকেশনের মধ্যে আপনি ডেটা পাস করবেন, সেখানে "গ্লোবাল" (স্ট্যাটিক ক্লাসের মতো) ব্যবহার করুন

এখানে কি দায়ানি Hackborn : এ বিষয়ে বলার ছিল - (একটি Google Android এর সফটওয়্যার ইঞ্জিনিয়ার hackbod)

যে পরিস্থিতিতে আপনি জানেন যে ক্রিয়াকলাপ একই প্রক্রিয়াতে চলছে, আপনি কেবল গ্লোবালের মাধ্যমে ডেটা ভাগ করতে পারেন। উদাহরণস্বরূপ, আপনি একটি বিশ্বব্যাপী থাকতে পারেন HashMap<String, WeakReference<MyInterpreterState>> এবং যখন আপনি একটি নতুন মাইন্টারপ্রিটার স্টেট তৈরি করেন তখন এর জন্য একটি অনন্য নাম নিয়ে এসে এটি হ্যাশ মানচিত্রে রাখুন; এই স্থিতিকে অন্য ক্রিয়াকলাপে প্রেরণ করতে, অনন্য নামটি কেবল হ্যাশ মানচিত্রে রাখুন এবং দ্বিতীয় ক্রিয়াকলাপটি শুরু করা হলে এটি হ্যাশ মানচিত্র থেকে প্রাপ্ত নামটির সাথে MyInterpreterState পুনরুদ্ধার করতে পারে।


25
হ্যাঁ, আমি এটি অদ্ভুত বলে মনে করেছি যে আমরা এই ইনটেন্টগুলি ব্যবহারের জন্য পেয়েছি এবং তারপরে একজন শীর্ষ প্রকৌশলী আমাদের কেবলমাত্র আমাদের ডেটার জন্য গ্লোবালগুলি ব্যবহার করতে বলেছিলেন। তবে সেখানে সোজা ঘোড়াগুলির মুখ থেকে।
রিচার্ড লে ম্যাসুরিয়ার

1
এখানে কি দুর্বল রিফ্রান্সেন্স আবর্জনা সংগ্রহের শিকার হতে পারে?
uLYsseus

1
@ ইউলিসিউস মনে করেন যে এই ধারণাটি, একবার আপনি তাদের সাথে ক্রিয়াকলাপগুলি সম্পন্ন করার পরে ... সুতরাং যখন সম্পর্কিত ক্রিয়াকলাপগুলি ধ্বংস হয়ে যায়, তখন এটি জিসির অনুমতি দেবে
পিটার

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

অভিপ্রায়গুলি এমন একটি বিন্দুতে ওভাররেঞ্জাইন করা হয়েছিল যেখানে অভিপ্রায়টি অন্য একটি কম্পিউটারে যেতে পারে। আপনি যখন কেবলমাত্র একটি প্রক্রিয়া শুরু করছেন ঠিক তখনই এটি করার ভাল উপায় নয় reasons কারণ এটি কেন ভাল নয়: মেমরি ব্যবহার, সিপিইউ ব্যবহার, ব্যাটারি ব্যবহার। শেষটি হিন্টসাইটে বেশ বিভ্রান্তির উদ্দেশ্যগুলি সহ বিশেষ করে নকশার পছন্দগুলি করেছিল। এমন কিছু লোক আছেন যারা জোর দিয়ে বলেন যে তারা একটি ভাল ধারণা, সাধারণত কারণ "গুগল তাই বলেছিল"।
লাসি কিনুনেনেন

49

আপনার শ্রেণিতে সিরিয়ালাইজযোগ্য বা পার্সেবল কার্যকর করা উচিত।

public class MY_CLASS implements Serializable

একবার হয়ে গেলে আপনি পুটেক্সট্রায় কোনও অবজেক্ট পাঠাতে পারবেন

intent.putExtra("KEY", MY_CLASS_instance);

startActivity(intent);

অতিরিক্ত পেতে আপনার কেবলমাত্র করতে হবে

Intent intent = getIntent();
MY_CLASS class = (MY_CLASS) intent.getExtras().getSerializable("KEY");

যদি আপনার শ্রেণি পাশেরযোগ্য ব্যবহার প্রয়োগ করে use

MY_CLASS class = (MY_CLASS) intent.getExtras().getParcelable("KEY");

আমি আশা করি এটি সাহায্য করে: ডি


6
আপনার ক্লাসটি প্রয়োগ করা Serializableঅবশ্যই ভুল। ক্লাস Parcelableউদাহরণস্বরূপ বাস্তবায়ন করতে পারে ।
মার্ক প্লানো-লেসে

পার্সেবল এবং সিরিয়ালাইজেবল @ কর্নাল্ডের মধ্যে পার্থক্য কী? প্রক্রিয়াকরণের সময়ের ক্ষেত্রে এটি আরও ধীর / সেরা অনুশীলন বা কিছু না?
gumuruh

যদিও Serializableএকটি স্ট্যান্ডার্ড জাভা ইন্টারফেস, Parcelableঅ্যান্ড্রয়েড-নির্দিষ্ট। পারফরম্যান্সের ক্ষেত্রে, পার্সেবল আরও দক্ষ: ডেভেলপারফিল.
com/parcelable-vs-serializable

35

দ্রুত প্রয়োজনের জন্য সংক্ষিপ্ত উত্তর

1. আপনার শ্রেণিকে সিরিয়ালাইজেবল কার্যকর করুন।

আপনার যদি কোনও অভ্যন্তরীণ ক্লাস থাকে তবে সেগুলি সিরিয়ালাইজেবলের ক্ষেত্রেও প্রয়োগ করতে ভুলবেন না !!

public class SportsData implements  Serializable
public class Sport implements  Serializable

List<Sport> clickedObj;

2. আপনার উদ্দেশ্য অবতারণা করুন

 Intent intent = new Intent(SportsAct.this, SportSubAct.class);
            intent.putExtra("sport", clickedObj);
            startActivity(intent);

৩. এবং অন্যান্য ক্রিয়াকলাপে আপনার অবজেক্টটি গ্রহণ করুন receive

Intent intent = getIntent();
    Sport cust = (Sport) intent.getSerializableExtra("sport");

এই লিঙ্কে দেখুন, stackoverflow.com/questions/2139134/...
RejoylinLokeshwaran

পার্সেবল ইন্টারফেস প্রয়োগ করে আপনি একই জিনিস অর্জন করতে পারেন। পার্সেলেবল ইন্টারফেস কোডের আকারের কারণে সিরিয়ালাইজেবলের তুলনায় প্রয়োগ করতে আরও সময় নেয়। তবে এটি সিরিয়ালাইজেবলের চেয়ে দ্রুত সম্পাদন করে এবং কম সংস্থান ব্যবহার করে।
Kwnstantinos Nikoloutsos

27

যদি আপনার অবজেক্ট শ্রেণি প্রয়োগ করে Serializable, আপনার আর কিছু করার দরকার নেই, আপনি সিরিয়ালাইজযোগ্য বস্তুটি পাস করতে পারেন।
এটাই আমি ব্যবহার করি।


24

আপনার ক্লাসে সিরিয়ালযোগ্য প্রয়োগ করুন

public class Place implements Serializable{
        private int id;
        private String name;

        public void setId(int id) {
           this.id = id;
        }
        public int getId() {
           return id;
        }
        public String getName() {
           return name;
        }

        public void setName(String name) {
           this.name = name;
        }
}

তারপরে আপনি এই অবজেক্টটি অভিপ্রায় পাস করতে পারেন

     Intent intent = new Intent(this, SecondAct.class);
     intent.putExtra("PLACE", Place);
     startActivity(intent);

দ্বিতীয় ক্রিয়াকলাপটি আপনি এর মতো ডেটা পেতে পারেন

     Place place= (Place) getIntent().getSerializableExtra("PLACE");

কিন্তু যখন ডেটা বড় হবে, এই পদ্ধতিটি ধীর হবে।


16

এমন কয়েকটি উপায় রয়েছে যার মাধ্যমে আপনি অন্যান্য ক্লাসে বা ক্রিয়াকলাপে ভেরিয়েবল বা অবজেক্ট অ্যাক্সেস করতে পারেন।

উ: ডাটাবেস

বি ভাগ করা পছন্দ।

গ। বস্তু সিরিয়ালকরণ।

ডি। এমন একটি শ্রেণি যা সাধারণ তথ্য রাখতে পারে তা সাধারণ ইউটিলিটিস হিসাবে এটি আপনার উপর নির্ভর করে নামকরণ করা যেতে পারে।

ই। ইনটেন্টস এবং পার্সেবল ইন্টারফেসের মাধ্যমে ডেটা পাস করা।

এটি আপনার প্রকল্পের প্রয়োজনের উপর নির্ভর করে।

উ: ডাটাবেস

এসকিউএলাইট একটি ওপেন সোর্স ডেটাবেস যা অ্যান্ড্রয়েড এ এমবেড করা আছে। এসকিউএলাইট এসকিউএল সিনট্যাক্স, লেনদেন এবং প্রস্তুত বিবৃতিগুলির মতো স্ট্যান্ডার্ড রিলেশনাল ডাটাবেস বৈশিষ্ট্যগুলিকে সমর্থন করে।

টিউটোরিয়াল - http://www.vogella.com/articles/AndroidSQLite/article.html

বি ভাগ করা পছন্দসমূহ

মনে করুন আপনি ব্যবহারকারীর নাম সংরক্ষণ করতে চান। সুতরাং এখন দুটি কী থাকবে একটি কী ব্যবহারকারী নাম, মান মান Val

কীভাবে সংরক্ষণ করবেন

 // Create object of SharedPreferences.
 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
 //now get Editor
 SharedPreferences.Editor editor = sharedPref.edit();
 //put your value
 editor.putString("userName", "stackoverlow");

 //commits your edits
 editor.commit();

পুটস্ট্রিং (), পুটবুলিয়ান (), পুটইন্ট (), পুটফ্লোট (), পুটলং () ব্যবহার করে আপনি আপনার পছন্দসই ডিটাটাইপ সংরক্ষণ করতে পারেন।

কীভাবে আনতে হবে

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String userName = sharedPref.getString("userName", "Not Available");

http://developer.android.com/reference/android/content/SharedPreferences.html

সি। সিরিজ অবজেক্ট

যদি আমরা কোনও অবজেক্টের স্টেটটিকে নেটওয়ার্কের মাধ্যমে প্রেরণ করতে বা সংরক্ষণ করতে চাই তবে অবজেক্ট সারলাইজেশন ব্যবহৃত হয় you

জাভা বিন এবং তার ক্ষেত্রগুলির মধ্যে একটি হিসাবে এটি সংরক্ষণ করুন এবং তার জন্য গেটর এবং সেটার ব্যবহার করুন

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

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

    public void setInString(String inString) {
        this.inString = inString;
    }


}

আপনার মেল পদ্ধতিতে ভেরিয়েবলটি সেট করে সেট করুন

VariableStorage variableStorage = new VariableStorage();
variableStorage.setInString(inString);

তারপরে এই বিষয়টিকে সিরিয়ালাইজ করার জন্য অবজেক্ট সিরিয়ালাইজেশন ব্যবহার করুন এবং আপনার অন্যান্য শ্রেণিতে এই অবজেক্টটিকে ডিসরিয়ালাইজ করুন।

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

সিরিয়ালযুক্ত কোনও বস্তু কোনও ফাইলে লেখার পরে, এটি ফাইল থেকে পড়তে পারে এবং এটি ডিসরিওলাইজ করা যায়, যা সেই ধরণের তথ্য এবং বাইটগুলি যা বস্তুর প্রতিনিধিত্ব করে এবং এর ডেটা ব্যবহার করে স্মৃতিতে বস্তুটিকে পুনরায় তৈরি করতে পারে।

আপনি যদি এইটির জন্য টিউটোরিয়াল চান তবে এই লিঙ্কটি দেখুন

http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html

অন্যান্য ক্লাসে পরিবর্তনশীল পান

D. সাধারণ ইউটিলিটিস

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

নমুনা

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

ই। ইনটেন্টের মাধ্যমে ডেটা পাস করা

ডেটা পাস করার এই বিকল্পের জন্য দয়া করে এই টিউটোরিয়ালটি দেখুন।

http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/


ইন্টেন্টগুলির মাধ্যমে ডেটা পাস করার বিষয়ে আপনি (ই) তে ভাল টিউটোরিয়াল উল্লেখ করেছেন।
রিমিক

16

এটি করতে আপনি অ্যান্ড্রয়েড বান্ডেল ব্যবহার করতে পারেন।

আপনার ক্লাস থেকে একটি বান্ডেল তৈরি করুন যেমন:

public Bundle toBundle() {
    Bundle b = new Bundle();
    b.putString("SomeKey", "SomeValue");

    return b;
}

তারপরে INTENT সহ এই বান্ডিলটি পাস করুন। এখন আপনি নিজের বান্ডেলটি পছন্দ মতো পাস করে আবার বানাতে পারেন

public CustomClass(Context _context, Bundle b) {
    context = _context;
    classMember = b.getString("SomeKey");
}

আপনার কাস্টম শ্রেণিতে এটি ব্যবহার করুন এবং ব্যবহার করুন।


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

পার্সেবল আমার কাছে জটিল বলে মনে হচ্ছে, আমার উপরের উত্তরে আমি ক্লাস থেকে টু বান্ডিল পদ্ধতিটি এর অবজেক্টে ব্যবহার করছি যাতে অবজেক্ট বান্ডলে রূপান্তরিত হয় এবং তারপরে আমরা বান্ডেলকে শ্রেণীর অবজেক্টে রূপান্তর করতে কনস্ট্রাক্টর ব্যবহার করতে পারি।
om252345

আপনি যদি কোনও অভিপ্রায়ের মাধ্যমে কোনও একক বস্তুটি পাস করেন তবে এই সমাধানটি কেবলমাত্র কার্যকর।
TheIT

জসনের মতো তবে জসন হ'ল হালকা ওজন আমার মনে হয়।
ডেভিড

যখন আমি এটি পুনরুদ্ধার করব তখন অবজেক্টটি কি একই জিনিস বা অনুলিপি হবে?
মার্কাস

15

পার্সেবল সাহায্যের জন্য ধন্যবাদ তবে আমি আরও একটি alচ্ছিক সমাধান পেয়েছি

 public class getsetclass implements Serializable {
        private int dt = 10;
    //pass any object, drwabale 
        public int getDt() {
            return dt;
        }

        public void setDt(int dt) {
            this.dt = dt;
        }
    }

ক্রিয়াকলাপ এক

getsetclass d = new getsetclass ();
                d.setDt(50);
                LinkedHashMap<String, Object> obj = new LinkedHashMap<String, Object>();
                obj.put("hashmapkey", d);
            Intent inew = new Intent(SgParceLableSampelActivity.this,
                    ActivityNext.class);
            Bundle b = new Bundle();
            b.putSerializable("bundleobj", obj);
            inew.putExtras(b);
            startActivity(inew);

ক্রিয়াকলাপে ডেটা পান 2

 try {  setContentView(R.layout.main);
            Bundle bn = new Bundle();
            bn = getIntent().getExtras();
            HashMap<String, Object> getobj = new HashMap<String, Object>();
            getobj = (HashMap<String, Object>) bn.getSerializable("bundleobj");
            getsetclass  d = (getsetclass) getobj.get("hashmapkey");
        } catch (Exception e) {
            Log.e("Err", e.getMessage());
        }

1
ভাল উত্তর, তবে আপনার কোডিং স্ট্যান্ডার্ডগুলি বাড়িয়ে দিন ... +1 যদিও প্রতিযোগিতায় সিরিয়ালাইজেবল আনার জন্য যদিও পার্সেলবেলগুলি অনেক দ্রুত ...
অমিত

13

ক্রিয়াকলাপের মধ্যে অবজেক্টগুলি প্রেরণের জন্য আমি গসনকে এর এত শক্তিশালী এবং সাধারণ এপিআই সহ ব্যবহার করি,

উদাহরণ

// This is the object to be sent, can be any object
public class AndroidPacket {

    public String CustomerName;

   //constructor
   public AndroidPacket(String cName){
       CustomerName = cName;
   }   
   // other fields ....


    // You can add those functions as LiveTemplate !
    public String toJson() {
        Gson gson = new Gson();
        return gson.toJson(this);
    }

    public static AndroidPacket fromJson(String json) {
        Gson gson = new Gson();
        return gson.fromJson(json, AndroidPacket.class);
    }
}

আপনি যে জিনিসগুলিতে প্রেরণ করতে চান তাতে 2 টি ক্রিয়া যুক্ত করুন add

ব্যবহার

এটিকে বি থেকে অবজেক্টটি প্রেরণ করুন

    // Convert the object to string using Gson
    AndroidPacket androidPacket = new AndroidPacket("Ahmad");
    String objAsJson = androidPacket.toJson();

    Intent intent = new Intent(A.this, B.class);
    intent.putExtra("my_obj", objAsJson);
    startActivity(intent);

খ-এ গ্রহণ করুন

@Override
protected void onCreate(Bundle savedInstanceState) {        
    Bundle bundle = getIntent().getExtras();
    String objAsJson = bundle.getString("my_obj");
    AndroidPacket androidPacket = AndroidPacket.fromJson(objAsJson);

    // Here you can use your Object
    Log.d("Gson", androidPacket.CustomerName);
}

আমি এটি প্রায় প্রতিটি প্রকল্পেই এটি ব্যবহার করি এবং আমার কোনও কার্যকারিতা সংক্রান্ত সমস্যা নেই।


ধন্যবাদ, এটি আমাকে কয়েক ঘন্টা অতিরিক্ত জটিলতায় বাঁচিয়েছে।
Hristo Stoyanov

10

আমি একই সমস্যা নিয়ে লড়াই করেছি। আমি একটি স্ট্যাটিক ক্লাস ব্যবহার করে এটি সমাধান করেছি, হ্যাশম্যাপে আমার যে কোনও ডেটা সঞ্চয় করতে চাই। উপরে আমি স্ট্যান্ডার্ড অ্যাক্টিভিটি ক্লাসের একটি এক্সটেনশন ব্যবহার করি যেখানে আমি ডেটা ট্রান্সপোর্ট এবং ডেটা ক্লিয়ারিং লুকিয়ে রাখার জন্য অনড্রেস্ট্রয় পদ্ধতিগুলি ওভাররাইড করেছি। কিছু হাস্যকর সেটিংস পরিবর্তন করতে হবে যেমন ওরিয়েন্টেশন-হ্যান্ডলিং।

টীকাদি: অন্য ক্রিয়াকলাপে পাস করার জন্য সাধারণ জিনিস সরবরাহ না করা পাছায় ব্যথা। এটি নিজেকে হাঁটুতে গুলি করার এবং 100 মিটার জয়ের আশা করার মতো। "পার্কেবল" কোনও পর্যাপ্ত বিকল্প নয়। এটি আমাকে হাসায় ... আমি এই প্রযুক্তিটি আমার প্রযুক্তি-মুক্ত এপিআই-তে প্রয়োগ করতে চাই না, যতই কম আমি একটি নতুন স্তর প্রবর্তন করতে চাই ... এটি কীভাবে হতে পারে, যে আমরা এতদূর মোবাইল প্রোগ্রামিংয়ে আছি আধুনিক দৃষ্টান্ত ...


9

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

intent.putExtra("myTag", yourObject);

এবং আপনার দ্বিতীয় এক:

myCustomObject myObject = (myCustomObject) getIntent().getSerializableExtra("myTag");

আপনার কাস্টম অবজেক্টকে সিরিয়ালাইজেবল করতে ভুলবেন না:

public class myCustomObject implements Serializable {
...
}

পার্সলেবল সিরিয়ালাইজেবলের চেয়ে ভাল! আপনার অ্যান্ড্রয়েড কোডটিতে সিরিয়ালাইজেবল ব্যবহার করা এড়িয়ে চলুন!
ফিলিপ ব্রিটো

7

এটি করার আরেকটি উপায় হ'ল Applicationঅবজেক্ট (android.app.Application) ব্যবহার করা। আপনি এটি আপনার AndroidManifest.xmlফাইলটিতে এটি সংজ্ঞায়িত করুন:

<application
    android:name=".MyApplication"
    ...

তারপরে আপনি যেকোন ক্রিয়াকলাপ থেকে এটি কল করতে পারেন এবং অবজেক্টটিকে Applicationক্লাসে সংরক্ষণ করতে পারেন ।

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

MyObject myObject = new MyObject();
MyApplication app = (MyApplication) getApplication();
app.setMyObject(myObject);

দ্বিতীয় ক্রিয়াকলাপে, করুন:

MyApplication app = (MyApplication) getApplication();
MyObject retrievedObject = app.getMyObject(myObject);

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

Intentsযদিও এটি পুরোপুরি ব্যবহার এড়ানো যায় । আমি জানি না তারা আপনার পক্ষে উপযুক্ত কিনা। আমি এটি ব্যবহার করার আরেকটি উপায় হ'ল intঅবজেক্টগুলির শনাক্তকারীদের ইন্টেন্টের মাধ্যমে প্রেরণ করা এবং অবজেক্টে মানচিত্রে থাকা বস্তুগুলি পুনরুদ্ধার করা Application


1
এটা তোলে কিছু করার সঠিক উপায় নয় যেহেতু বস্তু পরিবর্তনশীল হতে পারে, পুলিশের যদি আপনি অ্যাপ্লিকেশন জীবনচক্র বরাবর স্ট্যাটিক বস্তুর সম্পর্কে কথা বলতে কাজ করতে পারে, কিন্তু কিছু বার আমরা তাই যে বস্তু webservice ব্যবহার উত্পন্ন করতে পারে passiing প্রয়োজন stackoverflow.com / এ / 2736612/716865
মুহান্নাদ এ আলহারিরি

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

এটি সেরা উত্তর। এটি দেখায় যে কীভাবে বিভিন্ন ক্রিয়াকলাপ একই ডেটা মডেলের রেফারেন্স করতে পারে। এটি আবিষ্কার করতে আমার অনেক দীর্ঘ সময় লেগেছে!
মার্কাস

6

আপনার ক্লাস মডেল (অবজেক্ট) সিরিয়ালাইজযোগ্য বাস্তবায়ন করুন উদাহরণস্বরূপ:

public class MensajesProveedor implements Serializable {

    private int idProveedor;


    public MensajesProveedor() {
    }

    public int getIdProveedor() {
        return idProveedor;
    }

    public void setIdProveedor(int idProveedor) {
        this.idProveedor = idProveedor;
    }


}

এবং আপনার প্রথম ক্রিয়াকলাপ

MensajeProveedor mp = new MensajeProveedor();
Intent i = new Intent(getApplicationContext(), NewActivity.class);
                i.putExtra("mensajes",mp);
                startActivity(i);

এবং আপনার দ্বিতীয় ক্রিয়াকলাপ (নতুন কার্যকলাপ)

        MensajesProveedor  mensajes = (MensajesProveedor)getIntent().getExtras().getSerializable("mensajes");

শুভকামনা !!


6
public class SharedBooking implements Parcelable{

    public int account_id;
    public Double betrag;
    public Double betrag_effected;
    public int taxType;
    public int tax;
    public String postingText;

    public SharedBooking() {
        account_id = 0;
        betrag = 0.0;
        betrag_effected = 0.0;
        taxType = 0;
        tax = 0;
        postingText = "";
    }

    public SharedBooking(Parcel in) {
        account_id = in.readInt();
        betrag = in.readDouble();
        betrag_effected = in.readDouble();
        taxType = in.readInt();
        tax = in.readInt();
        postingText = in.readString();
    }

    public int getAccount_id() {
        return account_id;
    }
    public void setAccount_id(int account_id) {
        this.account_id = account_id;
    }
    public Double getBetrag() {
        return betrag;
    }
    public void setBetrag(Double betrag) {
        this.betrag = betrag;
    }
    public Double getBetrag_effected() {
        return betrag_effected;
    }
    public void setBetrag_effected(Double betrag_effected) {
        this.betrag_effected = betrag_effected;
    }
    public int getTaxType() {
        return taxType;
    }
    public void setTaxType(int taxType) {
        this.taxType = taxType;
    }
    public int getTax() {
        return tax;
    }
    public void setTax(int tax) {
        this.tax = tax;
    }
    public String getPostingText() {
        return postingText;
    }
    public void setPostingText(String postingText) {
        this.postingText = postingText;
    }
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(account_id);
        dest.writeDouble(betrag);
        dest.writeDouble(betrag_effected);
        dest.writeInt(taxType);
        dest.writeInt(tax);
        dest.writeString(postingText);

    }

    public static final Parcelable.Creator<SharedBooking> CREATOR = new Parcelable.Creator<SharedBooking>()
    {
        public SharedBooking createFromParcel(Parcel in)
        {
            return new SharedBooking(in);
        }
        public SharedBooking[] newArray(int size)
        {
            return new SharedBooking[size];
        }
    };

}

তথ্য পাস:

Intent intent = new Intent(getApplicationContext(),YourActivity.class);
Bundle bundle = new Bundle();
i.putParcelableArrayListExtra("data", (ArrayList<? extends Parcelable>) dataList);
intent.putExtras(bundle);
startActivity(intent);

তথ্য পুনরুদ্ধার করা হচ্ছে:

Bundle bundle = getIntent().getExtras();
dataList2 = getIntent().getExtras().getParcelableArrayList("data");

5

আমার সর্বাধিক সহজ সমাধানটি হল .. গেটরস সেটারগুলির সাথে স্থিতিশীল ডেটা সদস্যদের সাথে একটি শ্রেণি তৈরি করা।

একটি ক্রিয়াকলাপ থেকে সেট করুন এবং অন্য ক্রিয়াকলাপ থেকে পান।

ক্রিয়াকলাপ এ

mytestclass.staticfunctionSet("","",""..etc.);

ক্রিয়াকলাপ খ

mytestclass obj= mytestclass.staticfunctionGet();

1
বা ক্রিয়েটা সিরিয়ালাইজযোগ্য ক্লাস যা আপনি পাস করতে চান তা অন্য ক্রিয়াকলাপে পাস করতে।
উমার

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

1
এই উত্তরটি দরকারী তবে মেমরি এবং সংস্থান উত্সকরণের ক্ষেত্রে এর চেয়ে ভাল সমাধান নয়
অতুল ভরদ্বাজ

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

2
ডব্লিউটিএফ? অন্য দুটি উত্তর অনেক উচ্চতর।
আইসিফ্লেম

4

আপনি আপনার শ্রেণীর ধরণের অবজেক্টগুলি পাস এবং পুনরুদ্ধার করতে পুটএক্সট্রা (সিরিয়ালাইজযোগ্য ..) এবং getSerializableExtra () পদ্ধতি ব্যবহার করতে পারেন; আপনাকে আপনার শ্রেণি সিরিয়ালাইজেবল হিসাবে চিহ্নিত করতে হবে এবং নিশ্চিত করতে হবে যে আপনার সমস্ত সদস্যের ভেরিয়েবলগুলিও সিরিয়ালযোগ্যযোগ্য ...


4

অ্যান্ড্রয়েড অ্যাপ্লিকেশন তৈরি করুন

ফাইল >> নতুন >> অ্যান্ড্রয়েড অ্যাপ্লিকেশন

প্রকল্পের নাম প্রবেশ করুন: অ্যান্ড্রয়েড-পাস-অবজেক্ট-থেকে-ক্রিয়াকলাপ

প্যাকেজ: com.hmkcode.android

অন্যান্য ডিফল্ট নির্বাচনগুলি রাখুন, আপনি শেষ না হওয়া পর্যন্ত পরবর্তী যান

অ্যাপ তৈরি করার আগে আমাদের পজো ক্লাস তৈরি করতে হবে "ব্যক্তি" যা আমরা এক ক্রিয়াকলাপ থেকে অন্য ক্রিয়াকলাপে অবজেক্ট পাঠাতে ব্যবহার করব। লক্ষ করুন যে শ্রেণিটি সিরিয়ালাইজেবল ইন্টারফেস প্রয়োগ করছে।

Person.java

package com.hmkcode.android;
import java.io.Serializable;

public class Person implements Serializable{

    private static final long serialVersionUID = 1L;

    private String name;
    private int age;

        // getters & setters....

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }   
}

দুটি ক্রিয়াকলাপের জন্য দুটি বিন্যাস

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/tvName"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center_horizontal"
        android:text="Name" />

    <EditText
        android:id="@+id/etName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:ems="10" >
        <requestFocus />
    </EditText>
</LinearLayout>

<LinearLayout
     android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
<TextView
    android:id="@+id/tvAge"
    android:layout_width="100dp"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:gravity="center_horizontal"
    android:text="Age" />
<EditText
    android:id="@+id/etAge"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ems="10" />
</LinearLayout>

<Button
    android:id="@+id/btnPassObject"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="Pass Object to Another Activity" />

</LinearLayout>

activity_another.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
 >

<TextView
    android:id="@+id/tvPerson"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:layout_gravity="center"
    android:gravity="center_horizontal"
 />

</LinearLayout>

দুটি ক্রিয়াকলাপ ক্লাস

1) ActivityMain.java

package com.hmkcode.android;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity implements OnClickListener {

Button btnPassObject;
EditText etName, etAge;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btnPassObject = (Button) findViewById(R.id.btnPassObject);
    etName = (EditText) findViewById(R.id.etName);
    etAge = (EditText) findViewById(R.id.etAge);

    btnPassObject.setOnClickListener(this);
}

@Override
public void onClick(View view) {

    // 1. create an intent pass class name or intnet action name 
    Intent intent = new Intent("com.hmkcode.android.ANOTHER_ACTIVITY");

    // 2. create person object
    Person person = new Person();
    person.setName(etName.getText().toString());
    person.setAge(Integer.parseInt(etAge.getText().toString()));

    // 3. put person in intent data
    intent.putExtra("person", person);

    // 4. start the activity
    startActivity(intent);
}

}

2) AnotherActivity.java

package com.hmkcode.android;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class AnotherActivity extends Activity {

TextView tvPerson;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_another);

    // 1. get passed intent 
    Intent intent = getIntent();

    // 2. get person object from intent
    Person person = (Person) intent.getSerializableExtra("person");

    // 3. get reference to person textView 
    tvPerson = (TextView) findViewById(R.id.tvPerson);

    // 4. display name & age on textView 
    tvPerson.setText(person.toString());

}
}

4

গুগলের জিসন লাইব্রেরি ব্যবহার করে আপনি অন্য ক্রিয়াকলাপে বস্তুটি পাস করতে পারেন ctআসলে আমরা জসন স্ট্রিং আকারে অবজেক্টটিকে রূপান্তর করব এবং অন্যান্য ক্রিয়াকলাপে যাওয়ার পরে আমরা আবার এই জাতীয় বস্তুতে রূপান্তর করব object

এটির মতো বিন বিন্যাস বিবেচনা করুন

 public class Example {
    private int id;
    private String name;

    public Example(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

আমাদের উদাহরণ ক্লাসের অবজেক্টটি পাস করতে হবে

Example exampleObject=new Example(1,"hello");
String jsonString = new Gson().toJson(exampleObject);
Intent nextIntent=new Intent(this,NextActivity.class);
nextIntent.putExtra("example",jsonString );
startActivity(nextIntent);

পড়ার জন্য আমাদের NextActivity এ বিপরীত অপারেশন করা দরকার

 Example defObject=new Example(-1,null);
    //default value to return when example is not available
    String defValue= new Gson().toJson(defObject);
    String jsonString=getIntent().getExtras().getString("example",defValue);
    //passed example object
    Example exampleObject=new Gson().fromJson(jsonString,Example .class);

গ্রেড এ এই নির্ভরতা যুক্ত করুন

compile 'com.google.code.gson:gson:2.6.2'


3

আমি জানি এটি দেরি হয়ে গেছে তবে এটি খুব সাধারণ you আপনারা যা করেছেন তা আপনার শ্রেণিকে সিরিয়ালাইজযোগ্য পছন্দ মতো প্রয়োগ করতে দিন

public class MyClass implements Serializable{

}

তারপরে আপনি যেমন একটি উদ্দেশ্য যেতে পারেন

Intent intent=......
MyClass obje=new MyClass();
intent.putExtra("someStringHere",obje);

এটি পেতে আপনি সহজ কল

MyClass objec=(MyClass)intent.getExtra("theString");

2

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

ক্রিয়াকলাপ 1:

Intent intent = new Intent(getApplicationContext(), Activity2.class);
service.setSavedOrder(order);
startActivity(intent);

ক্রিয়াকলাপ 2:

private Service service;
private Order order;

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

    service = Service.getInstance();
    order = service.getSavedOrder();
    service.setSavedOrder(null) //If you don't want to save it for the entire session of the app.
}

সেবা:

private static Service instance;

private Service()
{
    //Constructor content
}

public static Service getInstance()
{
    if(instance == null)
    {
        instance = new Service();
    }
    return instance;
}
private Order savedOrder;

public Order getSavedOrder()
{
    return savedOrder;
}

public void setSavedOrder(Order order)
{
    this.savedOrder = order;
}

এই সমাধানটির কোনও প্রশ্নের ক্রমিক বা অন্য কোনও "প্যাকেজিং" দরকার নেই। তবে এটি কেবল তখনই উপকারী হবে যদি আপনি যেভাবে এই ধরণের আর্কিটেকচার ব্যবহার করছেন।


এই পদ্ধতির ডাউনসাইডগুলি কী কী? এটি এত যুক্তিযুক্ত এবং স্লিম বলে মনে হচ্ছে। আমি সর্বদা পড়ি আপনার এমনটি করা উচিত নয় তবে কী ভুল হতে পারে সে সম্পর্কে আমি কখনই একটি ভাল ব্যাখ্যা পাই না।
মার্কাস

যেহেতু আমি আমার মন্তব্যটি আর সম্পাদনা করতে পারছি না: অনুলিপিটির পরিবর্তে কোনও অবজেক্টের রেফারেন্স পাওয়ার এটিই কি একমাত্র সম্ভাব্য সমাধান নয়? আমার একই প্রতিপত্তি পুনরুদ্ধার করতে হবে এবং একটি অনুলিপিও নয়!
মার্কাস

আমি মনে করি এটি উচ্চতর সংশ্লেষের কারণে কিছুটা নিরুৎসাহিত হয়েছে। তবে হ্যাঁ, যতদূর আমি দেখতে পাচ্ছি, আপনার যদি সত্যিকারের অবজেক্টের প্রয়োজন হয় তবে এই পদ্ধতিটি সবচেয়ে কার্যকর। প্রোগ্রামিংয়ে সর্বদা হিসাবে, আপনি যা খুশি তা করতে পারেন, আপনি কেবল এটি সাবধানতার সাথে করতে চান। এই সমাধানটি আমার পক্ষে কাজ করেছে এবং আমি এটিকে পছন্দ করি যেহেতু যেভাবেই আমি এই আর্কিটেকচারটি ব্যবহার করি।
কিতালদা

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

2

বস্তু পার্সেল করার সবচেয়ে সহজ উপায় আইএমএইচও। আপনি যে অংশটিকে পার্সেবল করতে চান তার উপরে আপনি কেবল একটি টীকা ট্যাগ যুক্ত করুন।

লাইব্রেরির একটি উদাহরণ https://github.com/johncarl81/parceler এর নীচে

@Parcel
public class Example {
    String name;
    int age;

    public Example(){ /*Required empty bean constructor*/ }

    public Example(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public String getName() { return name; }

    public int getAge() { return age; }
}

2

প্রথমে আপনার ক্লাসে পার্সেবল প্রয়োগ করুন । তারপরে এভাবে অবজেক্টটি পাস করুন।

SendActivity.java

ObjectA obj = new ObjectA();

// Set values etc.

Intent i = new Intent(this, MyActivity.class);
i.putExtra("com.package.ObjectA", obj);

startActivity(i);

ReceiveActivity.java

Bundle b = getIntent().getExtras();
ObjectA obj = b.getParcelable("com.package.ObjectA");

প্যাকেজ স্ট্রিং প্রয়োজনীয় নয়, উভয় ক্রিয়াকলাপে কেবল স্ট্রিং একই হওয়া দরকার

REFERENCE,


2

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

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

2

কোল্টিনে

আপনার বিল্ড.gradle এ কোটলিন এক্সটেনশন যুক্ত করুন।

apply plugin: 'kotlin-android-extensions'

android {
    androidExtensions {
        experimental = true
   }
}

তারপরে আপনার ডেটা ক্লাসটি তৈরি করুন।

@Parcelize
data class Sample(val id: Int, val name: String) : Parcelable

উদ্দেশ্য সহ উদ্দেশ্য পাস করুন

val sample = Sample(1,"naveen")

val intent = Intent(context, YourActivity::class.java)
    intent.putExtra("id", sample)
    startActivity(intent)

অভিপ্রায় সহ বস্তু পান

val sample = intent.getParcelableExtra("id")

এটি কি এখনও পরীক্ষামূলক?
শেডটিড

2

করার সহজ এবং জাভা উপায় হ'ল: আপনার পোজো / মডেল শ্রেণিতে সিরিয়ালাইজযোগ্য প্রয়োগ করুন

পারফরম্যান্স দেখার জন্য অ্যান্ড্রয়েডের জন্য প্রস্তাবিত: মডেলকে পার্সেবলযোগ্য করুন


1

সবচেয়ে সহজ হ'ল আইটেমটি একটি স্ট্রিং যেখানে নিম্নলিখিতটি ব্যবহার করা হবে:

intent.putextra("selected_item",item)

প্রাপ্তির জন্য:

String name = data.getStringExtra("selected_item");

3
এটি কেবল স্ট্রিং, পূর্ণসংখ্যা এবং ইত্যাদির জন্য তবে আমি অবজেক্টটি চাই এবং স্ট্যাটিক অবজেক্টটি এটিই সম্ভব possible
উমার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.