অ্যানড্রয়েডে কোনও ক্রিয়াকলাপ থেকে অন্য ক্রিয়াকলাপে কীভাবে পাস করবেন


777

আমি আমার গ্রাহক শ্রেণীর একটি জিনিস একটি থেকে প্রেরণ Activityকরে অন্যটিতে প্রদর্শন করার চেষ্টা করছি Activity

গ্রাহক শ্রেণীর জন্য কোড:

public class Customer {

    private String firstName, lastName, Address;
    int Age;

    public Customer(String fname, String lname, int age, String address) {

        firstName = fname;
        lastName = lname;
        Age = age;
        Address = address;
    }

    public String printValues() {

        String data = null;

        data = "First Name :" + firstName + " Last Name :" + lastName
        + " Age : " + Age + " Address : " + Address;

        return data;
    }
}

আমি এর বস্তুটি এক Activityথেকে অন্যটিতে প্রেরণ করতে চাই এবং তারপরে অন্যটিতে ডেটা প্রদর্শন করতে চাই Activity

আমি কীভাবে এটি অর্জন করতে পারি?


1
সম্ভবত আপনার জনমত বিবেচনায় গ্রহণযোগ্য উত্তর পরিবর্তন করা উচিত।
রোহিত ভিপিন ম্যাথিউজ

আমি প্যাসেবল বা সিরিয়ালাইজেবলের জন্য অবজেক্ট সেট করতাম, তবে আমি যখনই অন্যান্য ভেরিয়েবলগুলি যুক্ত করি তখন প্যাসেবল বা সিরিয়ালাইজেবলের জন্য সেট করতে এবং ফাংশনগুলিতে আমাকে এগুলি যুক্ত করতে হবে। তাই আমি ক্রিয়াকলাপ এবং টুকরাগুলির মধ্যে স্থানান্তর করতে ডেটাচ্যাচ তৈরি করেছি। github.com/kimkevin/AndroidDataCache অবজেক্ট স্থানান্তর করা অত্যন্ত সহজ।
কিমকভিন

উত্তর:


886

একটি বিকল্প হতে পারে আপনার কাস্টম ক্লাসটি Serializableইন্টারফেসটি প্রয়োগ করতে দেয় এবং তারপরে আপনি পদ্ধতির putExtra(Serializable..)বৈকল্পিকটি ব্যবহার করে অতিরিক্ত উদ্দেশ্যে অভিপ্রায় দৃষ্টান্তটি পাস করতে পারেন Intent#putExtra()

সিউডোকোড :

//To pass:
intent.putExtra("MyClass", obj);

// To retrieve object in second Activity
getIntent().getSerializableExtra("MyClass");

দ্রষ্টব্য: নিশ্চিত করুন যে আপনার মূল কাস্টম শ্রেণীর প্রতিটি নেস্টেড বর্গ কোনও সিরিয়ালাইজেশন ব্যতিক্রম এড়াতে সিরিয়ালাইজযোগ্য ইন্টারফেস প্রয়োগ করেছে। উদাহরণ স্বরূপ:

class MainClass implements Serializable {

    public MainClass() {}

    public static class ChildClass implements Serializable {

        public ChildClass() {}
    }
}

126
@ ওডি: আমার প্রতিরক্ষার পক্ষে আমি কখনও বলিনি যে এটি সর্বোত্তম বিকল্প ছিল; ওপি কেবল বিকল্পগুলির জন্য জিজ্ঞাসা করেছিল এবং আমি একটি পরামর্শ দিয়েছিলাম। যাইহোক, ধন্যবাদ.
সামুহ

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

16
@Sander: এই উত্তর (Is stackoverflow.com/questions/2139134/... ) ভুল তারপর? তিনি বলেছেন যে Parcelable আইএস বিশেষভাবে সেই উদ্দেশ্যে (এবং এর চেয়ে অনেক বেশি দ্রুত Serializable) জন্য ডিজাইন করা হয়েছে । আমি বিভ্রান্ত
স্লুমা

41
Parcelableগতির পক্ষে ভাল হতে পারে তবে এটি কার্যকর করা জটিল। আপনার যদি ক্রিয়াকলাপগুলির মধ্যে পাস করার জন্য আপনার 8 টি অবজেক্ট থাকে তবে আপনি কি প্রতিটি তৈরি করতে চলেছেন Parcelable? Serializableপরিবর্তে এটি ব্যবহার করতে আরও বুদ্ধিমান হবে। আপনি যখন প্রয়োগ করেন তখন আপনাকে Parcelableক্লাসে প্রচুর কোড যুক্ত করতে হবে এবং ক্ষেত্রগুলিকে খুব নির্দিষ্ট পদ্ধতিতে অর্ডার করতে হবে; Serializableআপনি না। শেষ পর্যন্ত, আমি মনে করি এটি নেমে আসে যে আপনি কতটি বস্তুটি পাস করছেন এবং আপনি কী করার চেষ্টা করছেন।
ব্ল্যাকহ্যাটসামুরাই

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

311

সিরিয়ালাইজেবল সহ আপনার শ্রেণি প্রয়োগ করুন। ধরা যাক এটি আপনার সত্তা শ্রেণি:

import java.io.Serializable;

@SuppressWarnings("serial") //With this annotation we are going to hide compiler warnings
public class Deneme implements Serializable {

    public Deneme(double id, String name) {
        this.id = id;
        this.name = name;
    }

    public double getId() {
        return id;
    }

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

    public String getName() {
        return this.name;
    }

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

    private double id;
    private String name;
}

আমরা deneএক্স ক্রিয়াকলাপ থেকে ওয়াই ক্রিয়াকলাপে কল করা অবজেক্টটি প্রেরণ করছি । কোথাও এক্স ক্রিয়াকলাপে;

Deneme dene = new Deneme(4,"Mustafa");
Intent i = new Intent(this, Y.class);
i.putExtra("sampleObject", dene);
startActivity(i);

ওয়াই ক্রিয়াকলাপে আমরা বস্তুটি পাচ্ছি।

Intent i = getIntent();
Deneme dene = (Deneme)i.getSerializableExtra("sampleObject");

এটাই.


1
এটা আমার জন্য সত্যিই সহায়ক ছিল। ধন্যবাদ ... তবে পাস করা অবজেক্টটি গ্রহণ করার সময় সিনট্যাক্সটি হওয়া উচিত [Deneme dene = (Deneme) i.getSerializableExtra ("saltObject"); ] ... তাই কি ???
JibW

1
@ মোস্তফাগেভেন তবে আমি তা করেই পাচ্ছি classCastException: java.lang.Long। আপনি দয়া করে কেন ব্যাখ্যা করতে পারেন?
শাজিল আফজাল

আমার উত্তরের সাথে কোনও সম্পর্ক নেই। এটি আপনি যে খুব ভিন্ন জিনিস পাচ্ছেন তা। আপনি কি আপনার কোডগুলি ভাগ করতে পারেন?
মোস্তফা গেভেন

1
বৃহত্তর POJOs এর জন্য সিরিয়ালযোগ্যযোগ্য খুব ধীর is একটি বাস ব্যবহার করা আরও অনেক ভাল প্যাটার্ন।
স্টিভন মার্ক ফোর্ড

1
আমার কেন (Serializable)অবজেক্টটির উপসর্গ করতে হবে?
অ্যালস্টন

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

আপনি এই সাইটটি ব্যবহার করে আপনার শ্রেণীর জন্য পার্সেবল কোড তৈরি করতে পারেন ।


4
যদি আমার অবজেক্টে নেস্টেড অ্যারেলিস্ট থাকে?
ডাঃ এএনড্রো ২

10
ভাল তবে সম্ভবত একটি লবণ ইমো এর দানা সঙ্গে "পারফরম্যান্স" নেওয়া উচিত। যদি তা বাস্তবায়নের মূল্যে আসে Parcelableতবে আমি বরং আমার পোগো ক্লাসগুলি অ্যান্ড্রয়েড-অজোনস্টিক এবং ব্যবহার করে রাখব Serializable
ভিএইচ-এনজেডজেড

আপনার পার্সেবল ব্যবহার করা উচিত বলে আমি সম্মত নই। একটি সহজ বুস প্যাটার্ন রানটাইমে অনেক বেশি দক্ষ এবং ডেভ টাইমের একটি হ্যাক সংরক্ষণ করে।
স্টিভন মার্ক ফোর্ড

15
এই বেঞ্চমার্ক মতে bitbucket.org/afrishman/androidserializationtest Serializable অনেক দ্রুত Parcelable চেয়ে। পার্সেবল সম্পর্কে এই 5 বছরের পুরানো বাজে ভাগ করে নেওয়া বন্ধ করুন।
আফ্রিশ

7
কীভাবে গ্লোবাল স্ট্যাটিক ভেরিয়েবলগুলি "ভাল সফ্টওয়্যার ইঞ্জিনিয়ারিং অনুশীলন নয়"? আপনি সিঙ্গলটন ক্যাশে এবং / অথবা ডেটা গ্রিডের মতো কিছু করতে পারেন তারপরে আইডি বা এর অনুরূপ পাস করতে পারেন। আপনি যখন জাভাতে রেফারেন্সের কাছাকাছি চলে আসবেন আপনি কোনওভাবেই একই অর্থে বিশ্বব্যাপী স্ট্যাটিক ভেরিয়েবলগুলি ব্যবহার করছেন যখন তারা একই বস্তুটির দিকে নির্দেশ করছেন।
ব্রেকলাইন

111

আপনার বস্তুটি JSON এ রূপান্তর করতে এবং উদ্দেশ্য হিসাবে এটি পাস করার জন্য gson ব্যবহার করুন । নতুন ক্রিয়াকলাপে JSON কে একটি বস্তুতে রূপান্তর করুন।

আপনার মধ্যে build.gradleএটি আপনার নির্ভরতা যুক্ত করুন

implementation 'com.google.code.gson:gson:2.8.4'

আপনার ক্রিয়াকলাপে, অবজেক্টটিকে জসন-স্ট্রিংয়ে রূপান্তর করুন:

Gson gson = new Gson();
String myJson = gson.toJson(vp);
intent.putExtra("myjson", myjson);

আপনার প্রাপ্তির ক্রিয়াকলাপে, জসন-স্ট্রিংটিকে মূল বস্তুকে আবার রূপান্তর করুন:

Gson gson = new Gson();
YourObject ob = gson.fromJson(getIntent().getStringExtra("myjson"), YourObject.class);

জন্য Kotlin এটা বেশ একই

তথ্য পাস

val gson = Gson()
val intent = Intent(this, YourActivity::class.java)
intent.putExtra("identifier", gson.toJson(your_object))
startActivity(intent)

তথ্য গ্রহণ করুন

val gson = Gson()
val yourObject = gson.fromJson<YourObject>(intent.getStringExtra("identifier"), YourObject::class.java)

3
এটি একটি ওভারকিল, জসন হ'ল জসনকে স্ট্রিং সিরিয়ালাইজেশনের একধরনের সিরিয়ালাইজেবল বা প্যারাকেবল প্রয়োগ করা আরও ভাল।
জেমস রোয়েটার

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

4
আমি জিএসএন ব্যবহারেরও পরামর্শ দেব কারণ গসন উপরের পাশাপাশি অ্যারেলিস্টগুলিও সিরিয়াল করতে পারে।
nurbasemetey

4
এটা অসাধারণ! আমার ক্ষেত্রে, আমি একটি লাইব্রেরি ব্যবহার করছি যা অবজেক্টগুলি সিরিয়ালাইজযোগ্য বা পার্সেলেবল কার্যকর করে না। সুতরাং এটি আমার একমাত্র বিকল্প আফাইক
চাদ বিংহাম

2
এটি "সেরা" বিকল্প। কিছু শ্রেণি এত সহজ, আপনার ক্রমিকায়িতযোগ্য প্রয়োগ করে তাদের বাস্তবায়নকে জটিল করার দরকার নেই
ওজনুগা জুড ওচালিফু

98

কোনও ক্রিয়াকলাপ কল করার সময়

Intent intent = new Intent(fromClass.this,toClass.class).putExtra("myCustomerObj",customerObj);

ToClass.java এ ক্রিয়াকলাপ গ্রহণ করুন

Customer customerObjInToClass = getIntent().getExtras().getParcelable("myCustomerObj");

গ্রাহক শ্রেণি পার্সেবল প্রয়োগ করে তা নিশ্চিত করুন ments

public class Customer implements Parcelable {

    private String firstName, lastName, address;
    int age;

    /* all your getter and setter methods */

    public Customer(Parcel in ) {
        readFromParcel( in );
    }

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
        public LeadData createFromParcel(Parcel in ) {
            return new Customer( in );
        }

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


    @Override
    public void writeToParcel(Parcel dest, int flags) {

        dest.writeString(firstName);
        dest.writeString(lastName);
        dest.writeString(address);
        dest.writeInt(age);
    }

    private void readFromParcel(Parcel in ) {

        firstName = in .readString();
        lastName  = in .readString();
        address   = in .readString();
        age       = in .readInt();
    }

অধবন, আমি একটি প্রশ্ন পেয়েছি। আপনি যখন প্রথম ইনসেন্ট ক্লাস তৈরি করেন, আপনি ক্লাস.থেকে প্রথম আর্গুমেন্ট হিসাবে পাস করেন। গ্রাহক ক্রিয়াকলাপ শ্রেণিতে এই বিষয়টিকে পুনরুদ্ধার করার কোনও উপায় আছে?
নিউম্যান

1
মিলিউ, fromClass fr = (fromClass) getParent (); এই আপনার কি প্রয়োজন?
বিজ্ঞাপন

অধব, আমি আসলে এটি করেছি, তবে এফ শূন্য। কোন ধারণা কেন?
নিউম্যান

মিলি, দয়া করে আপনার ব্যতিক্রমগুলি এটি ভাগ করে নিন যা আমরা এটি সন্ধান করতে পারি।
বিজ্ঞাপনগুলি

পার্সেলেবলের প্রচুর পরিমাণে বয়লারের প্লেট কোডের একটি হ্যাক রয়েছে এবং বেশ স্পষ্টভাবে সময় নষ্ট করা। বরং একটি বাস ব্যবহার করুন। নীচে আমার পোস্ট দেখুন।
স্টিভেন মার্ক ফোর্ড

89

আমার অভিজ্ঞতায় তিনটি প্রধান সমাধান রয়েছে যার প্রতিটি তার অসুবিধা এবং সুবিধা রয়েছে:

  1. পার্সেবল কার্যকর করা হচ্ছে

  2. ক্রিয়াকলাপযোগ্য কার্যকর করা হচ্ছে

  3. কোনও ধরণের হালকা ওজনের ইভেন্টের বাস লাইব্রেরি ব্যবহার করে (উদাহরণস্বরূপ, গ্রিনরোবটের ইভেন্টবাস বা স্কোয়ারের অটো)

পার্সেলেবল - দ্রুত এবং অ্যান্ড্রয়েড স্ট্যান্ডার্ড, তবে এতে প্রচুর পরিমাণে বয়লারপ্লেট কোড রয়েছে এবং অভিপ্রায়গুলির মানগুলিকে টানানোর সময় রেফারেন্সের জন্য হার্ড-কোডেড স্ট্রিংগুলির প্রয়োজন (অ- দৃ strongly়ভাবে টাইপ করা হয়নি)।

সিরিয়ালাইজযোগ্য - শূন্য বয়লারপ্লেটের কাছাকাছি, তবে এটি সবচেয়ে ধীর পদ্ধতির এবং অভিপ্রায় মানগুলি টেনে আনার সময় কঠোর কোডেড স্ট্রিংগুলিরও প্রয়োজন (অ-দৃ strongly়ভাবে টাইপ করা)।

ইভেন্ট বাস - শূন্য বয়লারপ্লেট, দ্রুততম পদ্ধতির, এবং হার্ড-কোডেড স্ট্রিংগুলির প্রয়োজন হয় না, তবে এটির জন্য অতিরিক্ত নির্ভরতা প্রয়োজন (যদিও সাধারণত হালকা ওজনের, 40 ডলার)

দক্ষতা মানদণ্ড সহ আমি এই তিনটি পদ্ধতির চারপাশে খুব বিস্তারিত তুলনা পোস্ট করেছি।


4
নিবন্ধটির লিঙ্কটি মারা গেছে। এখনও ওয়েবআরচাইভে
অলিভিয়ারএইচ

লজ্জাজনক যে লিংকটি নিচে রয়েছে :(
মউকার

ইভেন্ট বাস ব্যবহারের সমস্যাটি যখন লক্ষ্য ক্রিয়াকলাপটি ঘূর্ণনের কারণে পুনরায় তৈরি করা হয়। এক্ষেত্রে লক্ষ্য ক্রিয়াকলাপটি পাস করা অবজেক্টে অ্যাক্সেস পায় না কারণ পূর্ববর্তী কল করে এই বস্তুটি বাস থেকে গ্রাস করা হয়েছিল।
জুলিয়াসজেজে

1
পার্সেলেবল দ্রুততম এবং এই জেনারেটরের ( পার্সেবলার ডট কম ) দিয়ে আপনি নিজের ক্লাসটি পেস্ট করতে পারেন এবং এটি আপনার জন্য কোড তৈরি করতে পারে। সহজ।
বাইওয়ালিদ

1
@ বাইওয়ালিদ ... আমি একেবারে একমত, আমি সর্বদা এই সাইটটি ব্যবহার করি, কোনও হ্যাসেল ছাড়াই স্টাফ তৈরি করি। যাইহোক, আমি অনেকগুলি ব্যর্থ চেষ্টা করেছি, যখন আমি কোনও POJO ব্যবহার করার চেষ্টা করি যা অন্য কোনও অবজেক্টের সমন্বয়ে গঠিত। কিছু কারণে এর আউট পুট সত্যিই কাজ করে না।
ইয়ো অ্যাপস

42

আমি একটি সহজ এবং মার্জিত পদ্ধতি পেয়েছি:

  • কোন পার্সলেবল
  • কোন সিরিয়ালাইজযোগ্য
  • কোনও স্থির ক্ষেত্র নেই
  • ইভেন্ট বাস নেই

পদ্ধতি 1

প্রথম ক্রিয়াকলাপের জন্য কোড:

    final Object objSent = new Object();
    final Bundle bundle = new Bundle();
    bundle.putBinder("object_value", new ObjectWrapperForBinder(objSent));
    startActivity(new Intent(this, SecondActivity.class).putExtras(bundle));        
    Log.d(TAG, "original object=" + objSent);

দ্বিতীয় ক্রিয়াকলাপের কোড:

    final Object objReceived = ((ObjectWrapperForBinder)getIntent().getExtras().getBinder("object_value")).getData();
    Log.d(TAG, "received object=" + objReceived);

আপনি খুঁজে পাবেন objSentএবং objReceivedএকই পাবেন hashCode, তাই তারা অভিন্ন।

তবে কেন আমরা এইভাবে কোনও জাভা বস্তুটি পাস করতে পারি?

প্রকৃতপক্ষে, অ্যান্ড্রয়েড বাইন্ডার জাভা অবজেক্টের জন্য বিশ্বব্যাপী জেএনআই রেফারেন্স তৈরি করবে এবং এই জাভা অবজেক্টের কোনও রেফারেন্স না থাকলে এই বিশ্বব্যাপী জেএনআই রেফারেন্স প্রকাশ করবে। বাইন্ডার বাইন্ডার অবজেক্টে এই বিশ্বব্যাপী জেএনআই রেফারেন্সটি সংরক্ষণ করবে।

* সতর্কতা: এই পদ্ধতিটি কেবলমাত্র তখনই কাজ করে, যদি না দুটি কার্যক্রম একই প্রক্রিয়াতে চালিত হয়, না হলে (অবজেক্টরেপ্পারবাইন্ডার) getIntent ()। GetExtras ()। GetBinder ("অবজেক্ট_ভ্যালু") * এ ক্লাসকাস্টএক্সপশন নিক্ষেপ করুন *

বর্গ অবজেক্টরেপ্পারবাইন্ডার সংজ্ঞা

public class ObjectWrapperForBinder extends Binder {

    private final Object mData;

    public ObjectWrapperForBinder(Object data) {
        mData = data;
    }

    public Object getData() {
        return mData;
    }
}

পদ্ধতি 2

  • প্রেরকের জন্য,
    1. আপনার জাভা অবজেক্টটিকে জেএনআই গ্লোবাল রেফারেন্স সারণিতে যুক্ত করতে কাস্টম নেটিভ পদ্ধতিটি ব্যবহার করুন (জেএনআইএনএনভি :: নিউগ্লোবালআরফের মাধ্যমে)
    2. রিটার্ন পূর্ণসংখ্যা (প্রকৃতপক্ষে, জেএনআইএনভি :: নিউগ্লোবালআরফ রিটার্ন জবজেক্ট, যা একটি পয়েন্টার, আমরা এটি নিরাপদে ইন্টিতে ফেলে দিতে পারি) আপনার ইন্টেন্টে (ইনটেন্ট :: পুটেক্সট্রার মাধ্যমে)
  • গ্রহীতার জন্য
    1. ইন্টেন্ট থেকে পূর্ণসংখ্যা পান (ইন্টেন্ট :: getInt এর মাধ্যমে)
    2. JNI গ্লোবাল রেফারেন্স টেবিল থেকে আপনার জাভা অবজেক্টটি পুনরুদ্ধার করতে কাস্টম নেটিভ পদ্ধতি ব্যবহার করুন (JNIEnv :: NewLocalRef এর মাধ্যমে)
    3. জেএনআই গ্লোবাল রেফারেন্স টেবিল থেকে আইটেমটি সরান (জেএনআইইএনভি :: মুছুন গ্লোবালআরফের মাধ্যমে),

তবে পদ্ধতি 2 এর একটি সামান্য তবে গুরুতর সমস্যা রয়েছে, যদি রিসিভার জাভা বস্তুটি পুনরুদ্ধার করতে ব্যর্থ হয় (উদাহরণস্বরূপ, জাভা বস্তু পুনরুদ্ধার করার আগে কিছু ব্যতিক্রম ঘটে, বা রিসিভার ক্রিয়াকলাপের অস্তিত্ব নেই) তবে জাভা বস্তুটি হয়ে যাবে এতিম বা মেমরি ফাঁস, পদ্ধতি 1 এ এই সমস্যাটি নেই, কারণ অ্যান্ড্রয়েড বাইন্ডার এই ব্যতিক্রমটি পরিচালনা করবে

পদ্ধতি 3

জাভা অবজেক্টকে দূর থেকে অনুরোধ করার জন্য, আমরা জাভা অবজেক্টটি বর্ণনা করার জন্য একটি ডেটা চুক্তি / ইন্টারফেস তৈরি করব, আমরা এইডিল ফাইলটি ব্যবহার করব

IDataContract.aidl

package com.example.objectwrapper;
interface IDataContract {
    int func1(String arg1);
    int func2(String arg1);
}

প্রথম ক্রিয়াকলাপের জন্য কোড

    final IDataContract objSent = new IDataContract.Stub() {

        @Override
        public int func2(String arg1) throws RemoteException {
            // TODO Auto-generated method stub
            Log.d(TAG, "func2:: arg1=" + arg1);
            return 102;
        }

        @Override
        public int func1(String arg1) throws RemoteException {
            // TODO Auto-generated method stub
            Log.d(TAG, "func1:: arg1=" + arg1);
            return 101;
        }
    };
    final Bundle bundle = new Bundle();
    bundle.putBinder("object_value", objSent.asBinder());
    startActivity(new Intent(this, SecondActivity.class).putExtras(bundle));
    Log.d(TAG, "original object=" + objSent);

দ্বিতীয় ক্রিয়াকলাপের কোড:

দ্বিতীয় ক্রিয়াকলাপ অন্য কোনও প্রক্রিয়াতে চলছে তা নিশ্চিত করার জন্য অ্যান্ড্রয়েড: প্রক্রিয়া বৈশিষ্ট্যটি অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলকে একটি খালি নয় প্রক্রিয়া নামে পরিবর্তন করুন

    final IDataContract objReceived = IDataContract.Stub.asInterface(getIntent().getExtras().getBinder("object_value"));
    try {
        Log.d(TAG, "received object=" + objReceived + ", func1()=" + objReceived.func1("test1") + ", func2()=" + objReceived.func2("test2"));
    } catch (RemoteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

এই পদ্ধতিতে, আমরা দুটি ক্রিয়াকলাপের মধ্যে পৃথক প্রক্রিয়া চলাকালীন দুটি ক্রিয়াকলাপের মধ্যে একটি ইন্টারফেস পাস করতে পারি এবং ইন্টারফেস পদ্ধতিটিকে দূর থেকে কল করতে পারি

পদ্ধতি 4

পদ্ধতি 3 যথেষ্ট সহজ বলে মনে হচ্ছে না কারণ আমাদের অবশ্যই একটি সহায়তা ইন্টারফেস প্রয়োগ করতে হবে। আপনি যদি কেবল সাধারণ কাজটি করতে চান এবং পদ্ধতিটির ফেরতের মান অপ্রয়োজনীয় হয়, আমরা android.os.Mesender ব্যবহার করতে পারি

প্রথম ক্রিয়াকলাপের জন্য প্রেরক (প্রেরক):

public class MainActivity extends Activity {
    private static final String TAG = "MainActivity";

    public static final int MSG_OP1 = 1;
    public static final int MSG_OP2 = 2;

    public static final String EXTRA_MESSENGER = "messenger";

    private final Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            Log.e(TAG, "handleMessage:: msg=" + msg);
            switch (msg.what) {
            case MSG_OP1:

                break;
            case MSG_OP2:
                break;

            default:

                break;
            }
            super.handleMessage(msg);
        }

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

        startActivity(new Intent(this, SecondActivity.class).putExtra(EXTRA_MESSENGER, new Messenger(mHandler)));
    }
}

দ্বিতীয় ক্রিয়াকলাপের জন্য কোড (রিসিভার):

public class SecondActivity extends Activity {

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

        final Messenger messenger = getIntent().getParcelableExtra(MainActivity.EXTRA_MESSENGER);
        try {
            messenger.send(Message.obtain(null, MainActivity.MSG_OP1, 101, 1001, "10001"));
            messenger.send(Message.obtain(null, MainActivity.MSG_OP2, 102, 1002, "10002"));
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

সমস্ত ম্যাসেঞ্জার.সেন্ড হ'ল হ্যান্ডলারের মধ্যে সংযোজনীয় এবং ক্রমানুসারে কার্যকর করা হবে।

আসলে, অ্যান্ড্রয়েড.ওস.ম্যাসেঞ্জার হ'ল একটি সহায়তা ইন্টারফেসও যদি আপনার অ্যান্ড্রয়েড সোর্স কোড থাকে তবে আপনি IMesender.aidl নামের একটি ফাইল খুঁজে পেতে পারেন

package android.os;

import android.os.Message;

/** @hide */
oneway interface IMessenger {
    void send(in Message msg);
}

দুঃখিত আমি আপনার উত্তর আবদ্ধ ছিল তা দেখতে পাইনি পাশাপাশি আমি অনুভব করি যে আপনার উত্তরটিও খুব মার্জিত।
SkidRunner

বাহ .... এই লোকটির 1 ম পদ্ধতিটি দুর্দান্ত ... যখন আপনার খুব বড় / বড় আকারের অবজেক্ট থাকে যা ভালভাবে কাজ করে
karan

আমি ব্যবহারকারী পদ্ধতি এক। সুতরাং, আপনি আমার সময় বাঁচান। ধন্যবাদ;
ShweLiam

অবজেক্টওয়্যার্পোরবিন্দু পদ্ধতিটির জন্য অনেক ধন্যবাদ, সত্যই সহায়তা করে!
ভ্লাদিমির তোলস্টিকভ

40

আপনি বস্তুর ডেটা অস্থায়ী স্ট্রিংস এবং ইনসগুলিতেও লিখতে পারেন এবং এটিকে ক্রিয়াকলাপে প্রেরণ করতে পারেন। অবশ্যই এইভাবে, আপনি ডেটা ট্রান্সপোর্টেড পাবেন, তবে এটি নিজেই নয়।

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

String fName_temp   = yourObject.getFname();
String lName_temp   = yourObject.getLname();
String age_temp     = yourObject.getAge();
String address_temp = yourObject.getAddress();

Intent i = new Intent(this, ToClass.class);
i.putExtra("fname", fName_temp);
i.putExtra("lname", lName_temp);
i.putExtra("age", age_temp);
i.putExtra("address", address_temp);

startActivity(i);

আপনি এগুলি টেম্প ইভারগুলির পরিবর্তে সরাসরি পাঠাতে পারেন, তবে এইভাবে এটি আমার মতে পরিষ্কার। অতিরিক্তভাবে, আপনি টেম্প আইভারগুলি নালায় সেট করতে পারেন যাতে তাড়াতাড়ি গারবেজ সংগ্রহকারী দ্বারা পরিষ্কার করা যায়।

শুভকামনা!

পার্শ্ব নোটে: নিজের মুদ্রণ পদ্ধতিটি লেখার পরিবর্তে টু স্ট্রিং () ওভাররাইড করুন।

নীচের মন্তব্যে উল্লিখিত হিসাবে, আপনি অন্য ক্রিয়ায় এভাবেই আপনার ডেটা ফিরে পাবেন:

String fName = getIntent().getExtras().getInt("fname");

9
আপনার ডেটা আবার এটির সাথে ফিরে পান: স্ট্রিং এফনাম = গেইট ইন্টেন্ট () get
Alister

2
ডেটা ফেরত পেতে: Bundle extras = getIntent().getExtras(); String val = extras.getString("fname");
এরিক লেসচিনস্কি

1
এটি বৃহত্তর POJO- এর জন্য দ্রুত অক্ষম হয়ে উঠতে পারে। বরং একটি বাস ব্যবহার করুন। নীচে আমার পোস্ট দেখুন।
স্টিভন মার্ক ফোর্ড

যেমনটি আমি আমার উত্তরে উল্লেখ করেছি, এটি সাধারণ ব্যবহারের ক্ষেত্রে যেখানে আপনাকে নিজেরাই অবজেক্টের প্রয়োজন হয় না, কেবল এটির কিছু মান থাকে। জটিল ব্যবহারের ক্ষেত্রে ক্ষয়রূপ হওয়া উচিত নয় ment
এমজেবি

1
একটি একক বস্তু পাস করার জন্য ভাল ধারণা, তবে আমি আমার অবজেক্টের অজানা আকারের একটি অ্যারে পাস করার চেষ্টা করছি। সম্ভবত আপনার সমাধান অবজেক্ট অ্যারে পাস করার জন্য নয়।
মুহাম্মদ সাকিব

25

আমি একটি সিঙ্গলটন হেল্পার ক্লাস তৈরি করেছি যা অস্থায়ী জিনিসগুলি ধারণ করে।

public class IntentHelper {

    private static IntentHelper _instance;
    private Hashtable<String, Object> _hash;

    private IntentHelper() {
        _hash = new Hashtable<String, Object>();
    }

    private static IntentHelper getInstance() {
        if(_instance==null) {
            _instance = new IntentHelper();
        }
        return _instance;
    }

    public static void addObjectForKey(Object object, String key) {
        getInstance()._hash.put(key, object);
    }

    public static Object getObjectForKey(String key) {
        IntentHelper helper = getInstance();
        Object data = helper._hash.get(key);
        helper._hash.remove(key);
        helper = null;
        return data;
    }
}

ইন্টেন্টের মধ্যে আপনার জিনিসগুলি রাখার পরিবর্তে ইনটেন্টহেল্পার ব্যবহার করুন:

IntentHelper.addObjectForKey(obj, "key");

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

Object obj = (Object) IntentHelper.getObjectForKey("key");

মনে রাখবেন যে একবার লোড হয়ে গেলে, অপ্রয়োজনীয় উল্লেখগুলি এড়াতে অবজেক্টটি সরিয়ে ফেলা হয়।


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

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

@ স্টিভেনমার্কফোর্ড তাই আজও কি বাসের ধরণটি সত্য করে আছে? ক্রিয়াকলাপগুলির মধ্যে এই অ্যাক্সেসের ডেটার মতো কোড সহ একটি কোডবেস উন্নত করার চেষ্টা করছি:BookActivity.getInstance().recommendationResponse ইনRoomsActivity
Woppi

যখন প্রাপ্তি ক্রিয়াকলাপটি পুনরায় তৈরি করা হয় (উদাহরণস্বরূপ স্ক্রিন রোটেশনে) objহয়ে যায় null। এটি এড়াতে, objএটি আবার পাওয়ার জন্য কোথাও সংরক্ষণ করা উচিত। প্রকৃতপক্ষে জসন সলিউশন ইনটেন্টে অবজেক্ট ডেটা সঞ্চয় করে।
সালভাদোর

25

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

উ: ডাটাবেস

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

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

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

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

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

উ: ডাটাবেস

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

টিউটোরিয়াল

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

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

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

 // 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

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

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

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

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

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

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

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

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

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

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

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

নমুনা

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

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

ডেটা পাস করার এই বিকল্পের জন্য পার্সেবল ক্লাস ব্যবহার করে ক্রিয়াকলাপগুলির মধ্যে পাস করার জন্য অনুগ্রহ করে অ্যান্ড্রয়েড - পার্সেল টিউটোরিয়ালটি পড়ুন ।


22

Customerনিম্নলিখিত হিসাবে নিজের ক্লাস তৈরি করুন :

import import java.io.Serializable;
public class Customer implements Serializable
{
    private String name;
    private String city;

    public Customer()
    {

    }
    public Customer(String name, String city)
    {
        this.name= name;
        this.city=city;
    }
    public String getName() 
    {
        return name;
    }
    public void setName(String name) 
    {
        this.name = name;
    }
    public String getCity() 
    {
        return city;
    }
    public void setCity(String city) 
    {
        this.city= city;
    }

}

আপনার onCreate()পদ্ধতিতে

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

    Customer cust=new Customer();
    cust.setName("abc");
    cust.setCity("xyz");

    Intent intent=new Intent(abc.this,xyz.class);
    intent.putExtra("bundle",cust);
    startActivity(intent); 
}

ইন xyz activityবর্গ আপনাকে নিম্নলিখিত কোড ব্যবহার করতে হবে:

Intent intent=getIntent();
Customer cust=(Customer)intent.getSerializableExtra("bundle");
textViewName.setText(cust.getName());
textViewCity.setText(cust.getCity());

.. আপনার কোডটি পরীক্ষা করুন যা আপনি "বান্ডেল" পাসের কাস্ট অবজেক্টের জন্য এবং "ক্লাস" থেকে পেয়ে যাবার জন্য কী হিসাবে ব্যবহার করছেন .. প্লিজ একটি কী "শ্রেণি" বা "বান্ডেল" ব্যবহার করুন ..
এ কে জোশি

আমি ত্রুটির মুখোমুখি হয়েছি: পার্সেবল আইওএক্সেপশনকে সিরিয়ালিজেবল অবজেক্ট লেখার মুখোমুখি হয়েছিল
মণি

15

সর্বোত্তম উপায় হ'ল আপনার আবেদনে একটি ক্লাস (এটিকে কন্ট্রোল বলুন) রাখুন যা 'গ্রাহক' টাইপের স্ট্যাটিক ভেরিয়েবল রাখবে (আপনার ক্ষেত্রে)। আপনার ক্রিয়াকলাপ এ এর ​​পরিবর্তনশীল সূচনা করুন।

উদাহরণ স্বরূপ:

Control.Customer = CustomerClass;

তারপরে ক্রিয়াকলাপ বি তে যান এবং এটি নিয়ন্ত্রণ কক্ষ থেকে আনুন। ভেরিয়েবলটি ব্যবহারের পরে নাল নির্ধারণ করতে ভুলবেন না, অন্যথায় স্মৃতি নষ্ট হবে।


4
@ আজেজ কারণ এটি নকশার দৃষ্টিকোণ থেকে opালু এবং ইন্টেন্টটি অন্য কোনও প্রক্রিয়ায় থাকলে ভয়াবহভাবে ভেঙে যায়।

7
অ্যাক্টিভিটি বিতে আপনার অ্যাপ্লিকেশনটি পুনরায় চালু করার সময় আপনি সমস্যাগুলিতে চলে যাবেন যেহেতু ক্রিয়াকলাপটি অ্যান্ড্রয়েড দ্বারা হত্যা করা যেতে পারে এবং অবজেক্টটি সংরক্ষণ করা হবে না।
রায়ান আর

15
public class MyClass implements Serializable{
    Here is your instance variable
}

এখন আপনি এই ক্লাসের অবজেক্টটি স্টার্টঅ্যাক্টিভিটিতে পাস করতে চান। কেবল এটি ব্যবহার করুন:

Bundle b = new Bundle();
b.putSerializable("name", myClassObject);
intent.putExtras(b);

এটি এখানে কাজ করে কারণ মাইক্লাস প্রয়োগ করে Serializable


আপনি দয়া করে আরও ব্যাখ্যা বা বিস্তারিত বলতে পারেন
অমিতসর্মা

হোম ওয়ার্কডাটা হোমওয়ার্কডাটা = হোম ওয়ার্কলিস্ট.জেট (পজিশন); অভিপ্রায় উদ্দেশ্য = নতুন উদ্দীপনা (সি, হোম ওয়ার্কঅ্যাক্টিভিটিডেটেল.class); বান্ডিল b = নতুন বান্ডেল (); বি.পুটসারিয়াল ("কমপ্লিটডাটা", হোমওয়ার্কডাটা); intent.putExtras (খ); c.startActivity (অভিপ্রায়); অবজেক্ট
অ্যাডের


12

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

সাধারণভাবে আমি স্ট্রিং, int-, বুলিয়ান ইত্যাদি, অতিরিক্ত হিসাবে শুধুমাত্র আদিম datatypes পাঠানোর জন্য আপনার ক্ষেত্রে এটি হবে আপনি পরামর্শ হবে: String fname, String lname, int age, এবং String address

আমার মতামত: আরও জটিল বস্তুগুলি একটি কন্টেন্টপ্রোভাডার , এসডিকার্ড ইত্যাদি প্রয়োগ করে আরও ভালভাবে ভাগ করা যায় এটি স্ট্যাটিক ভেরিয়েবল ব্যবহার করাও সম্ভব তবে এটি ত্রুটি-প্রবণ কোডটি দ্রুত ...

তবে আবার এটি আমার বিষয়গত মতামত।


8

আমি একটি ক্রিয়াকলাপ থেকে অন্য ক্রিয়াকলাপে ডেটা প্রেরণ করতে পার্সলেবল ব্যবহার করছি। এখানে আমার কোড যা আমার প্রকল্পে ভাল কাজ করে।

public class Channel implements Serializable, Parcelable {

    /**  */
    private static final long serialVersionUID = 4861597073026532544L;

    private String cid;
    private String uniqueID;
    private String name;
    private String logo;
    private String thumb;


    /**
     * @return The cid
     */
    public String getCid() {
        return cid;
    }

    /**
     * @param cid
     *     The cid to set
     */
    public void setCid(String cid) {
        this.cid = cid;
    }

    /**
     * @return The uniqueID
     */
    public String getUniqueID() {
        return uniqueID;
    }

    /**
     * @param uniqueID
     *     The uniqueID to set
     */
    public void setUniqueID(String uniqueID) {
        this.uniqueID = uniqueID;
    }

    /**
     * @return The name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name
     *            The name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the logo
     */
    public String getLogo() {
        return logo;
    }

    /**
     * @param logo
     *     The logo to set
     */
    public void setLogo(String logo) {
        this.logo = logo;
    }

    /**
     * @return the thumb
     */
    public String getThumb() {
        return thumb;
    }

    /**
     * @param thumb
     *     The thumb to set
     */
    public void setThumb(String thumb) {
        this.thumb = thumb;
    }


    public Channel(Parcel in) {
        super();
        readFromParcel(in);
    }

    public static final Parcelable.Creator<Channel> CREATOR = new Parcelable.Creator<Channel>() {
        public Channel createFromParcel(Parcel in) {
            return new Channel(in);
        }

        public Channel[] newArray(int size) {

            return new Channel[size];
        }
    };

    public void readFromParcel(Parcel in) {
        String[] result = new String[5];
        in.readStringArray(result);

        this.cid = result[0];
        this.uniqueID = result[1];
        this.name = result[2];
        this.logo = result[3];
        this.thumb = result[4];
    }

    public int describeContents() {
        return 0;
    }

    public void writeToParcel(Parcel dest, int flags) {

        dest.writeStringArray(new String[] { this.cid, this.uniqueID,
                this.name, this.logo, this.thumb});
    }
}

ক্রিয়াকলাপে এটি এটি ব্যবহার করুন:

Bundle bundle = new Bundle();
bundle.putParcelableArrayList("channel",(ArrayList<Channel>) channels);
Intent intent = new Intent(ActivityA.this,ActivityB.class);
intent.putExtras(bundle);
startActivity(intent);

ক্রিয়াকলাপে ডেটা পেতে এটি এটির মতো ব্যবহার করুন:

Bundle getBundle = this.getIntent().getExtras();
List<Channel> channelsList = getBundle.getParcelableArrayList("channel");

7

আপনি এই শ্রেণিটি ব্যবহার করার চেষ্টা করতে পারেন। সীমাবদ্ধতাটি হ'ল এটি একটি প্রক্রিয়ার বাইরে ব্যবহার করা যায় না।

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

 final Object obj1 = new Object();
 final Intent in = new Intent();
 in.putExtra(EXTRA_TEST, new Sharable(obj1));

অন্যান্য ক্রিয়াকলাপ:

final Sharable s = in.getExtras().getParcelable(EXTRA_TEST);
final Object obj2 = s.obj();

public final class Sharable implements Parcelable {

    private Object mObject;

    public static final Parcelable.Creator < Sharable > CREATOR = new Parcelable.Creator < Sharable > () {
        public Sharable createFromParcel(Parcel in ) {
            return new Sharable( in );
        }


        @Override
        public Sharable[] newArray(int size) {
            return new Sharable[size];
        }
    };

    public Sharable(final Object obj) {
        mObject = obj;
    }

    public Sharable(Parcel in ) {
        readFromParcel( in );
    }

    Object obj() {
        return mObject;
    }


    @Override
    public int describeContents() {
        return 0;
    }


    @Override
    public void writeToParcel(final Parcel out, int flags) {
        final long val = SystemClock.elapsedRealtime();
        out.writeLong(val);
        put(val, mObject);
    }

    private void readFromParcel(final Parcel in ) {
        final long val = in .readLong();
        mObject = get(val);
    }

    /////

    private static final HashMap < Long, Object > sSharableMap = new HashMap < Long, Object > (3);

    synchronized private static void put(long key, final Object obj) {
        sSharableMap.put(key, obj);
    }

    synchronized private static Object get(long key) {
        return sSharableMap.remove(key);
    }
}

6

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

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

প্রকার টোকেন <> হ্রাস করা হয়েছে। বিকল্প কি?
রাগভেন্দ্র এম

6

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

 Bundle bundle = new Bundle();

 bundle.putSerializable(key1, value1);
 bundle.putSerializable(key2, value2);
 bundle.putSerializable(key3, value3);

 intent.putExtras(bundle);

মানগুলি নিষ্কাশন করতে:

 Bundle bundle = new Bundle();

 for (String key : bundle.keySet()) {
 value = bundle.getSerializable(key));
 }

এর সুবিধা Serializableহল এর সরলতা। তবে আপনার Parcelableযদি ট্রান্সফার করার জন্য অনেকগুলি ডেটা প্রয়োজন হয় তবে আপনার পদ্ধতিটি বিবেচনা করা উচিত , কারণ Parcelableবিশেষত অ্যান্ড্রয়েডের জন্য ডিজাইন করা হয়েছে এবং এটি এর চেয়ে বেশি দক্ষ Serializable। আপনি Parcelableক্লাসটি ব্যবহার করে তৈরি করতে পারেন :

  1. একটি অনলাইন সরঞ্জাম - parcelabler
  2. অ্যান্ড্রয়েড স্টুডিওর জন্য একটি প্লাগইন - অ্যান্ড্রয়েড পার্সেলেবল কোড জেনারেটর

5

শিম বর্গের মতো একটি শ্রেণি তৈরি করুন এবং Serializableইন্টারফেসটি বাস্তবায়ন করুন । তারপরে আমরা এটি intentপদ্ধতির মাধ্যমে পাস করতে পারি , উদাহরণস্বরূপ:

intent.putExtra("class", BeanClass);

তারপরে এটি অন্যান্য ক্রিয়াকলাপ থেকে পান, উদাহরণস্বরূপ:

BeanClass cb = intent.getSerializableExtra("class");

5

আপনার কাস্টম ক্লাসে দুটি পদ্ধতি তৈরি করুন

public class Qabir {

    private int age;
    private String name;

    Qabir(){
    }

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

    // method for sending object
    public String toJSON(){
        return "{age:" + age + ",name:\"" +name +"\"}";
    }

    // method for get back original object
    public void initilizeWithJSONString(String jsonString){

        JSONObject json;        
        try {
            json =new JSONObject(jsonString );
            age=json.getInt("age");
            name=json.getString("name");
        } catch (JSONException e) {
            e.printStackTrace();
        } 
    }
}

এখন আপনার প্রেরক কার্যকলাপে এটি করুন

Qabir q= new Qabir(22,"KQ");    
Intent in=new Intent(this,SubActivity.class);
in.putExtra("obj", q.toJSON());
startActivity( in);

এবং আপনার রিসিভার ক্রিয়াকলাপে

Qabir q =new Qabir();
q.initilizeWithJSONString(getIntent().getStringExtra("obj"));

3

হ্যাঁ, একটি স্ট্যাটিক অবজেক্ট ব্যবহার করা কাস্টম অ-সিরিয়ালাইজযোগ্য বস্তুর সাথে এটি করার সহজতম উপায় way


হ্যাঁ, আমি মনে করি আমি আসলে আপনার সাথে একমত আপনি যে সমস্ত সম্পত্তি আপনি দিতে চান staticতা কেবল চালিয়ে যাওয়া অবৈজ্ঞানিক হলে সেই জিনিসগুলি তৈরি করা আরও ভাল কাজ putExtra()। উদাহরণস্বরূপ, এখনই, আমি এমন একটি পাস করতে চাই যাতে ArrayListঅবজেক্ট থাকে। আমি এর staticপরিবর্তে আমার অ্যারেলিস্টও বানাতে পারি ।
ম্যাথু কুইরোস

3

অ্যান্ড্রয়েড ক্রিয়াকলাপের অবজেক্টগুলি ধ্বংস এবং পুনর্গঠিত হতে পারে। সুতরাং, এগুলি দেখার জন্য আপনাকে অন্য পদ্ধতির ব্যবহার করতে হবে - বা তারা তৈরি করা কোনও বস্তু !!! - আপ এটি হ'ল আপনি স্ট্যাটিক ক্লাসের রেফারেন্স হিসাবে পাস করতে পারেন তবে অবজেক্ট হ্যান্ডেলটি (জাভা এইগুলিকে "রেফারেন্সগুলি বলে, যেমন স্মলটালক বলে; তবে সেগুলি সি বা অ্যাসেমব্লিক অর্থে উল্লেখ নয়) পরে অবৈধ হবে কারণ" বৈশিষ্ট্য " অ্যান্ড্রয়েড ওই এর যে কোনও ক্রিয়াকলাপটি পরে ধ্বংস এবং পুনর্গঠন করা যায়।

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

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

রেফারেন্সের জন্য:

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

onDestroy "সিস্টেম অস্থায়ীভাবে এই দৃষ্টান্তটি ধ্বংস করছে স্থান সংরক্ষণের জন্য ক্রিয়াকলাপের " "

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

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


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

2
  1. আমি জানি যে স্ট্যাটিক খারাপ, তবে মনে হয় আমরা এটি এখানে ব্যবহার করতে বাধ্য হই। পার্সেবল / সেরিয়াজেবলগুলির সমস্যাটি হ'ল দুটি ক্রিয়াকলাপের একই বস্তুর = মেমরির অপচয় এবং সিপিইউয়ের নকল উদাহরণ রয়েছে।

    public class IntentMailBox {
        static Queue<Object> content = new LinkedList<Object>();
    }

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

IntentMailBox.content.add(level);
Intent intent = new Intent(LevelsActivity.this, LevelActivity.class);
startActivity(intent);

কল করা ক্রিয়াকলাপ (নোট করুন যে অনক্রিট () এবং অন ​​রেজিউম () সিস্টেম যখন ক্রিয়াকলাপগুলি ধ্বংস করে এবং পুনরায় তৈরি করে তখন একাধিকবার কল করা যেতে পারে)

if (IntentMailBox.content.size()>0)
    level = (Level) IntentMailBox.content.poll();
else
    // Here you reload what you have saved in onPause()
  1. আরেকটি উপায় হ'ল শ্রেণীর একটি স্থির ক্ষেত্রের ঘোষণা করা যা আপনি খুব ক্লাসে পাস করতে চান। এটি কেবল এই উদ্দেশ্যে পরিবেশন করবে। ভুলে যাবেন না যে এটি অনক্রিটে বাতিল হয়ে যেতে পারে, কারণ আপনার অ্যাপ্লিকেশন প্যাকেজটি মেমরি থেকে সিস্টেমের মাধ্যমে লোড করা হয়েছে এবং পরে আবার লোড হয়েছে।

  2. আপনার এখনও কার্যকলাপ ক্রিয়াকলাপ পরিচালনা করতে হবে তা মনে রেখে, আপনি জটিল ডেটা কাঠামোর মতো বেদনাদায়ক, সরাসরি ভাগ করা পছন্দগুলিতে সমস্ত ডেটা লিখতে চাইতে পারেন।


1

উপরের উত্তরগুলি প্রায় সমস্ত সঠিক তবে যারা উত্তরগুলি অ্যান্ড্রয়েড করেন না তাদের জন্য অ্যান্ড্রয়েডের পাওয়ারফুল ক্লাস রয়েছে ইন্টেন্ট আপনি না শুধুমাত্র কার্যকলাপ কিন্তু অ্যান্ড্রয়েড (broadcasr রিসিভার, বিষয়বস্তুর জন্য servises প্রদান আরেকটি উপাদান মধ্যে ডেটা ভাগ এটা সাহায্যে আমরা ContetnResolver বর্গ কোন অভিপ্রায় ব্যবহার )। আপনার ক্রিয়াকলাপে আপনি অভিপ্রায় তৈরি করেন

Intent intent = new Intent(context,SomeActivity.class);
intent.putExtra("key",value);
startActivity(intent);

আপনার গ্রহণের ক্রিয়াকলাপে আপনার রয়েছে

public class SomeActivity extends AppCompactActivity {

    public void onCreate(...){
    ...
          SomeObject someObject = getIntent().getExtras().getParceable("key");
    }

}

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


0

আমি সবসময় ভাবছিলাম যে এটি কেন অন্য ক্রিয়াকলাপের কোনও পদ্ধতিতে কল করার মতো সহজ হতে পারে না। আমি সম্প্রতি একটি ইউটিলিটি লাইব্রেরি লিখেছি যা এটিকে প্রায় সহজ করে তোলে। আপনি এটি এখানে পরীক্ষা করে দেখতে পারেন ( https://github.com/noxiouswinter/gnlib_android/wiki/gnlauncher )।

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

ব্যবহার

ক্রিয়াকলাপটি চালু করার জন্য যে পদ্ধতিগুলি আপনি কল করতে চান তার সাথে একটি ইন্টারফেস সংজ্ঞায়িত করুন।

public interface IPayload {
    public void sayHello(String name, int age);
}

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

public class Activity_1 extends Activity implements IPayload {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //Notify GNLauncher when the Activity is ready. 
        GNLauncher.get().ping(this);
    }

    @Override
    public void sayHello(String name, int age) {
        Log.d("gnlib_test", "Hello " + name + "! \nYour age is: " + age);
    }
}

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

public class Activity_2 extends Activity {
    public void onClick(View v) {
        ((IPayload)GNLauncher.get().getProxy(this, IPayload.class, Activity_1.class)).sayHello(name, age);
    }
}

প্রথম ক্রিয়াকলাপটি চালু করা হবে এবং প্রয়োজনীয় পরামিতিগুলির সাথে পদ্ধতিটি কল করা হবে।

পূর্বশর্ত

কীভাবে নির্ভরতা যুক্ত করতে হয় তার জন্য দয়া করে https://github.com/noxiouswinter/gnlib_android/wiki#prerequisites দেখুন


0

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

(1) উত্স ক্রিয়াকলাপ

Intent ii = new Intent(examreport_select.this,
                    BarChartActivity.class);

            ii.putExtra("IntentExamResultDetail",
                    (Serializable) your List<ArraList<String>> object here);
            startActivity(ii);

(2) গন্তব্য সংবেদনশীলতা

List<ArrayList<String>> aa = (List<ArrayList<String>>) getIntent()
            .getSerializableExtra("IntentExamResultDetail");

0

আমি প্যাসেবল বা সিরিয়ালাইজেবলের সাথে স্থানান্তর করার জন্য অবজেক্ট সেট করতাম তবে যখনই আমি অন্য ভেরিয়েবলগুলি বস্তুতে (মডেল) যুক্ত করি তখনই আমাকে এটি সমস্ত নিবন্ধভুক্ত করতে হয়। এটা এত অসুবিধাজনক।

ক্রিয়াকলাপ বা টুকরাগুলির মধ্যে অবজেক্ট স্থানান্তর করা অত্যন্ত সহজ।

অ্যান্ড্রয়েড ডেটা ক্যাশে


0

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

SupplierDetails poSuppliersDetails = new SupplierDetails();

ভিতরে poSuppliersDetailsআমাদের কিছু মান আছে। এখন আমি লক্ষ্যটিকে ক্রিয়াকলাপের জন্য এই অবজেক্টটি পাঠাচ্ছি:

Intent iPODetails = new Intent(ActivityOne.this, ActivityTwo.class);
iPODetails.putExtra("poSuppliersDetails", poSuppliersDetails);

এটি কীভাবে এটিসিটিটিউতে পাবেন:

private SupplierDetails supplierDetails;
    supplierDetails =(SupplierDetails) getIntent().getSerializableExtra("poSuppliersDetails");


-1

হ্যালো সমস্ত আমি অনেক ভাল বিকল্প দেখতে পাচ্ছি কিন্তু আমি ভাবছিলাম কেন বাঁধাই ব্যবহার করা হয়নি?

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

একটি বাইন্ডার তৈরি করা যথেষ্ট সহজ ...

public class MyBinder extends Binder {

    private Object myObject;

    public MyBinder(Object object) {
        myObject = object;
    }

    public Object getObject() {
        return myObject;
    }

}

এবং এটি ব্যবহারের জন্য পার্সেবল তৈরি করা কোনও খারাপ ইথার নয়।

public class MyParcelable implements Parcelable {

    private Object myObject;

    public MyParcelable() {
    }

    public MyParcelable(Parcel parcel) {
        myObject = ((MyBinder)parcel.readStrongBinder()).getObject();
    }

    public void setObject(Object object) {
        myObject = object;
    }

    public Object getObject() {
        return myObject;
    }

    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeStrongBinder(new MyBinder(myObject));
    }

    public int describeContents() {
        return myObject == null ? 0 : 1;
    }

    public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {

        public MyParcelable createFromParcel(Parcel parcel) {
            return new MyParcelable(parcel);
        }

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

    };
}

এই যুক্তিটি সত্যিই দুর্দান্ত কারণ আপনি প্রকৃতপক্ষে ক্রিয়াকলাপ থেকে ক্রিয়াকলাপের কোনও রেফারেন্স দিচ্ছেন।

আমি নালগুলি পরীক্ষা করার পরামর্শ দেব এবং যদি উদাহরণস্বরূপ বাইন্ডারটি মাইবাইন্ডার হয়!

এবং এটি বাস্তবায়নের জন্য আপনি কেবল ...

এটি ছেড়ে দিন

Object myObject = "some object";
MyParcelable myParcelable = new MyParcelable();
myParcelable.setObject(myObject);

intent.putExtra("MyParcelable", myParcelable);

তা ফিরে পেতে

myParcelable = (MyParcelable) getIntent().getExtras().getParcelable("MyParcelable");
myObject = myParcelable.getObject();

কেহ কেহ সমস্ত পাগল হতে পারে এবং এই স্তন্যপানটিকে একটি সত্য জেনেরিক করতে পারে।

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