Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中Intent傳遞對象的兩種方法Serializable,Parcelable

Android中Intent傳遞對象的兩種方法Serializable,Parcelable

編輯:關於Android編程

Android中的傳遞有兩個方法,一個是Serializable,另一個是Parcelable。

Serializable是J2SE本身就支持的。而Parcelable是Android所特有的。

二者的使用場景和區別:

1)在使用內存的時候,Parcelable比Serializable性能高,所以推薦使用Parcelable。

2)Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC。

3)Parcelable不能使用在要將數據存儲在磁盤上的情況,因為Parcelable不能很好的保證數據的持續性在外界有變化的情況下。盡管Serializable效率低點,但此時還是建議使用Serializable 。

Serializable接口實現比較簡單,只要實現setter和getter,就可以了。

而Parcelable實現比較麻煩些。用一個小的demo來說明:

1.新建android項目ObjectTranDemo

2.創建一個entity的javaBean:Person.java.實現Serializable接口

package com.example.objecttrandemo; 
import java.io.Serializable; 
public class Person implements Serializable { 
private static final long serialVersionUID = -7060210544600464481L; 
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; 
} 
}

3.創建主界面activity_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" 
> 
<TextView 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="android object trance" 
/> 
<Button 
android:id="@+id/button1" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="Serializable" 
/> 
<Button 
android:id="@+id/button2" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="Parcelable" 
/> 
</LinearLayout>

4.創建主activity。這個activity主要用來響應點擊事件,和傳遞數據。ObjecttranDemo.java:

package com.example.objecttrandemo; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
public class ObjectTranDemo extends Activity implements OnClickListener{ 
private Button sButton,pButton; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
setupViews(); 
} 
//initial the views 
public void setupViews(){ 
sButton = (Button)findViewById(R.id.button1); 
pButton = (Button)findViewById(R.id.button2); 
sButton.setOnClickListener(this); 
pButton.setOnClickListener(this); 
} 
//Serializeable object trance 
public void SerializeMethod(){ 
Person mPerson = new Person(); 
mPerson.setName("durant"); 
mPerson.setAge(25); 
Intent mIntent = new Intent(this,ObjectTranDemo1.class); 
Bundle mBundle = new Bundle(); 
mBundle.putSerializable("mPerson",mPerson); 
mIntent.putExtras(mBundle); 
startActivity(mIntent); 
} 
//Pacelable object trance 
public void PacelableMethod(){ 
Book mBook = new Book(); 
mBook.setBookName("a man from mars"); 
mBook.setAuthor("james"); 
mBook.setPublishTime(2014); 
Intent mIntent = new Intent(this,ObjectTranDemo2.class); 
Bundle mBundle = new Bundle(); 
mBundle.putParcelable("mBook", mBook); 
mIntent.putExtras(mBundle); 
startActivity(mIntent); 
} 
@Override 
public void onClick(View v) { 
if(v == sButton){ 
SerializeMethod(); 
}else{ 
PacelableMethod(); 
} 
} 
}

5.新建activity ObjectTranDemo1.java用來顯示Serializable接口傳遞過來的數據

package com.example.objecttrandemo; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 
public class ObjectTranDemo1 extends Activity{ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
TextView mTextView = new TextView(this); 
Person mPerson = (Person)getIntent().getSerializableExtra("mPerson"); 
mTextView.setText("You name is: " + mPerson.getName() + "\n"+ 
"You age is: " + mPerson.getAge()); 
setContentView(mTextView); 
} 
}

至此,Serializable接口傳遞數據完畢,對了,別忘了,在Mainfest.xml文件中聲明新的activity

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.objecttrandemo" 
android:versionCode="1" 
android:versionName="1.0" > 
<uses-sdk 
android:minSdkVersion="8" 
android:targetSdkVersion="18" /> 
<application 
android:allowBackup="true" 
android:icon="@drawable/ic_launcher" 
android:label="@string/app_name" 
android:theme="@style/AppTheme" > 
<activity 
android:name="com.example.objecttrandemo.ObjectTranDemo" 
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=".ObjectTranDemo1"></activity> 
<activity android:name=".ObjectTranDemo2"></activity> 
</application> 
</manifest>

下面看Parcelable的傳遞:

實現Parcelable一般需要4個步驟:

1)implements Parcelable

2)重寫writeToParcel方法,將你的對象序列化為一個Parcel對象,即:將類的數據寫入外部提供的Parcel中,打包需要傳遞的數據到Parcel容器保存,以便從 Parcel容器獲取數據

3)重寫describeContents方法,內容接口描述,默認返回0就可以

4)實例化靜態內部對象CREATOR實現接口Parcelable.Creator

public static final Parcelable.Creator<T> CREATOR

注:其中public static final一個都不能少,內部對象CREATOR的名稱也不能改變,必須全部大寫。需重寫本接口中的兩個方法:createFromParcel(Parcel in) 實現從Parcel容器中讀取傳遞數據值,封裝成Parcelable對象返回邏輯層,newArray(int size) 創建一個類型為T,長度為size的數組,僅一句話即可(return new T[size]),供外部類反序列化本類數組使用。

簡而言之:通過writeToParcel將你的對象映射成Parcel對象,再通過createFromParcel將Parcel對象映射成你的對象。也可以將Parcel看成是一個流,通過writeToParcel把對象寫到流裡面,在通過createFromParcel從流裡讀取對象,只不過這個過程需要你來實現,因此寫的順序和讀的順序必須一致。

具體:

1.新建Book的實體類:

Book.java:

package com.example.objecttrandemo; 
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; 
} 
//Internal Description Interface,You do not need to manage 
@Override 
public int describeContents() { 
return 0; 
} 
//give some attention to the oder betwwen writeToParcel and createFromParcel 
@Override 
public void writeToParcel(Parcel parcel, int flags){ 
parcel.writeString(bookName); 
parcel.writeString(author); 
parcel.writeInt(publishTime); 
} 
public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() { 
@Override 
public Book[] newArray(int size) { 
return new Book[size]; 
} 
@Override 
public Book createFromParcel(Parcel source) { 
Book mBook = new Book(); 
mBook.bookName = source.readString(); 
mBook.author = source.readString(); 
mBook.publishTime = source.readInt(); 
return mBook; 
} 
}; 
}

2.新建activity :ObjectTranDemo2.java.用來顯示parcelable的數據:

package com.example.objecttrandemo; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 
public class ObjectTranDemo2 extends Activity{ 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
TextView mTextView = new TextView(this); 
Book mBook = (Book)getIntent().getParcelableExtra("mBook"); 
mTextView.setText("Book name is: " + mBook.getBookName()+"\n"+ 
"Author is: " + mBook.getAuthor() + "\n" + 
"PublishTime is: " + mBook.getPublishTime()); 
setContentView(mTextView); 
} 
}

在上篇文章給大家介紹了,Intent傳遞對象之Serializable和Parcelable的區別,感興趣的朋友可以點擊了解詳情。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved