Parcel源码的分析,可以参考曹文斌的探索Android中的Parcel机制(上)。
本质上把Parcel当成一个Serialize,不同在于它是在内存中完成的序列化和反序列化,利用的是连续的内存空间,因此会更加高效。
在Android中,最常见的使用Parcel类的情况是:在Activity间传递数据。在Activity间通过Intent传递数据的时候,可以利用Parcelable机制传递复杂的对象。
通过创建一个工程来学习使用Parcel机制。
创建Text.java类实现Parcelable接口。
packagecom.cb.test; importandroid.os.Parcel; importandroid.os.Parcelable; public class Text implementsParcelable { private String string = "hello,cb"; publicText() { setString("hello,cb"); } publicText(Parcel parcel) { setString(parcel.readString()); } public static final Parcelable.Creator<Text> CREATOR = new Parcelable.Creator<Text>() { publicText createFromParcel(Parcel source) { return newText(source); } public Text[] newArray(intsize) { return newText[size]; } }; publicString getString() { returnstring; } public voidsetString(String string) { this.string =string; } public intdescribeContents() { return 0; } public void writeToParcel(Parcel dest, intflags) { dest.writeString(string); } }
接下来通过两个Activity之间传递Text对象来了解Parcel机制。
MainActivity.java
packagecom.cb.test; importandroid.app.Activity; importandroid.content.Intent; importandroid.os.Bundle; importandroid.view.MotionEvent; importandroid.widget.TextView; public class MainActivity extendsActivity { private final int SUB_ACTIVITY = 0; private Text text = newText(); @Override public voidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public booleanonTouchEvent(MotionEvent event) { //触发触摸事件,传递Text对象,跳转到SubActivity if (event.getAction() == MotionEvent.ACTION_UP) { Intent intent = newIntent(); intent.setClass(this, SubActivity.class); //设置跳转的类为SubActivity text.setString("who is cb?"); //设置text对象的string值 intent.putExtra("MyText", text); //将text对象放到intent中 startActivityForResult(intent,SUB_ACTIVITY); } return super.onTouchEvent(event); } @Override protected void onActivityResult(int requestCode, intresultCode, Intent data) { //回调时,调用此函数处理 super.onActivityResult(requestCode, resultCode, data); if (requestCode ==SUB_ACTIVITY){ if (resultCode ==RESULT_OK){ if (data.hasExtra("MyText")){ text = data.getParcelableExtra("MyText"); //通过getParcelableExtra方法获取text对象 ((TextView) findViewById(R.id.text)).setText(text.getString()); } } } } }
SubActivity.java
packagecom.cb.test; importandroid.app.Activity; importandroid.content.Intent; importandroid.os.Bundle; importandroid.view.MotionEvent; importandroid.widget.TextView; public class SubActivity extendsActivity { privateText text; @Override public voidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent intent =getIntent(); if (intent != null){ if (intent.hasExtra("MyText")){ text = intent.getParcelableExtra("MyText"); ((TextView) findViewById(R.id.text)).setText(text.getString()); } } } @Override public booleanonTouchEvent(MotionEvent event){ //触发触摸事件,重新设置了text对象是string值,发送intent调用MainActivity。 if (event.getAction() ==MotionEvent.ACTION_UP){ Intent intent = newIntent(); if (text != null){ text.setString("cb is a handsome boy"); intent.putExtra("MyText", text); } setResult(RESULT_OK,intent); finish(); } return super.onTouchEvent(event); } }
参考:
Android中的Parcel是什么 解释很给力
Android开发:什么是Parcel(2)对处理的数据类型进行分析
探索Android中的Parcel机制(下) 具体例子实现