Android:Parcelable接口
一、简介
android提供了一种新的类型:Parcel。本类被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。 除了基本类型以 外,只有实现了Parcelable接口的类才能被放入Parcel中。
Android序列化对象主要有两种方法,实现 Serializable 接口、或者实现 Parcelable 接口。
实现Serializable接口是Java本身就支持的,而Parcelable是Android特有的功能,效率比实现Serializable接口高,而且还可以用在进程间通信(IPC)中。实现Serializable接口非常简单,声明一下就可以了。而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。
Parcelable接口的作用:实现了Parcelable接口的实例可以将自身的状态信息(状态信息通常指的是各成员变量的值)写入Parcel,也可以从Parcel中恢复其状态。
二、实现方式
1) writeToParcel 方法
该方法将类的数据写入外部提供的Parcel中.声明如下: writeToParcel (Parcel dest, int flags) ;
2)describeContents方法
直接返回0也可以
3)静态的Parcelable.Creator接口
自定义类型中必须含有一个名称为CREATOR的静态成员,该成员对象要求实现Parcelable.Creator接口及其方法。
简而言之:通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象。也可以将Parcel看成是一个流,通过writeToParcel把对象写到流里面,在通过createFromParcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致。
newArray(int size) 创建一个类型为T,长度为size的数组,(return new T[size])即可。估计本方法是供外部类反序列化本类数组使用。
三、示例代码(转)
http://blog.csdn.net/sunboy_2050/article/details/6949809
MainActivity
package com.learn;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity implements OnClickListener {private static final String TAG = "Parcelable";public static final String KEY = "key";private Button btn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.d(TAG, "MainActivity"); btn = (Button)findViewById(R.id.btn); btn.setOnClickListener(this); } @Override public void onClick(View v) { Log.d(TAG, "onClick"); if(R.id.btn == v.getId()){ Person mPerson = new Person(); mPerson.setName("Bill"); mPerson.setAge(22); Bundle bundle = new Bundle(); bundle.putParcelable(KEY, mPerson);// mPerson -> Parcelable Log.d(TAG, "mPerson=" + mPerson); Intent intent = new Intent(this, SubActivity.class); intent.putExtras(bundle); startActivity(intent); Log.d(TAG, "startActivity"); } }}
SubActivity
package com.learn;import android.app.Activity;import android.os.Bundle;import android.os.Parcelable;import android.util.Log;import android.widget.TextView;public class SubActivity extends Activity {private static final String TAG = "Parcelable";private TextView tv;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main); Log.d(TAG, "SubActivity"); Parcelable parcelable = getIntent().getParcelableExtra(MainActivity.KEY);Person mPerson = (Person)parcelable;// Parcelable -> Person Log.d(TAG, "parcelable=" + parcelable + "; mPerson=" + mPerson); tv = (TextView)findViewById(R.id.tv);tv.setText("name=" + mPerson.getName() + "; age=" + mPerson.getAge());}}
Person
package com.learn;import android.os.Parcel;import android.os.Parcelable;import android.util.Log;public class Person implements Parcelable{private static final String TAG = "Parcelable";private String name;private int age;public Person(){}public void setName(String name){this.name = name;}public String getName(){return this.name;}public void setAge(int age){this.age = age;}public int getAge(){return this.age;}public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() {@Overridepublic Person createFromParcel(Parcel source) { Log.d(TAG, "createFromParcel(Parcel source)"); Person mPerson = new Person();mPerson.name = source.readString();mPerson.age = source.readInt();return mPerson;}@Overridepublic Person[] newArray(int size) { Log.d(TAG, "newArray(int size)"); return new Person[size];}};@Overridepublic int describeContents() { Log.d(TAG, "describeContents()"); return 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) { Log.d(TAG, "writeToParcel(Parcel dest, int flags)"); dest.writeString(name);dest.writeInt(age);}}main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/tv" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Parcelable" /> </LinearLayout>
更多相关文章
- Android(安卓)7.0 虚拟按键(NavigationBar)源码分析 之 View的创建
- Android直播开发之旅(8):Android硬编解码接口MediaCodec原理剖析
- 使用Android(安卓)BindingAdapter与InverseBindingAdapter实现Se
- Android中实现Broastcast接收短信
- Android透明界面与ListView动态刷新
- 在Android里完美实现基站和WIFI定位
- android aidl详解
- 浅谈Java中Collections.sort对List排序的两种方法
- 类和 Json对象