Android Intent传递对象(Serializable和Parcelable序列化对象)

Serializable接口:

是java所提供的一个序列化接口,他是一个空接口,为对象提供标准的序列化和反序列化操作,使用Serializable来实现序列化相当简单,只需要在类的声明中指定一个类似下面的标识即可自动实现默认的序列化过程:

private static final long serialVersionUID = 7732742429742974L;

Parcelable接口:

是Android所提供的一个接口,只要实现这个接口,一个类的对象就可以实现序列化并可以通过Intent和Binder传递,这个相对于Serializable比较麻烦,需要重写序列化功能writeToParcel()和describeContents()接口,反序列化功能是由CREATOR实现。

实战

主界面布局实现

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Welcome to Mr wei&apos;s blog." />
    <Button
        android:id="@+id/button1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Serializable" />
    <Button
        android:id="@+id/button2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Parcelable" />
</LinearLayout>

定义两个序列化对象

Serializable对象

public class Person implements Serializable {

    /**
     * UID
     */
    private static final long serialVersionUID = -6193614528046609967L;

    private String name;
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

Parcelable对象

public class Book implements Parcelable {

    private String bookName;
    private String author;
    private int publishTime;

    public int getPublishTime() {
        return publishTime;
    }

    public void setPublishTime(int publishTime) {
        this.publishTime = publishTime;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getAuthor() {
        return author;
    }

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

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

    @Override
    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeString(bookName);
        parcel.writeString(author);
        parcel.writeInt(publishTime);
    }

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

        @Override
        public Book createFromParcel(Parcel source) {
            Book book = new Book();
            book.bookName = source.readString();
            book.author = source.readString();
            book.publishTime = source.readInt();
            return book;
        }

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

主界面逻辑实现

public class MainActivity extends Activity implements OnClickListener {

    private Button mSerializableButton;
    private Button mParcelableButton;
    public static final String SER_KEY = "net.sunniwell.serializable";
    public static final String PAR_KEY = "net.sunniwell.parcelable";

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

    private void initData() {
        mSerializableButton.setOnClickListener(this);
        mParcelableButton.setOnClickListener(this);
    }

    private void initView() {
        mSerializableButton = (Button) findViewById(R.id.button1);
        mParcelableButton = (Button) findViewById(R.id.button2);
    }

    @Override
    public void onClick(View v) {
        if (v == mSerializableButton) {
            serializableMethod();
        } else {
            parcelableMethod();
        }
    }

    private void parcelableMethod() {
        Book book = new Book();
        book.setBookName("IPC进程详解");
        book.setAuthor("baowei");
        book.setPublishTime(2017);
        Intent intent = new Intent(MainActivity.this, ParcelableDemo.class);
        Bundle bundle = new Bundle();
        bundle.putParcelable(PAR_KEY, book);
        intent.putExtras(bundle);
        startActivity(intent);
    }

    private void serializableMethod() {
        Person person = new Person();
        person.setName("baowei");
        person.setAge(25);
        Intent intent = new Intent(this, SerializableDemo.class);
        Bundle bundle = new Bundle();
        bundle.putSerializable(SER_KEY , person);
        intent.putExtras(bundle);
        startActivity(intent);
    }
}

Serializable界面布局实现

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView 
        android:id="@+id/tv_serializable"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/holo_green_dark"
        />
</LinearLayout>

Serializable逻辑实现

public class SerializableDemo extends Activity {

    private TextView mTVSerializable;

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

    private void initData() {
        Person person = (Person) getIntent().getSerializableExtra(MainActivity.SER_KEY);
        mTVSerializable.setText("你的名字" + person.getName() + ",今年" + person.getAge() + "岁");
    }

    private void initView() {
        mTVSerializable = (TextView) findViewById(R.id.tv_serializable);
    }
}

Parcelable界面布局实现

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView 
        android:id="@+id/tv_parcelable"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/holo_orange_light"
        />
</LinearLayout>

Parcelable逻辑实现

public class ParcelableDemo extends Activity {

    private TextView mTVParcelable;

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

    private void initData() {
        Book book = (Book) getIntent().getParcelableExtra(MainActivity.PAR_KEY);
        mTVParcelable.setText("Book name is: " + book.getBookName()+"/n"+  
                        "Author is: " + book.getAuthor() + "/n" +  
                        "PublishTime is: " + book.getPublishTime());
    }

    private void initView() {
        mTVParcelable = (TextView) findViewById(R.id.tv_parcelable);
    }

}

清单文件配置

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SerializableDemo"></activity>
        <activity android:name=".ParcelableDemo"></activity>
    </application>

注意事项

  1. Serializable实现序列化serialVersionUID可以使用程序自己定义生成的值,也可以使用自己的定义,假如数据有什么结构变动,系统序列化和反序列化的serialVersionUID值不一样,就会出现InvalidClassException错误,使用自己的定义的值不会出现这个错误,但是如果数据接口发生颠覆性的变化,也是不行的。
  2. 静态变量数据属于类不属于对象,所以不会参与序列化过程,使用transient关键字标记的成员变量不参与序列化过程。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值