• 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的属性信息了。
  • 相关阅读:
    ArrayList和LinkedList的区别
    线程的基本概念、线程的基本状态以及状态之间的关 系
    当一个线程进入一个对象的一个synchronized方法后, 其它线程是否可进入此对象的其它方法?
    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.thinkplatform.dao.UserLogDao' available: expected at least 1 bean which qualifies as autowi
    IDEA设置热部署
    spring的核心组件及作用(一)
    解决Linux启动redis时出现提示权限不够问题
    Struts自动装配和四种放入Session作用域的方式
    Struts第一个案例搭建
    当List<String> list =new ArrayList<String>(20); 他会扩容多少次
  • 原文地址:https://www.cnblogs.com/lyz459/p/2531924.html
Copyright © 2020-2023  润新知