932

How can I pass an object of a custom type from one Activity to another using the putExtra() method of the class Intent?

5

35 Answers 35

802

If you're just passing objects around then Parcelable was designed for this. It requires a little more effort to use than using Java's native serialization, but it's way faster (and I mean way, WAY faster).

From the docs, a simple example for how to implement is:

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

Observe that in the case you have more than one field to retrieve from a given Parcel, you must do this in the same order you put them in (that is, in a FIFO approach).

Once you have your objects implement Parcelable it's just a matter of putting them into your Intents with putExtra():

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

Then you can pull them back out with getParcelableExtra():

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

If your Object Class implements Parcelable and Serializable then make sure you do cast to one of the following:

i.putExtra("parcelable_extra", (Parcelable) myParcelableObject);
i.putExtra("serializable_extra", (Serializable) myParcelableObject);
21
  • 15
    How would this be implemented where mData is an object (e.g. JSONObject) and not an int? Commented Nov 2, 2011 at 17:04
  • 326
    Why can't just pass the object without all this? We want to pass an object that is already in memory.
    – ceklock
    Commented Jun 4, 2012 at 6:57
  • 119
    @tecnotron its beacuse apps are in different processes, and have separate memory address spaces, you cant just send pointer (reference) to memory block in your process and expect it to be available in another process.
    – marcinj
    Commented Jun 21, 2012 at 12:29
  • 13
    What do i do if i cant make the object's class serializible or Parceable?
    – Amel Jose
    Commented Jun 27, 2012 at 19:44
  • 13
    @ceklock the reason behind this is as follows: When the activity goes behind and later killed from the memory, and then when user opens it from the recents menu, it has to create the Activity where it left off. It has to be the same UI. The Object is not in the memory in this case. But the intent is.
    – tasomaniac
    Commented Mar 20, 2014 at 11:16
209

You'll need to serialize your object into some kind of string representation. One possible string representation is JSON, and one of the easiest ways to serialize to/from JSON in android, if you ask me, is through Google GSON.

In that case you just put the string return value from (new Gson()).toJson(myObject); and retrieve the string value and use fromJson to turn it back into your object.

If your object isn't very complex, however, it might not be worth the overhead, and you could consider passing the separate values of the object instead.

8
  • 19
    I'm guessing because fiXedd's answer solves the same problem without the use of external libraries, in a way that is simply so much preferable, that nobody should ever have a reason to go by the solution i provided (unaware, at the time, of fiXedd's brilliant solution) Commented Apr 13, 2010 at 21:30
  • 5
    I think that is correct. Furthermore, JSON is a protocol more appropriate for client/server and not thread-to-thread.
    – mobibob
    Commented Aug 16, 2010 at 16:50
  • 18
    Not necessarily a bad idea, esp. since Gson is much simpler to use than to implement parcelable for all the objects you want to send.
    – uvesten
    Commented Apr 13, 2011 at 15:26
  • 7
    as iam using gson in my app this is a really easy and nice way!
    – Lars
    Commented Dec 8, 2011 at 9:22
  • 20
    Nice answer, although complete solution would be String s = (new Gson().toJson(client)); and then Cli client = new Gson().fromJson(s, Cli.class); Commented Jan 2, 2015 at 19:15
169

You can send serializable object through 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 {
} 
4
  • 2
    you can send Parcelable objects thru intent, too.
    – tony gil
    Commented Mar 20, 2013 at 21:07
  • 6
    "Serializable is comically slow on Android. Borderline useless in many cases in fact." look at stackoverflow.com/questions/5550670/…
    – Seraphim's
    Commented Nov 19, 2013 at 9:37
  • what if the activity is already running, is there need to do startActivity(i); ? I mean, can I make activity A call activity B, and that returns data to activity A ? am I confused ? Commented May 9, 2014 at 4:05
  • 5
    @Seraphim's Performance matters if you're serializing a lot of objects, but the user won't notice if serializing one object takes 1 ms or 10 ms. If an intent extra is already Serializable but not Parcelable, it's seldom worth the hassle to make it Parcelable. Commented Jul 1, 2015 at 3:09
71

For situations where you know you will be passing data within an application, use "globals" (like static Classes)

Here is what Dianne Hackborn (hackbod - a Google Android Software Engineer) had to say on the matter:

For situations where you know the activities are running in the same process, you can just share data through globals. For example, you could have a global HashMap<String, WeakReference<MyInterpreterState>> and when you make a new MyInterpreterState come up with a unique name for it and put it in the hash map; to send that state to another activity, simply put the unique name into the hash map and when the second activity is started it can retrieve the MyInterpreterState from the hash map with the name it receives.

5
  • 26
    yeah I found it strange that we get given these Intents to use, and then a top engineer tells us to just use globals for our data. But there it is straight from the horses mouth. Commented Feb 22, 2014 at 15:06
  • 1
    Wouldnt weak refrence here be a victim of garbage collection ?
    – uLYsseus
    Commented Nov 23, 2014 at 20:19
  • 1
    @uLYsseus think that's the idea, once you're done with them in the activities... so when the relevant activities are destroyed, it'll allow it to gc Commented Nov 25, 2014 at 21:39
  • 1
    @RichardLeMesurier I was thinking the same thing, but then I looked into the above referenced Google Groups post from Dianne Hackborn, and she mentions that really the only issue with globals would be when using implicit intents (which can launch an activity outside of your package). This makes sense, as Dianne mentions, because those activities would most likely have zero knowledge of the custom types you are passing to them. Once I read that, it made it clearer to me why globals might not be such a bad route under the circumstances, and I figured I would share in case others were curious too
    – BMB
    Commented Mar 18, 2016 at 19:55
  • the intents were overengineered to a point where the intent could be passed to a different computer. which is obviously not a good way to do anything when you actually have just one process you're mucking about in. reasons why it's not good: memory use, cpu use, battery use. the last one especially made the design choices with intents quite perplexing in hindsight. there are people who insist that they're a good idea, usually because "google said so". Commented Mar 1, 2018 at 12:10
53

Your class should implements Serializable or Parcelable.

public class MY_CLASS implements Serializable

Once done you can send an object on putExtra

intent.putExtra("KEY", MY_CLASS_instance);

startActivity(intent);

To get extras you only have to do

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

If your class implements Parcelable use next

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

I hope it helps :D

3
  • 8
    Your class must implement Serializable is wrong. The class can implement Parcelable for example. Commented Oct 2, 2013 at 13:41
  • what are the difference between Parcelable and Serializable @Kernald ? in terms of processing time is it more slower / not best practice or something?
    – gumuruh
    Commented Jul 17, 2014 at 7:47
  • While Serializable is a standard Java interface, Parcelable is Android-specific. In terms of performance, Parcelable is more efficient: developerphil.com/parcelable-vs-serializable Commented Jul 17, 2014 at 8:08
40

implement serializable in your class

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

Then you can pass this object in intent

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

int the second activity you can get data like this

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

But when the data become large,this method will be slow.

0
36

Short answer for fast need

1. Implement your Class to Serializable.

If you have any inner Classes don't forget to implement them to Serializable too!!

public class SportsData implements  Serializable
public class Sport implements  Serializable

List<Sport> clickedObj;

2. Put your object into Intent

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

3. And receive your object in the other Activity Class

Intent intent = getIntent();
    Sport cust = (Sport) intent.getSerializableExtra("sport");
2
  • see this link, stackoverflow.com/questions/2139134/… Commented Sep 1, 2017 at 7:31
  • You can achieve the same thing by implementing Parcelable interface. Parcelable interface takes more time to implement in comparison to Serializable because of the code size. But it performs faster than Serializable and use fewer resources. Commented Jul 4, 2018 at 0:41
28

if your object class implements Serializable, you don't need to do anything else, you can pass a serializable object.
that's what i use.

0
25

There are a couple of ways by which you can access variables or objects in other classes or Activity.

A. Database

B. shared preferences.

C. Object serialization.

D. A class that can hold common data can be named Common Utilities it depends on you.

E. Passing data through Intents and Parcelable Interface.

It depends upon your project needs.

A. Database

SQLite is an Open Source Database which is embedded into Android. SQLite supports standard relational database features like SQL syntax, transactions, and prepared statements.

Tutorials -- http://www.vogella.com/articles/AndroidSQLite/article.html

B. Shared Preferences

Suppose you want to store username. So there will be now two things a Key Username, Value Value.

How to store

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

Using putString(),putBoolean(),putInt(),putFloat(),putLong() you can save your desired dtatype.

How to fetch

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

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

C. Object Serialization

Object serialization is used if we want to save an object state to send it over the network or you can use it for your purpose also.

Use java beans and store in it as one of his fields and use getters and setter for that

JavaBeans are Java classes that have properties. Think of properties as private instance variables. Since they're private, the only way they can be accessed from outside of their class is through methods in the class. The methods that change a property's value are called setter methods, and the methods that retrieve a property's value are called getter methods.

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

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


}

Set the variable in your mail method by using

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

Then use object Serialzation to serialize this object and in your other class deserialize this object.

In serialization, an object can be represented as a sequence of bytes that includes the object's data as well as information about the object's type and the types of data stored in the object.

After a serialized object has been written into a file, it can be read from the file and deserialized that is, the type information and bytes that represent the object and its data can be used to recreate the object in memory.

If you want a tutorial for this to refer this link

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

Get variable in other classes

D. CommonUtilities

You can make a class by your self which can contain common data which you frequently need in your project.

Sample

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. Passing Data through Intents

Please refer to this tutorial for this option of passing data.

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

1
  • Good tutorial you mention in (E) on passing data through Intents.
    – remrick
    Commented Apr 7, 2015 at 20:44
17

You can use android BUNDLE to do this.

Create a Bundle from your class like:

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

    return b;
}

Then pass this bundle with INTENT. Now you can recreate your class object by passing bundle like

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

Declare this in your Custom class and use.

6
  • 2
    Preferable to direct Parcelable implementation, IMHO. Bundle implements Parcelable by itself so you still have the performance gain while avoiding all the trouble implementing it yourself. Instead, you can use key-value pairs to store and retrieve the data which is more robust by far than relying on mere order.
    – Risadinha
    Commented May 6, 2013 at 13:42
  • Parcelable seems complicated to me, in my above answer I am using toBundle method from class on it's object so object is converted to bundle and then we can use constructor to convert bundle to class object.
    – om252345
    Commented May 8, 2013 at 9:32
  • This solution is only viable if you are passing a single object through an intent.
    – TheIT
    Commented Aug 7, 2014 at 22:36
  • Like json but json is light weight i think.
    – David
    Commented Aug 27, 2015 at 12:16
  • Will the object when I retrieve it be the same object or a copy?
    – Markus
    Commented Feb 11, 2016 at 7:18
16

Thanks for parcelable help but i found one more optional solution

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

In Activity One

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

Get Data In Activity 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
    good answer, but increase your Coding Standards... +1 though for bringing Serializable in the competition however Parcellables are a lot faster...
    – Amit
    Commented May 29, 2012 at 6:00
14

I use Gson with its so powerful and simple api to send objects between activities,

Example

// 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 functions you add them to the objects that you want to send

Usage

Send Object From A to 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);

Receive In 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);
}

I use it almost in every project i do and I have no performance issues.

1
  • Thanks , this saved me hours of overcomplication. Commented Feb 13, 2018 at 16:09
10

I struggled with the same problem. I solved it by using a static class, storing any data I want in a HashMap. On top I use an extension of the standard Activity class where I have overriden the methods onCreate an onDestroy to do the data transport and data clearing hidden. Some ridiculous settings have to be changed e.g. orientation-handling.

Annotation: Not providing general objects to be passed to another Activity is pain in the ass. It's like shooting oneself in the knee and hoping to win a 100 metres. "Parcable" is not a sufficient substitute. It makes me laugh... I don't want to implement this interface to my technology-free API, as less I want to introduce a new Layer... How could it be, that we are in mobile programming so far away from modern paradigm...

9

In your first Activity:

intent.putExtra("myTag", yourObject);

And in your second one:

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

Don't forget to make your custom object Serializable:

public class myCustomObject implements Serializable {
...
}
1
  • Parcelable is better than Serializable! Avoid to use Serializable in your Android code! Commented Jul 6, 2015 at 20:49
7

Another way to do this is to use the Application object (android.app.Application). You define this in you AndroidManifest.xml file as:

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

You can then call this from any activity and save the object to the Application class.

In the FirstActivity:

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

In the SecondActivity, do :

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

This is handy if you have objects that have application level scope i.e. they have to be used throughout the application. The Parcelable method is still better if you want explicit control over the object scope or if the scope is limited.

This avoid the use of Intents altogether, though. I don't know if they suits you. Another way I used this is to have int identifiers of objects send through intents and retrieve objects that I have in Maps in the Application object.

3
  • 1
    It is not the right way to do things since the objects may be variable ,yours may work if you talk about static object along the life cycle of the app , but some times we need passiing objects that may generated using webservice or so stackoverflow.com/a/2736612/716865 Commented May 1, 2013 at 12:38
  • I've used it successfully with objects generated from webservices by having an application scope Map where the objects are stored and retrieved by using an identifier. The only real problem with this approach is that Android clears memory after a while so you have to check for nulls on your onResume (I think that Objects passed in intents are persisted but am not sure). Apart from that I don't see this as being significantly inferior. Commented May 2, 2013 at 2:38
  • This is the best answer. It shows how different activities can reference the same data model. It took me far to long to discover this!
    – Markus
    Commented Feb 11, 2016 at 8:16
7

in your class model (Object) implement Serializable, for Example:

public class MensajesProveedor implements Serializable {

    private int idProveedor;


    public MensajesProveedor() {
    }

    public int getIdProveedor() {
        return idProveedor;
    }

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


}

and your first Activity

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

and your second Activity (NewActivity)

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

good luck!!

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

}

Passing the data:

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

Retrieving the data:

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

the most easiest solution i found is.. to create a class with static data members with getters setters.

set from one activity and get from another activity that object.

activity A

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

activity b

mytestclass obj= mytestclass.staticfunctionGet();
9
  • 1
    or creata serializable class to pass to another activity whatever you want to pass. Commented May 9, 2011 at 13:03
  • 10
    Just remember not to put big fat objects. The lifetime of that object will be the same as the lifetime of the application. And never ever store views. This method also guarantees memory leaks.
    – Reno
    Commented Sep 17, 2011 at 19:07
  • 1
    This answer is useful but not a better solution in terms of memory and resource optimization Commented Jul 13, 2012 at 6:11
  • 1
    This breaks OOP principles by introducing global variables. You never know, in which state they are, whether they are set or no, they are used by many threads and you have to deal with this complexity. It is usually a good memory leak, because you don't even know, when to free these variables. Not to say that it introduces hard direct coupling between different modules of the application.
    – afrish
    Commented Jul 27, 2014 at 13:00
  • 2
    WTF? The other two answers a lot superior.
    – IcyFlame
    Commented May 11, 2016 at 5:37
5

Create Android Application

File >> New >> Android Application

Enter Project name: android-pass-object-to-activity

Pakcage: com.hmkcode.android

Keep other defualt selections, go Next till you reach Finish

Before start creating the App we need to create POJO class “Person” which we will use to send object from one activity to another. Notice that the class is implementing Serializable interface.

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 + "]";
    }   
}

Two Layouts for Two Activities

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>

Two Activity Classes

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

}
}
5

Using google's Gson library you can pass object to another activities.Actually we will convert object in the form of json string and after passing to other activity we will again re-convert to object like this

Consider a bean class like this

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

We need to pass object of Example class

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

For reading we need to do the reverse operation in 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);

Add this dependancy in gradle

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

you can use putExtra(Serializable..) and getSerializableExtra() methods to pass and retrieve objects of your class type; you will have to mark your class Serializable and make sure that all your member variables are serializable too...

4

I know this is late but it is very simple.All you have do is let your class implement Serializable like

public class MyClass implements Serializable{

}

then you can pass to an intent like

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

To get it you simpley call

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

Easiest and java way of doing is : implement serializable in your pojo/model class

Recommended for Android for performance view: make model parcelable

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

If you have a singleton class (fx Service) acting as gateway to your model layer anyway, it can be solved by having a variable in that class with getters and setters for it.

In Activity 1:

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

In Activity 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.
}

In Service:

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

This solution does not require any serialization or other "packaging" of the object in question. But it will only be beneficial if you are using this kind of architecture anyway.

4
  • What are the downsides of this approach? It seems so logical and slim. I always read you should not do that but I never get a good explanation about what could go wrong.
    – Markus
    Commented Feb 11, 2016 at 7:13
  • Since I can't edit my comment anymore: Isn't this the only possible solution to get a reference to an object instead of a copy? I need to retrieve the same obejct and not a copy!
    – Markus
    Commented Feb 11, 2016 at 7:21
  • I think this is somewhat discouraged because of the high coupling it leads to. But yes, as far as I can see, this approach is the most viable if you need the actual object. As always in programming, you can do whatever you want, you just want to do it carefully. This solution worked for me, and I prefer it since I use that architecture anyway.
    – Kitalda
    Commented Feb 24, 2016 at 9:21
  • Actually I ended up extending the Application class and stored my datamodel there. In the Intents I only relayed the ID of the data objects which could be used to retrieve the original object from the Application class. Also the extended application class notifies all objects that use the datamodel if it changes via a standard listener concept. I know that this fits only my case where I need to share a datamodel over the whole application but for that case its perfect and no static classes and fields needed also!
    – Markus
    Commented Feb 24, 2016 at 13:10
3

By far the easiest way IMHO to parcel objects. You just add an annotation tag above the object you wish to make parcelable.

An example from the library is below 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; }
}
3

First implement Parcelable in your class. Then pass object like this.

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

The package string isn't necessary, just the string needs to be the same in both Activities

REFERENCE

3

Start another activity from this activity pass parameters via Bundle Object

Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "[email protected]");
startActivity(intent);

Retrieve on another activity (YourActivity)

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

This is ok for simple kind data type. But if u want to pass complex data in between activity u need to serialize it first.

Here we have Employee Model

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

    getters...
    setters...
}

You can use Gson lib provided by google to serialize the complex data like this

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

In Koltin

Add kotlin extension in your build.gradle.

apply plugin: 'kotlin-android-extensions'

android {
    androidExtensions {
        experimental = true
   }
}

Then create your data class like this.

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

Pass Object with Intent

val sample = Sample(1,"naveen")

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

Get object with intent

val sample = intent.getParcelableExtra("id")
1
  • Is it still experimental?
    – ShadeToD
    Commented Jun 28, 2019 at 16:14
1

If you are not very particular about using the putExtra feature and just want to launch another activity with objects, you can check out the GNLauncher (https://github.com/noxiouswinter/gnlib_android/wiki#gnlauncher) library I wrote in an attempt to make this process more straight forward.

GNLauncher makes sending objects/data to an Activity from another Activity etc as easy as calling a function in the Activity with the required data as parameters. It introduces type safety and removes all the hassles of having to serialize, attaching to the intent using string keys and undoing the same at the other end.

Not the answer you're looking for? Browse other questions tagged or ask your own question.