Bundle主要用於傳遞數據;它保存的數據,是以key-value(鍵值對)的形式存在的。html
咱們常常使用Bundle在Activity之間傳遞數據,傳遞的數據能夠是boolean、byte、int、long、float、double、string等基本類型或它們對應的數組,也能夠是對象或對象數組。當Bundle傳遞的是對象或對象數組時,必須實現Serializable 或Parcelable接口。下面分別介紹Activity之間如何傳遞基本類型、傳遞對象。java
Bundle提供了各類經常使用類型的putXxx()/getXxx()方法,用於讀寫基本類型的數據。Bundle操做基本數據類型的API表格以下所示:android
寫數據的方法以下:數組
[java] view plain copy print?app
// "com.test" is the package name of the destination class ide
// "com.test.Activity02" is the full class path of the destination class 函數
Intent intent = new Intent().setClassName("com.bundletest", "com.bundletest.Bundle02"); this
Bundle bundle = new Bundle(); spa
bundle.putString("name", "skywang"); .net
bundle.putInt("height", 175);
intent.putExtras(bundle);
startActivity(intent);
// end current class
finish();
對應的讀數據的方法以下:
[java] view plain copy print?
Bundle bundle = this.getIntent().getExtras();
String name = bundle.getString("name");
int height = bundle.getInt("height");
Parcelable是Android自定義的一個接口,它包括了將數據寫入Parcel和從Parcel中讀出的API。一個實體(用類來表示),若是須要封裝到bundle消息中去,能夠經過實現Parcelable接口來實現。
Parcelable和Serializable的API以下表:
[java] view plain copy print?
public interface Parcelable {
//內容描述接口,基本不用管
public int describeContents();
//寫入接口函數,打包
public void writeToParcel(Parcel dest, int flags);
//讀取接口,目的是要從Parcel中構造一個實現了Parcelable的類的實例處理。由於實現類在這裏仍是不可知的,因此須要用到模板的方式,繼承類名經過模板參數傳入。
//爲了可以實現模板參數的傳入,這裏定義Creator嵌入接口,內含兩個接口函數分別返回單個和多個繼承類實例。
public interface Creator<T> {
public T createFromParcel(Parcel source);
public T[] newArray(int size);
}
}
從parcelable接口定義中,咱們能夠看到,實現parcelable接口,須要咱們實現下面幾個方法:
(01)describeContents方法。內容接口描述,默認返回0就能夠;
(02)writeToParcel 方法。該方法將類的數據寫入外部提供的Parcel中.即打包須要傳遞的數據到Parcel容器保存,以便從parcel容器獲取數據,該方法聲明以下:
writeToParcel(Parcel dest, int flags) 具體參數含義見doc文檔
(3.)靜態的Parcelable.Creator接口,本接口有兩個方法:
createFromParcel(Parcelin) 從Parcel容器中讀取傳遞數據值,封裝成Parcelable對象返回邏輯層。
newArray(int size) 建立一個類型爲T,長度爲size的數組,僅一句話(returnnew T[size])便可。方法是供外部類反序列化本類數組使用。
Serializable是一個對象序列化的接口。一個類只有實現了Serializable接口,它的對象纔是可序列化的。所以若是要序列化某些類的對象,這些類就必須實現Serializable接口。而實際上,Serializable是一個空接口,沒有什麼具體內容,它的目的只是簡單的標識一個類的對象能夠被序列化。
很簡單,只要implements Serializable接口就能夠了
下面是對實現上述三種數據傳遞方式的BundleTest(demo程序)進行簡要介紹
BundleTest共包含了4個java文件和2個layout文件(main.xml和main2.xml)
Bundle01.java —— 默認的主Activity窗口。
Bundle02.java —— 主Activity用於跳轉的目的窗口。
Book.java —— 實現Parcelable接口的類
Person.java —— 實現Serializable接口的類
main.xml —— Bundle01.java的layout文件
main2.xml —— Bundle02.java的layout文件
工程文件結構以下所示:
AndroidManifest.xml
[html] view plain copy print?
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bundletest"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Bundle01"
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=".Bundle02"> </activity>
</application>
<uses-sdk android:minSdkVersion="11" />
</manifest>
main.xml
[html] view plain copy print?
<?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/app_01"
/>
<Button
android:id="@+id/btnBasic"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/text_basic"
/>
<Button
android:id="@+id/btnPar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/text_par"
/>
<Button
android:id="@+id/btnSer"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/text_ser"
/>
</LinearLayout>
main2.xml
[html] view plain copy print?
<?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/app_02"
/>
<Button
android:id="@+id/btnBack"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/text_jump_back"
/>
</LinearLayout>
strings.xml
[html] view plain copy print?
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello MyBundleTest!</string>
<string name="app_name">MyBundleTest</string>
<string name="app_01">Bundle_01</string>
<string name="app_02">Bundle_02</string>
<string name="text_basic">Bundle Basic Data</string>
<string name="text_par">Bundle Parcelable Data</string>
<string name="text_ser">Bundle Seriable Data</string>
<string name="text_jump_back">Jump Back to Bundler01</string>
</resources>
Bundle01.java
[java] view plain copy print?
package com.bundletest;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.content.Intent;
import android.util.Log;
public class Bundle01 extends Activity implements View.OnClickListener{
private static final String TAG = "skywang-->Bundle01";
private Button mBtnBasic = null;
private Button mBtnPar = null;
private Button mBtnSer = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mBtnBasic = (Button) findViewById(R.id.btnBasic);
mBtnBasic.setOnClickListener(this);
mBtnPar = (Button) findViewById(R.id.btnPar);
mBtnPar.setOnClickListener(this);
mBtnSer = (Button) findViewById(R.id.btnSer);
mBtnSer.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnBasic:
sendBasicDataThroughBundle();
break;
case R.id.btnPar:
sendParcelableDataThroughBundle();
break;
case R.id.btnSer:
sendSeriableDataThroughBundle();
break;
default:
break;
}
}
// sent basic data, such as int, strin, etc... through bundle
private void sendBasicDataThroughBundle(){
// "com.test" is the package name of the destination class
// "com.test.Activity02" is the full class path of the destination class
Intent intent = new Intent().setClassName("com.bundletest", "com.bundletest.Bundle02");
Bundle bundle = new Bundle();
bundle.putString("name", "skywang");
bundle.putInt("height", 175);
intent.putExtras(bundle);
startActivity(intent);
// end current class
finish();
}
// sent object through Pacelable
private void sendParcelableDataThroughBundle(){
Intent intent = new Intent().setClassName("com.bundletest", "com.bundletest.Bundle02");
Book mBook = new Book();
mBook.setBookName("Android");
mBook.setAuthor("skywang");
mBook.setPublishTime(2013);
Bundle mBundle = new Bundle();
mBundle.putParcelable("ParcelableValue", mBook);
intent.putExtras(mBundle);
startActivity(intent);
finish();
}
// sent object through seriable
private void sendSeriableDataThroughBundle(){
Intent intent = new Intent().setClassName("com.bundletest", "com.bundletest.Bundle02");
Person mPerson = new Person();
mPerson.setName("skywang");
mPerson.setAge(24);
Bundle mBundle = new Bundle();
mBundle.putSerializable("SeriableValue",mPerson);
intent.putExtras(mBundle);
startActivity(intent);
finish();
}
}
Bundle02.java
[java] view plain copy print?
package com.bundletest;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.content.Intent;
import android.util.Log;
public class Bundle02 extends Activity implements View.OnClickListener {
private static final String TAG = "skywang-->Bundle02";
private Button mBtnBack = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
mBtnBack = (Button) findViewById(R.id.btnBack);
mBtnBack.setOnClickListener(this);
receiveBasicData();
receiveParcelableData();
receiveSeriableData();
}
private void receiveBasicData() {
Bundle bundle = this.getIntent().getExtras();
String name = bundle.getString("name");
int height = bundle.getInt("height");
if (name != null && height != 0)
Log.d(TAG, "receice basic data -- " +
"name="+name+", height="+height);
}
private void receiveParcelableData() {
Book mBook = (Book)getIntent().getParcelableExtra("ParcelableValue");
if (mBook != null)
Log.d(TAG, "receice parcel data -- " +
"Book name is: " + mBook.getBookName()+", "+
"Author is: " + mBook.getAuthor() + ", "+
"PublishTime is: " + mBook.getPublishTime());
}
private void receiveSeriableData() {
Person mPerson = (Person)getIntent().getSerializableExtra("SeriableValue");
if (mPerson != null)
Log.d(TAG, "receice serial data -- " +
"The name is:" + mPerson.getName() + ", "+
"age is:" + mPerson.getAge());
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnBack:
{
// "com.test" is the package name of the destination class
// "com.test.Activity01" is the full class path of the destination class
Intent intent = new Intent().setClassName("com.bundletest", "com.bundletest.Bundle01");
startActivity(intent);
// end current class
finish();
}
break;
default:
break;
}
}
}
Book.java
[java] view plain copy print?
package com.bundletest;
import android.os.Parcel;
import android.os.Parcelable;
public class Book implements Parcelable {
private String bookName;
private String author;
private int publishTime;
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getPublishTime() {
return publishTime;
}
public void setPublishTime(int publishTime) {
this.publishTime = publishTime;
}
public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() {
@Override
public Book createFromParcel(Parcel source) {
Book mBook = new Book();
mBook.bookName = source.readString();
mBook.author = source.readString();
mBook.publishTime = source.readInt();
return mBook;
}
@Override
public Book[] newArray(int size) {
return new Book[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeString(bookName);
parcel.writeString(author);
parcel.writeInt(publishTime);
}
}
Person.java
[java] view plain copy print?
package com.bundletest;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
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;
}
}
Bundle01.java對應的界面以下:
點擊「Bundle Basic Data」、「Bundle Parcelable Data」、「Bundle Seriable Data」均跳轉到以下界面,但它們對應的logcat信息不一樣。
點擊「Bundle Basic Data」的logcat以下:
點擊「Bundle Parcelable Data」的logcat以下:
點擊「Bundle Seriable Data」的logcat以下:
轉自:http://www.cnblogs.com/skywang12345/archive/2013/03/06/3165555.html