Как отправить объект из одного действия Android в другое с помощью Intents?

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

30 ответов


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

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

// 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 это просто вопрос положить их в ваш намерения С 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);

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

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

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


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

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

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

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

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


ваш класс должен реализовывать 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 use next

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

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


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


короткий ответ: для быстрого понадобится

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

Если у вас есть какие-либо внутренние классы не забудьте реализовать их Сериализуемыми!!

public class SportsData implements  Serializable
public class Sport implements  Serializable

List<Sport> clickedObj;

2. Поместите свой объект в Intent

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

3. И получите ваш объект в другом классе Activity

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

вы можете использовать Android BUNDLE для этого.

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

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

    return b;
}

затем передайте этот пакет с намерением. Теперь вы можете воссоздать объект класса, передав bundle как

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

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


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

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

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

        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 intent = new Intent(this, SecondAct.class);
     intent.putExtra("PLACE", Place);
     startActivity();

int второе действие вы можете получить данные, как это

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

но когда данные станут большими, этот метод будет медленным.


существует несколько способов доступа к переменным или объектам в других классах или действиях.

Базы Данных А.

Б. общие предпочтения.

С. сериализация объектов.

D. класс, который может содержать общие данные, может быть назван как общие утилиты, это зависит от вас.

E. передача данных через намерения и Parcelable интерфейс.

Это зависит от вашего проекта.

А. база данных

SQLite-это база данных с открытым исходным кодом, которая встроена в Android. SQLite поддерживает стандартные функции реляционной базы данных, такие как синтаксис SQL, транзакции и подготовленные операторы.

учебники -- http://www.vogella.com/articles/AndroidSQLite/article.html

Б. Общие Параметры

Предположим, вы хотите сохранить имя пользователя. Итак, теперь будет две вещи a ключ Имя пользователя,стоимостью значение.

Как хранить

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

используя putString(),putBoolean(),putInt(),putFloat (), putLong () вы можете сохранить желаемый dtatype.

Как выбрать

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

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

С. Сериализация Объектов

объект serlization является используется, если мы хотим сохранить состояние объекта для отправки по сети или вы также можете использовать его для своей цели.

используйте Java beans и храните в нем как одно из его полей и используйте геттеры и сеттеры для этого

JavaBeans-это классы Java, которые имеют свойства. Думать о свойства как переменные частного экземпляра. Так как они частные, единственный способ к ним можно получить доступ извне их класса через методы в классе. Этот вызываются методы, изменяющие значение свойства методы setter и методы которые извлекают значение свойства, называются методами getter.

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

затем использовать объект Serialzation, чтобы сериализовать этот объект и в другом классе десериализовать этот объект.

в сериализации объект может быть представлен в виде последовательности байтов, которая включает данные объекта, а также информацию о типе объекта и типах данных, хранящихся в объект.

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

если вы хотите учебник для этого обратитесь по этой ссылке

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

получить переменную в другом классы

Д. CommonUtilities

вы можете сделать класс самостоятельно, который может содержать общие данные, которые вам часто нужны в вашем проекте.

пример

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

Е. передача данных через Intents

см. Этот учебник для такого варианта прохождения данные.

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


Я использую Gson с его настолько мощным и простым api для отправки объектов между действиями,

пример

// 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 функции вы добавляете их к объектам, которые хотите отправить

использование

отправить объект из A в B

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

Получить В B

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

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


Я боролся с той же проблемой. Я решил это, используя статический класс, сохраняя любые данные, которые я хочу в HashMap. Сверху я использую расширение стандартного класса Activity, где я переопределил методы onCreate onDestroy для скрытого переноса данных и очистки данных. Некоторые смешные настройки должны быть изменены, например, ориентация-обработка.

Аннотация: Не предоставление общих объектов для передачи другому виду деятельности-это боль в заднице. Это как застрелиться. колено и надежда выиграть 100 метров. "Parcable" не является достаточной заменой. Это заставляет меня смеяться... Я не хочу реализовывать этот интерфейс в моем технологическом API, так как меньше я хочу вводить новый слой... Как это может быть, что мы находимся в мобильном программировании так далеко от современной парадигмы...


В первом задании:

intent.putExtra("myTag", yourObject);

и во втором:

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

не забудьте сделать свой пользовательский объект Сериализуемым:

public class myCustomObject implements Serializable {
...
}

другой способ сделать это-использовать Application объект (android.приложение.Приложение.) Вы определяете это в себе как:

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

затем вы можете вызвать это из любой деятельности и сохранить объект в Application класса.

в FirstActivity:

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

во втором действии сделайте:

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

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

это избежать использования Intents хотя в целом. Не знаю, подходят ли они тебе. Другой способ, которым я использовал это, - иметь int идентификаторы объектов отправить через намерения и получить объекты, которые у меня есть в картах в Application "объект".


В вашей модели класса (объекте) реализовать сериализуемый, для Пример:

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

и ваше второе действие (NewActivity)

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

удачи!!


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

самое простое решение я нашел.. чтобы создать класс со статическими членами данных с помощью getters setters.

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

активность

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

активность b

mytestclass obj= mytestclass.staticfunctionGet();

вы можете использовать putExtra(Сериализуемым..) и методы getSerializableExtra () для передачи и извлечения объектов вашего типа класса; вам нужно будет отметить сериализуемый класс и убедиться, что все ваши переменные-члены также сериализуемы...


Создать Приложение Для Android

Файл > > Новый > > Приложение Для Android

введите имя проекта: android-pass-object-to-activity

Pakcage: com.hmkcode.android

держите другие defualt выборы, идти дальше, пока вы не достигнете финиша

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

человек.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) другая активность.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());

}
}

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

Я знаю, что это поздно, но это очень просто.Все, что вам нужно сделать, это позволить вашему классу реализовать сериализуемый как

public class MyClass implements Serializable{

}

затем вы можете перейти к намерению как

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

, чтобы получить его вы просто называете

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

используя библиотеку Gson google, вы можете передать объект другим действиям.На самом деле мы преобразуем объект в виде строки json и после перехода к другому действию мы снова преобразуем в объект, подобный этому

рассмотрим такой класс bean

 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

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

добавьте эту зависимость в Gradle в

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

самым простым было бы просто использовать следующее, Где элемент является строкой:

intent.putextra("selected_item",item)

для получения:

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

Если у вас есть одноэлементный класс (FX Service), действующий как шлюз к вашему слою модели в любом случае, его можно решить, имея переменную в этом классе с геттерами и сеттерами для нее.

В Упражнении 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;
}

Это решение не требует сериализации или другой "упаковки" соответствующего объекта. Но это будет только полезно, если вы используете такую архитектуру в любом случае.


безусловно, самый простой способ IMHO для объектов участков. Вы просто добавляете тег аннотации над объектом, который хотите сделать parcelable.

пример из библиотеки приведен ниже 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; }
}

сначала реализуйте Parcelable в своем классе. Затем передайте такой объект.

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

строка пакета не нужна, просто строка должна быть одинаковой в обоих действиях

ссылка


запустить другое действие из этого действия передать параметры через Bundle Object

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

получить на другой деятельности (YourActivity)

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

это нормально для простого типа данных. Но если вы хотите передать сложные данные между действиями, вам нужно сначала сериализовать их.

здесь мы имеем модель работника

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

    getters...
    setters...
}

вы можете использовать Gson lib, предоставленный google для сериализации сложных данных такой

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

Если вы не очень разборчивы в использовании функции putExtra и просто хотите запустить другое действие с объектами, вы можете проверить GNLauncher (https://github.com/noxiouswinter/gnlib_android/wiki#gnlauncher) библиотека я написал в попытке сделать этот процесс более прямым вперед.

GNLauncher делает отправку объектов / данных в действие из другого действия и т. д. Так же просто, как вызов функции в действии с требуемыми данными в качестве параметров. Он вводит безопасность типа и удаляет все неприятности, связанные с сериализацией, присоединением к намерению с помощью строковых ключей и отменой того же на другом конце.


POJO class "в должности" (обратите внимание, что он реализован Сериализуемым)

package com.example.booklib;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import android.graphics.Bitmap;

public class Post implements Serializable{
    public String message;
    public String bitmap;
    List<Comment> commentList = new ArrayList<Comment>();
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public String getBitmap() {
        return bitmap;
    }
    public void setBitmap(String bitmap) {
        this.bitmap = bitmap;
    }
    public List<Comment> getCommentList() {
        return commentList;
    }
    public void setCommentList(List<Comment> commentList) {
        this.commentList = commentList;
    }

}

POJO class "комментарии"(поскольку он является членом класса Post,он также необходим для реализации Сериализуемого)

    package com.example.booklib;

    import java.io.Serializable;

    public class Comment implements Serializable{
        public String message;
        public String fromName;
        public String getMessage() {
            return message;
        }
        public void setMessage(String message) {
            this.message = message;
        }
        public String getFromName() {
            return fromName;
        }
        public void setFromName(String fromName) {
            this.fromName = fromName;
        }

    }

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

ListView listview = (ListView) findViewById(R.id.post_list);
listview.setOnItemClickListener(new OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            Post item = (Post)parent.getItemAtPosition(position);
            Intent intent = new Intent(MainActivity.this,CommentsActivity.class);
            intent.putExtra("post",item);
            startActivity(intent);

        }
    });

в вашем классе получателей "CommentsActivity" вы можете получить следующие данные

Post post =(Post)getIntent().getSerializableExtra("post");