How to pass CustomObject/ArrayList from one activity to another? Using Parcelable

We’d like to pass an Object from one Activity to another in Java Android, there are two ways to do this operation, the first one is to use a Serializable Object while the second one is to use a Parcelable Object.

It is strongly recommended due to performance issues to use the first solution.

Imagine you have a Song Custom Object, you need implements Parcelable in your Song class:

import android.os.Parcel;
import android.os.Parcelable;

public class Song implements Parcelable {
    private String title;
    private String author;
    private String album;
    private String genre;
    private String location;

    public Song (String title, String author, String album, String genre, String location) {
        this.title = title;
        this.author=author;
        this.album=album;
        this.genre=genre;
        this.location=location;
    }

    public Song(Parcel in) { //Constructor when loading from Parcel
        title = in.readString();
        author = in.readString();
        album = in.readString();
        genre = in.readString();
        location = in.readString();
    }

//Getters and Setters

    public String getAlbum() {
        return album;
    }

    public void setAlbum(String album) {
        this.album = album;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getGenre() {
        return genre;
    }

    public void setGenre(String genre) {
        this.genre = genre;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

//Required method, but not used
    @Override
    public int describeContents() {
        return 0;
    }

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

//When Parcel this Object write every variable to Parcel dest
        dest.writeString(title);
        dest.writeString(author);
        dest.writeString(album);
        dest.writeString(genre);
        dest.writeString(location);
    }

//Parcelable Creator, every Parcelable Object should implement this method.

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

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

Then in the first Activity:

ArrayList<Song> passedList = new ArrayList <Song>();
Intent intent = new Intent(context, SecondActivity.class);
String pkg = getPackageName();
intent.putExtra(pkg+”values”, passedList);
startActivity(intent);

In the second Activity:

ArrayList<Song> passedValues = getIntent().getParcelableArrayListExtra(pkg+”values”);