編輯:關於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;
}
}
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();
}
}
}
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() +
+
You age is: + mPerson.getAge());
setContentView(mTextView);
}
}
實現Parcelable一般需要4個步驟:
1)implements Parcelable
2)重寫writeToParcel方法,將你的對象序列化為一個Parcel對象,即:將類的數據寫入外部提供的Parcel中,打包需要傳遞的數據到Parcel容器保存,以便從 Parcel容器獲取數據
3)重寫describeContents方法,內容接口描述,默認返回0就可以
4)實例化靜態內部對象CREATOR實現接口Parcelable.Creator
public static final Parcelable.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 CREATOR = new Creator() {
@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()+
+
Author is: + mBook.getAuthor() +
+
PublishTime is: + mBook.getPublishTime());
setContentView(mTextView);
}
}



Android的onLayout、layout方法講解
onLayout方法是ViewGroup中子View的布局方法,用於放置子View的位置。放置子View很簡單,只需在重寫onLayout方法,然後獲取子View的實例,
Android AutoCompleteTextView連接數據庫自動提示的方法(附demo源碼下載)
本文實例講述了Android AutoCompleteTextView連接數據庫自動提示的方法。分享給大家供大家參考,具體如下:這個簡單例子也體現MVC的思想。AutoC
Android開發之Mediaplayer狀態轉換圖及音頻焦點
前言 之前博客裡已經將了MediaPlayer的簡單應用,如何使用MediaPlayer在Android應用中播放音頻。這篇博客在MediaPlayer使用的基礎
Android評論功能的實現過程
目前,各種App的社區或者用戶曬照片、發說說的地方,都提供了評論功能,為了更好地學習,自己把這個功能實現了一下,做了個小的Demo。首先推薦一款實用的插件LayoutCr