Android中Bundle类的作用

Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值。相对于Map,它提供了各种常用类型的putXxx()/getXxx()方法,如:putString()/getString()和putInt()/getInt(),putXxx()用于往Bundle对象放入数据,getXxx()方法用于从Bundle对象里获取数据。Bundle的内部实际上是使用了HashMap类型的变量来存放putXxx()方法放入的值。

 

用Bundle可以在Activity中传递基本数据类型,比如int、float、string等,但是现在的需求是如何在Activity中传递对象实例呢?就我目前所知的有两种,分别是java中Serializable和Android新引进的Parcelable方法。

 

 

 我们可以考虑采用Bundle.putSerializable(Key,Object);也可以考虑采用Bundle.putParcelable(Key, Object);其中前面一种方法中的Object必须要实现Serializable接口,后面一种方法中的Object必须要实现Parcelable接口。如果没有实现这两个接口之一,那么我们可以使用Bundle.putSerializable(Key,Object)或者Bundle.putParcelable(Key, Object),但起不到任何作用,下面我们以一个完整的例子来说明。

1.新建一个Android的工程,其中该工程的目录结构如下图:


 

2. 修改main.xml布局文件。布局文件的源码如下:




1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22




​<?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"​


​> ​


​<TextView   ​


​android:layout_width=​​​​"fill_parent"​


​android:layout_height=​​​​"wrap_content"​


​android:text=​​​​"@string/hello"​


​/> ​


​<Button ​


​android:id=​​​​"@+id/serButton"​


​android:layout_width=​​​​"fill_parent"​


​android:layout_height=​​​​"wrap_content"​


​android:text=​​​​"Serializable"​​​​/> ​


​<Button ​


​android:id=​​​​"@+id/parButton"​


​android:layout_width=​​​​"fill_parent"​


​android:layout_height=​​​​"wrap_content"​


​android:text=​​​​"Parcelable"​​​​/> ​


​</LinearLayout>​



3.在工程的src目录下新建一个实体类包,命名为com.andy.entity.同时在该package中添加两个实体类,一个是Person.java,该类实现Serializable接口;一个是Police.java,该类实现Parcelable接口。代码分别如下:

Person.java:




1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24




​package com.andy.entity; ​


 


​import java.io.Serializable; ​


 


​public class Person implements Serializable { ​


 


​private static final long serialVersionUID = -6919461967497580385L; ​


 


​private String name; ​


​private int age; ​


 


​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; ​


​} ​


​}​



Police.java:




1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40


41


42


43


44


45


46


47


48


49


50


51


52


53




​package com.andy.entity; ​


 


​import android.os.Parcel; ​


​import android.os.Parcelable; ​


 


​public class Police implements Parcelable { ​


 


​private String name; ​


​private int workTime; ​


 


​public String getName() { ​


​return​​ ​​name; ​


​} ​


 


​public void setName(String name) { ​


​this​​​​.name = name; ​


​} ​


 


​public int getWorkTime() { ​


​return​​ ​​workTime; ​


​} ​


 


​public void setWorkTime(int workTime) { ​


​this​​​​.workTime = workTime; ​


​} ​


 


​public static final Parcelable.Creator<Police> CREATOR = ​​​​new​​ ​​Creator<Police>() { ​


 


​@Override ​


​public Police createFromParcel(Parcel source) { ​


​Police police = ​​​​new​​ ​​Police(); ​


​police.name = source.readString(); ​


​police.workTime = source.readInt(); ​


​return​​ ​​police; ​


​} ​


 


​@Override ​


​public Police[] newArray(int size) { ​


​return​​ ​​new​​ ​​Police[size]; ​


​} ​


​}; ​


 


​@Override ​


​public int describeContents() { ​


​return​​ ​​0; ​


​} ​


 


​@Override ​


​public void writeToParcel(Parcel parcel, int flags) { ​


​parcel.writeString(name); ​


​parcel.writeInt(workTime); ​


​} ​


​}​



4.在包com.andy.testdemo中修改TestActivity.java类,同时在该包中添加类SerializableDemo和ParcelableDemo,分别继承了Activity类和分别显示Person对象和Police对象的数据。代码如下:




1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23


24


25


26


27


28


29


30


31


32


33


34


35


36


37


38


39


40


41


42


43


44


45


46


47


48


49


50


51


52


53


54


55


56


57


58


59


60


61


62


63


64


65


66


67


68


69


70


71




​package com.andy.testdemo; ​


 


​import com.andy.entity.Person; ​


​import com.andy.entity.Police; ​


 


​import android.app.Activity; ​


​import android.content.Intent; ​


​import android.os.Bundle; ​


​import android.view.View; ​


​import android.widget.Button; ​


 


​public class TestActivity extends Activity { ​


​private Button sButton,pButton; ​


​public final static String SER_KEY = ​​​​"com.andy.ser"​​​​; ​


​public final static String PAR_KEY = ​​​​"com.andy.par"​​​​; ​


 


​/** Called when the activity is first created. */​


​@Override ​


​public void onCreate(Bundle savedInstanceState) { ​


​super​​​​.onCreate(savedInstanceState); ​


​setContentView(R.layout.main); ​


 


​sButton = (Button)findViewById(R.id.serButton); ​


​sButton.setOnClickListener(​​​​new​​ ​​View.OnClickListener() { ​


 


​@Override ​


​public void onClick(View v) { ​


​SerializeMethod(); ​


​} ​


​}); ​


 


​pButton = (Button)findViewById(R.id.parButton); ​


​pButton.setOnClickListener(​​​​new​​ ​​View.OnClickListener() { ​


 


​@Override ​


​public void onClick(View v) { ​


​PacelableMethod(); ​


​} ​


​}); ​


​} ​


 


​/** ​


​* Serializeable传递对象的方法 ​


​*/​


​private void SerializeMethod(){ ​


​Person mPerson = ​​​​new​​ ​​Person();    ​


​mPerson.setName(​​​​"andy"​​​​);    ​


​mPerson.setAge(26);    ​


​Intent mIntent = ​​​​new​​ ​​Intent(​​​​this​​​​,SerializableDemo.class);    ​


​Bundle mBundle = ​​​​new​​ ​​Bundle();    ​


​mBundle.putSerializable(SER_KEY,mPerson);    ​


​mIntent.putExtras(mBundle);    ​


 


​startActivity(mIntent);    ​


​} ​


 


​/** ​


​* Pacelable传递对象方法  ​


​*/​


​private void PacelableMethod(){ ​


​Police mPolice = ​​​​new​​ ​​Police();    ​


​mPolice.setName(​​​​"I am Police"​​​​);       ​


​mPolice.setWorkTime(2008);    ​


​Intent mIntent = ​​​​new​​ ​​Intent(​​​​this​​​​,ParcelableDemo.class);    ​


​Bundle mBundle = ​​​​new​​ ​​Bundle();    ​


​mBundle.putParcelable(PAR_KEY, mPolice);    ​


​mIntent.putExtras(mBundle);    ​


 


​startActivity(mIntent);    ​


​} ​


​}​



SerializableDemo.java类




1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22


23




​package com.andy.testdemo; ​


 


​import com.andy.entity.Person; ​


 


​import android.app.Activity; ​


​import android.os.Bundle; ​


​import android.widget.TextView; ​


 


​public class SerializableDemo extends Activity { ​


 


​@Override ​


​public void onCreate(Bundle savedInstanceState) { ​


​super​​​​.onCreate(savedInstanceState); ​


 


​TextView mTextView = ​​​​new​​ ​​TextView(​​​​this​​​​);    ​


​Person mPerson = (Person)getIntent().getSerializableExtra(TestActivity.SER_KEY);    ​


​mTextView.setText(​​​​"You name is: "​​ ​​+ mPerson.getName() + ​​​​"/n"​​​​+    ​


​"You age is: "​​ ​​+ mPerson.getAge());    ​


 


​setContentView(mTextView);    ​


​} ​


 


​}​



ParcelableDemo.java类:




1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19


20


21


22




​package com.andy.testdemo; ​


 


​import com.andy.entity.Police; ​


 


​import android.app.Activity; ​


​import android.os.Bundle; ​


​import android.widget.TextView; ​


 


​public class ParcelableDemo extends Activity { ​


 


​@Override ​


​public void onCreate(Bundle savedInstanceState) { ​


​super​​​​.onCreate(savedInstanceState); ​


 


​TextView mTextView = ​​​​new​​ ​​TextView(​​​​this​​​​);    ​


​Police mPolice = (Police)getIntent().getParcelableExtra(TestActivity.PAR_KEY);    ​


​mTextView.setText(​​​​"Police name is: "​​ ​​+ mPolice.getName()+​​​​"/n"​​​​+    ​


​"WorkTime is: "​​ ​​+ mPolice.getWorkTime() + ​​​​"/n"​​​​);    ​


​setContentView(mTextView);    ​


​} ​


 


​}​



5.在AndroidManifest.xml文件中为新添加的两个Activity进行注册。




1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18


19




​<?xml version=​​​​"1.0"​​ ​​encoding=​​​​"utf-8"​​​​?> ​


​<manifest xmlns:android=​​​​"http://schemas.android.com/apk/res/android"​


​package=​​​​"com.andy.testdemo"​


​android:versionCode=​​​​"1"​


​android:versionName=​​​​"1.0"​​​​> ​


​<application android:icon=​​​​"@drawable/icon"​​ ​​android:label=​​​​"@string/app_name"​​​​> ​


​<activity android:name=​​​​".TestActivity"​


​android:label=​​​​"@string/app_name"​​​​> ​


​<intent-filter> ​


​<action android:name=​​​​"android.intent.action.MAIN"​​ ​​/> ​


​<category android:name=​​​​"android.intent.category.LAUNCHER"​​ ​​/> ​


​</intent-filter> ​


​</activity> ​


​<activity android:name=​​​​".SerializableDemo"​​​​/> ​


​<activity android:name=​​​​".ParcelableDemo"​​​​/> ​


​</application> ​


​<uses-sdk android:minSdkVersion=​​​​"8"​​ ​​/> ​


 


​</manifest>​