Parcelable

在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的属性信息了。
原文地址:https://www.cnblogs.com/lyz459/p/2531924.html