Как отправить объект из одной операции Android в другую, используя Intents? - PullRequest
810 голосов
/ 26 января 2010

Как я могу передать объект пользовательского типа из одного Activity в другой, используя метод putExtra() класса Intent ?

Ответы [ 35 ]

722 голосов
/ 26 января 2010

Если вы просто передаете объекты, то Parcelable был разработан для этого. Это требует немного больше усилий, чем использование собственной сериализации Java, но это намного быстрее (и я имею в виду, WAY быстрее).

Из документов приведен простой пример реализации:

// 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();
    }
}

Обратите внимание, что в случае, если у вас есть более одного поля для извлечения из данной Посылки, вы должны делать это в том же порядке, в котором вы их поместили (то есть в подходе FIFO).

Как только ваши объекты реализуют Parcelable, достаточно просто поместить их в Intents с помощью putExtra () :

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

Затем вы можете вытащить их обратно с помощью getParcelableExtra () :

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

Если ваш класс объектов реализует Parcelable и Serializable, убедитесь, что вы выполнили приведение к одному из следующих:

i.putExtra("parcelable_extra", (Parcelable) myParcelableObject);
i.putExtra("serializable_extra", (Serializable) myParcelableObject);
185 голосов
/ 26 января 2010

Вам нужно будет сериализовать ваш объект в какое-то строковое представление. Одним из возможных строковых представлений является JSON, и одним из самых простых способов сериализации в / из JSON в Android, если вы спросите меня, является Google GSON .

В этом случае вы просто помещаете строковое возвращаемое значение из (new Gson()).toJson(myObject); и извлекаете строковое значение и используете fromJson, чтобы превратить его обратно в ваш объект.

Однако, если ваш объект не очень сложный, это может не стоить дополнительных затрат, и вы можете вместо этого передать отдельные значения объекта.

146 голосов
/ 13 сентября 2012

Вы можете отправить сериализуемый объект через намерение

// 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 {
} 
65 голосов
/ 02 ноября 2011

В ситуациях, когда вы знаете, что будете передавать данные в приложении, используйте «глобальные переменные» (например, статические классы)

Здесь - это то, что Дайана Хэкборн (hackbod - инженер-программист Google Android) должна была сказать по этому вопросу:

Для ситуаций, когда вы знаете, что действия выполняются в одном и том же процесс, вы можете просто обмениваться данными через глобальные. Например, вы может иметь глобальный HashMap<String, WeakReference<MyInterpreterState>> и когда вы делаете новый MyInterpreterState придумать уникальное имя для этого и поместите это в хэш-карту; отправить это состояние другому активность, просто введите уникальное имя в хэш-карту и когда второе действие начинается, он может получить MyInterpreterState из хэш-карта с именем, которое она получает.

47 голосов
/ 23 апреля 2013

Ваш класс должен реализовывать Serializable или Parcelable.

public class MY_CLASS implements Serializable

После завершения вы можете отправить объект на putExtra

intent.putExtra("KEY", MY_CLASS_instance);

startActivity(intent);

Чтобы получить дополнительные услуги, вам нужно всего лишь

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

Если ваш класс реализует Parcelable, используйте next

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

Надеюсь, это поможет: D

33 голосов
/ 14 июля 2017

Краткий ответ для быстрой необходимости

1. Реализуйте свой класс для сериализации.

Если у вас есть внутренние классы, не забудьте также реализовать их в Serializable !!

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

3. И получите свой объект в другом классе деятельности

Intent intent = getIntent();
    Sport cust = (Sport) intent.getSerializableExtra("sport");
27 голосов
/ 07 августа 2011

если ваш объектный класс реализует Serializable, вам больше ничего не нужно делать, вы можете передать сериализуемый объект.
это то, что я использую.

17 голосов
/ 22 сентября 2016

реализовать сериализуемый в вашем классе

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 голосов
/ 27 марта 2011

Вы можете использовать Android BUNDLE, чтобы сделать это.

Создайте комплект из своего класса, например:

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

Объявите это в своем пользовательском классе и используйте.

15 голосов
/ 05 апреля 2012

Спасибо за посылочную помощь, но я нашел еще одно дополнительное решение

 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());
        }
...