Android Parcelable的使用

翻译 2012年03月27日 09:58:18

转载请注明出处,谢谢~

 

在SDK中 Parcelable类的概述是这样的:Interface for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing theParcelable.Creator interface.

 

这个接口的实例是通过Parcel进行存储的,在使用Parcelable的时候必须使用Parcelable.Creator。

 

下面上代码:

首先修改main.xml,增加一个button

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7. <TextView    
  8. android:id="@+id/text"  
  9.     android:layout_width="fill_parent"   
  10.     android:layout_height="wrap_content"   
  11.     android:text="@string/hello"  
  12.     />  
  13. <Button  
  14. android:id="@+id/button"  
  15.     android:layout_width="wrap_content"   
  16.     android:layout_height="wrap_content"   
  17.     android:text="Parcelable">  
  18. </Button>  
  19. </LinearLayout>  


 

然后是主Activity ParcelableTest.java,这个类显示UI,并通过button点击事件启动另一个Activity -- ParcelableTest2,同时通过Parcelable接口传递一些数据。

 

  1. package parcelable_test.com;  
  2.    
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10.    
  11. public class ParcelableTest extends Activity implements OnClickListener{  
  12. public static final String KEY = "key";  
  13. private Button button;  
  14. public static final String TAG = "Parcelable";   
  15.    
  16. @Override  
  17. public void onCreate(Bundle savedInstanceState) {    
  18.         super.onCreate(savedInstanceState);    
  19.         setContentView(R.layout.main);  
  20.         init();  
  21.         Log.d(TAG, "ParcelableTest");  
  22.     }   
  23.    
  24. private void init(){  
  25. button = (Button)findViewById(R.id.button);  
  26. button.setOnClickListener(this);  
  27. }  
  28.    
  29. private void fun(){  
  30. Log.d(TAG, "fun");  
  31. Person mPerson = new Person();  
  32. mPerson.setName("tom");  
  33. mPerson.setAge(25);  
  34. Intent mIntent = new Intent(this,parcelable_test.com.ParcelableTest2.class);  
  35. Bundle mBundle = new Bundle();  
  36. mBundle.putParcelable(KEY, mPerson);  
  37. mIntent.putExtras(mBundle);  
  38. startActivity(mIntent);  
  39. }  
  40.    
  41. @Override  
  42. public void onClick(View v) {  
  43. switch (v.getId()) {  
  44. case R.id.button:  
  45. fun();  
  46. break;  
  47.    
  48. default:  
  49. break;  
  50. }  
  51. }  
  52. }  

  

 ParcelableTest2.java,这个类用于获取ParcelableTest传出的数据,并显示在UI上。

 

  1. package parcelable_test.com;  
  2.    
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6. import android.widget.TextView;  
  7.    
  8. public class ParcelableTest2 extends Activity{  
  9. private static final String TAG = ParcelableTest.TAG;  
  10. @Override  
  11. public void onCreate(Bundle savedInstanceState) {    
  12.         super.onCreate(savedInstanceState);    
  13.         setContentView(R.layout.main);       
  14.         Log.d(TAG, "ParcelableTest2");  
  15.         TextView textView = new TextView(this);  
  16.         Person mPerson = (Person)getIntent().getParcelableExtra(ParcelableTest.KEY);  
  17.         textView.setText("name = " + mPerson.getName() + "  age = " + mPerson.getAge());  
  18.         setContentView(textView);  
  19.     }   
  20. }  


下面就是最重要的类Person,Person类引用了Parcelable接口
  1. package parcelable_test.com;  
  2. import android.os.Parcel;    
  3. import android.os.Parcelable;   
  4. import android.util.Log;  
  5. public class Person implements Parcelable{  
  6. private String name;  
  7. private int age;  
  8. private static final String TAG = ParcelableTest.TAG;   
  9. public String getName() {  
  10. return name;  
  11. }  
  12. public void setName(String name) {  
  13. this.name = name;  
  14. }  
  15. public int getAge() {  
  16. return age;  
  17. }  
  18. public void setAge(int age) {  
  19. this.age = age;  
  20. }  
  21. public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() {  
  22. @Override  
  23. public Person createFromParcel(Parcel source) {  
  24. Log.d(TAG,"createFromParcel");  
  25. Person mPerson = new Person();  
  26. mPerson.name = source.readString();  
  27. mPerson.age = source.readInt();  
  28. return mPerson;  
  29. }  
  30. @Override  
  31. public Person[] newArray(int size) {  
  32. // TODO Auto-generated method stub  
  33. return new Person[size];  
  34. }  
  35. };  
  36. @Override  
  37. public int describeContents() {  
  38. // TODO Auto-generated method stub  
  39. Log.d(TAG,"describeContents");  
  40. return 0;  
  41. }  
  42. @Override  
  43. public void writeToParcel(Parcel dest, int flags) {  
  44. // TODO Auto-generated method stub  
  45. Log.d(TAG,"writeToParcel");  
  46. dest.writeString(name);  
  47. dest.writeInt(age);  
  48. }  
  49. }  


最后在AndroidManifest.xml加入<activity android:name=".ParcelableTest2"></activity>
程序运行效果如下:
输出的log如下:
  1. 05-18 16:09:47.243 I/ActivityManager(   59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=parcelable_test.com/.ParcelableTest }  
  2. 05-18 16:09:47.383 D/Parcelable(  337): ParcelableTest  
  3. 05-18 16:09:48.003 I/ActivityManager(   59): Displayed activity parcelable_test.com/.ParcelableTest: 724 ms (total 724 ms)  
  4. 05-18 16:09:49.263 D/Parcelable(  337): fun  
  5. 05-18 16:09:49.263 D/Parcelable(  337): writeToParcel  
  6. 05-18 16:09:49.273 I/ActivityManager(   59): Starting activity: Intent { cmp=parcelable_test.com/.ParcelableTest2 (has extras) }  
  7. 05-18 16:09:49.453 D/Parcelable(  337): ParcelableTest2  
  8. 05-18 16:09:49.453 D/Parcelable(  337): createFromParcel  
  9. 05-18 16:09:49.952 I/ActivityManager(   59): Displayed activity parcelable_test.com/.ParcelableTest2: 562 ms (total 562 ms)  


通过log可知程序的运行情况,在mBundle.putParcelable(KEY, mPerson);时,调用了Person类中的public void writeToParcel(Parcel dest, int flags)方法,并向dest写数据,在 Person mPerson = (Person)getIntent().getParcelableExtra(ParcelableTest.KEY);的时候,调用了Person类中的public Person createFromParcel(Parcel source) 方法,创建了一个Person对象,并给这个对象的属性赋值,这里的Parcel source和Parcel dest,是相同的,然后返回这个Person对象。最后就可以打印出mPerson的属性信息了。

 

相关文章推荐

Android Parcelable接口使用心得

Android开发中使数据序列化有两种方法:实现Serializable接口或者实现Parcelable接口,Serializable接口是JAVA提供的一个序列化方法,相对于Parcelable接口...

Android中使用Parcelable实现对象的序列化

在Android开发中,Parcelable是一个接口,只要实现这个接口,一个类的对象就可以实现序列化并可通过Intent和Binder传递。序列化的目的是传递数据用。 下面给出一个实体类的序列化实例...

Android中使用Parcelable接口

Android中传递复杂类型,主要是将自己的类转换为基础的字节数组,Activity之间传递数据是通过Intent实现的。 Android序列化对象主要有两种方法,实现Seriali...

Android-Parcelable接口的使用

一、理解 Parcelable是一个接口、用来实现序列化。与此类似的还有一个接口Serializable,这是JavaSE本身支持的,而Parcelable是Android特有的。二者比较: ...

Android中的parcelable接口使用

转自:http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html 1. Parcelable接口 Interface...

Android使用Parcelable传递对象

在开发中,我们经常要通过Bundle来传递对象,而Bundle则提供了两个方法供我们调用,两个如下:putParcelable(String key, Parcelable value); putSe...

android中Parcelable接口的使用

android中Parcelable接口的使用1. 简介Parcelable是一个接口、用来实现序列化。与此类似的还有一个接口Serializable,这是JavaSE本身支持的,而Parcelabl...

Android中Parcelable使用

在android提供了一种类型:Parcel。被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。 除了基本类型以外,只有实现了Parcelable接口的类才能被放入Parcel中。 ...

Android 使用Parcelable序列化对象

Android序列化对象主要有两种方法,实现Serializable接口、或者实现Parcelable接口。实现Serializable接口是Java SE本身就支持的,而Parcelable是And...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Parcelable的使用
举报原因:
原因补充:

(最多只允许输入30个字)