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

Android高手之路之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:

 

 




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() + 
+  
	                You age is:  + mPerson.getAge());  
	          
	        setContentView(mTextView);  
	    }  
}

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

 

 




    

    
        
            
                

                
            
        
          
          
    



下面看Parcelable的傳遞:

 

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

1)implements Parcelable


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


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


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


public static final Parcelable.Creator 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);  
	    } 
}


 

 



\

 

\

\

 

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