Parcelable
来源:互联网 发布:登录注册页面模板源码 编辑:程序博客网 时间:2024/05/16 17:07
阅读Android源代码时,经常看到使用Parcelable的地方,但是一直没太搞清楚它的作用,今天仔细的看了一下,感觉就是把一堆数据打包,然后传输,然后再分解出来。
public interface Parcelable,如果某个类实现了这个接口,那么它的对象实例可以写入到Parcel中,并且能够从中恢复,并且这个类必须要有一个static的field,并且名称要为CREATOR,这个field是某个实现了Parcelable.Creator接口的类的对象实例。
public class MyParcelable implements Parcelable { private int mData; public int describeContents() { return 0; } public void writeToParcel(Parcel out, int flags) { out.writeInt(mData); } public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() { public MyParcelable createFromParcel(Parcel in) { return new MyParcelable(in); } public MyParcelable[] newArray(int size) { return new MyParcelable[size]; } }; private MyParcelable(Parcel in) { mData = in.readInt(); } }public static interface Parcelable.Creator<T>
Interface that must be implemented and provided as a public CREATOR field that generates instances of your Parcelable class from a Parcel
其有两个成员函数:createFromParcel和newArray。
createFromParcel函数创建实现Parcelable接口的某个类的一个新的对象实例,并且用从给定的Parcel中获取的数据进行实例化,Parcel中的数据是在之前通过Parcelable.writeToParcel方式写入的数据。
newArray函数创建实现Parcelable接口的某个类的一个新的对象数组,数组中的每个项都被初始化为null。
编写了一个简单的程序进行了测试,就是从一个Activity向另外一个Activity传递数据:
PersonMsg.java
package com.example.parcelable;import android.os.Parcel;import android.os.Parcelable;public class PersonMsg implements Parcelable{ private String name = null; private int age = 0; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int describeContents() { return 0; } public void writeToParcel(Parcel out, int flags) { out.writeString(name); out.writeInt(age); } public static final Parcelable.Creator<PersonMsg> CREATOR = new Parcelable.Creator<PersonMsg>() { public PersonMsg createFromParcel(Parcel in) { PersonMsg msg = new PersonMsg(); msg.name = in.readString(); msg.age = in.readInt(); return msg; } public PersonMsg[] newArray(int size) { return new PersonMsg[size]; } };}
package com.example.parcelable;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;public class ActivityFrom extends Activity { private EditText nameEditText = null; private EditText ageEditText = null; private Button startButton = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); nameEditText = (EditText)findViewById(R.id.name_content); ageEditText = (EditText)findViewById(R.id.age_content); startButton = (Button)findViewById(R.id.start); startButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String name = nameEditText.getEditableText().toString(); int age = Integer.valueOf(ageEditText.getEditableText().toString()); Log.d("name is: ", name); Log.d("age is: ", age + ""); PersonMsg msg = new PersonMsg(); msg.setName(name); msg.setAge(age); Intent intent = new Intent(); intent.setClass(ActivityFrom.this, ActivityTo.class); intent.putExtra("personmsg", msg); startActivity(intent); } }); }}
package com.example.parcelable;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;public class ActivityTo extends Activity{ private EditText nameEditText = null; private EditText ageEditText = null; private Button startButton = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); nameEditText = (EditText)findViewById(R.id.name_content); ageEditText = (EditText)findViewById(R.id.age_content); startButton = (Button)findViewById(R.id.start); startButton.setVisibility(View.INVISIBLE); Intent intent = getIntent(); PersonMsg msg = (PersonMsg)intent.getParcelableExtra("personmsg"); String name = msg.getName(); int age = msg.getAge(); nameEditText.setText(name); ageEditText.setText(age + ""); }}
main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/first_row" android:layout_width="fill_parent" android:layout_height="50dip" android:orientation="horizontal" > <TextView android:id="@+id/name_label" android:layout_width="60dip" android:layout_height="fill_parent" android:gravity="center" android:text="Name" > </TextView> <EditText android:id="@+id/name_content" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_vertical|left" > </EditText> </LinearLayout> <LinearLayout android:id="@+id/second_row" android:layout_width="fill_parent" android:layout_height="50dip" android:orientation="horizontal" > <TextView android:id="@+id/age_label" android:layout_width="60dip" android:layout_height="fill_parent" android:gravity="center" android:text="Age" > </TextView> <EditText android:id="@+id/age_content" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_vertical|left" > </EditText> </LinearLayout> <Button android:id="@+id/start" android:layout_width="fill_parent" android:layout_height="50dip" android:gravity="center" android:text="start" > </Button></LinearLayout>
实验结果:
点击开始:
0 0
- Parcelable
- Parcelable
- Parcelable
- Parcelable
- Parcelable
- Parcelable
- Parcelable
- Parcelable
- Parcelable
- Parcelable
- Parcelable
- parcelable
- Parcelable
- Parcelable
- Parcelable
- Parcelable
- Parcelable
- Parcelable
- Subsets (II)
- rabbitMQ Ubuntu下 安装指南(erlang和rabbitmq)
- OpenCV 2 学习之”鼠标描点画图“
- Android 断点续传下载
- 编程之美--从无头单链表中删除节点
- Parcelable
- 矩阵快速幂
- OC中的关键字以及一些基础概念
- Tomcat发布项目时,浏览器地址栏图标的问题
- 路由端口映射的作用
- 暴力求解法之简单枚举--除法
- extjs学习04——extjs的初级UI设计1
- 限制访问SQL Server的客户端IP地址
- hdu 4737 A Bit Fun