android之Parcel机制学习
2012-11-27 22:52 ...平..淡... 阅读(2813) 评论(0) 编辑 收藏 举报Parcel源码的分析,可以参考曹文斌的 探索Android中的Parcel机制(上)。
本质上把Parcel当成一个Serialize,不同在于它是在内存中完成的序列化和反序列化,利用的是连续的内存空间,因此会更加高效。
在Android中,最常见的使用Parcel类的情况是:在Activity间传递数据。在Activity间通过Intent传递数据的时候,可以利用Parcelable机制传递复杂的对象。
通过创建一个工程来学习使用Parcel机制。
创建Text.java类实现Parcelable接口。
package com.cb.test; import android.os.Parcel; import android.os.Parcelable; public class Text implements Parcelable { private String string = "hello,cb"; public Text() { setString("hello,cb"); } public Text(Parcel parcel) { setString(parcel.readString()); } public static final Parcelable.Creator<Text> CREATOR = new Parcelable.Creator<Text>() { public Text createFromParcel(Parcel source) { return new Text(source); } public Text[] newArray(int size) { return new Text[size]; } }; public String getString() { return string; } public void setString(String string) { this.string = string; } public int describeContents() { return 0; } public void writeToParcel(Parcel dest, int flags) { dest.writeString(string); } }
接下来通过两个Activity之间传递Text对象来了解Parcel机制。
MainActivity.java
package com.cb.test; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.MotionEvent; import android.widget.TextView; public class MainActivity extends Activity { private final int SUB_ACTIVITY = 0; private Text text = new Text(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onTouchEvent(MotionEvent event) { //触发触摸事件,传递Text对象,跳转到SubActivity if (event.getAction() == MotionEvent.ACTION_UP) { Intent intent = new Intent(); 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, int resultCode, 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
package com.cb.test; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.MotionEvent; import android.widget.TextView; public class SubActivity extends Activity { private Text text; @Override public void onCreate(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 boolean onTouchEvent(MotionEvent event){ //触发触摸事件,重新设置了text对象是string值,发送intent调用MainActivity。 if (event.getAction() == MotionEvent.ACTION_UP){ Intent intent = new Intent(); 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机制(下) 具体例子实现
continue my dream...