學習Android中的Parcelable接口

接觸安桌不久,在以後很長的一段時間我將會一直在研究安桌開發。只是爲了實現一下本身的想法。java

1.首先要說parcelable以前必需要說一下,Serializable接口。看了不少教程,在說Activity數值傳遞的過程即是要先說Serializable接口,而後纔是parvelable接口。兩個接口相相似,有什麼區別?android

Parcelable和Serializable的做用、效率、區別及選擇:
一、做用
Serializable的做用是爲了保存對象的屬性到本地文件、數據庫、網絡流、rmi以方便數據傳輸,固然這種傳輸能夠是程序內的也
能夠是兩個程序間的。而Android的Parcelable的設計初衷是由於Serializable效率過慢,爲了在程序內不一樣組件間以及不一樣Android
程序間()高效的傳輸數據而設計,這些數據僅在內存中存在,Parcelable是經過IBinder通訊的消息的載體。
從上面的設計上咱們就能夠看出優劣了。
 
二、效率及選擇
Parcelable的性能比Serializable好,在內存開銷方面較小,因此在內存間數據傳輸時推薦使用Parcelable,如activity間傳輸數據,
而Serializable可將數據持久化方便保存,因此在須要保存或網絡傳輸數據時選擇Serializable,由於android不一樣版本Parcelable可能
不一樣,因此不推薦使用Parcelable進行數據持久化
 
三、編程實現
對於Serializable,類只須要實現Serializable接口,並提供一個序列化版本id(serialVersionUID)便可。而Parcelable則須要實現
writeToParcel、describeContents函數以及靜態的變量,實際上就是將如何打包和解包的工做本身來定義,而序列化的
這些操做徹底由底層實現。

Parcelable接口的做用:實現了Parcelable接口的實例能夠將自身的狀態信息(狀態信息一般指的是各成員變量的值)寫入Parcel,也能夠從Parcel中恢復其狀態。Parcel用來完成數據的序列化傳遞。數據庫

2.實現Parcelable就是爲了進行序列化,那麼,爲何要序列化?
1)永久性保存對象,保存對象的字節序列到本地文件中;
2)經過序列化對象在網絡中傳遞對象;
3)經過序列化在進程間傳遞對象。

3.Parcelable接口定義編程

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);
    }
}

4.實現Parcelable接口
網絡

首先看一個簡單的實現例子:app

package com.example.root.pracact;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Created by root on 15-8-14.
 */
public class MyParcelable implements Parcelable {

    private String str;
    private int in;

    public MyParcelable(String str, int in) {
        this.str=  str;
        this.in = in;
    }
    //首先定義要傳遞的數值變量

    public String getStr() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }

    public void setIn(int in) {
        this.in = in;
    }

    public int getIn() {
        return in;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(str);
        dest.writeInt(in);
    }
    //write操做把數據寫入parcel中

    public static final Creator<MyParcelable> CREATOR = new Creator<MyParcelable>() {
        @Override
        public MyParcelable createFromParcel(Parcel source) {
            return new MyParcelable(source.readString(),source.readInt());
        }
        //讀取parcel的數據,對parcel中的數據進行還原,這樣咱們就具備了一個有和傳入的MyParcelbale對象有着相同實例變量值的
        // 還原後的MyParcelable對象,這樣就實現了對象的傳遞。

        @Override
        public MyParcelable[] newArray(int size) {
            return new MyParcelable[size];
        }
    };
}

有了這個基礎,咱們看一下在兩個activity中進行傳遞數值的例子ide

第一個是User類,在這個user類中實現了parcel的寫入與還原
函數

com.example.root.pracact;

android.os.Parcel;
android.os.Parcelable;

User Parcelable{
    String ;
    ;

    setAge(age) {
        .= age;
    }

    getAge() {
        ;
    }

    setName(String name) {
        .= name;
    }

    String getName() {
        ;
    }
    User(String name,age){
        .= name;
        .= age;
    }

    describeContents() {
        ;
    }

    writeToParcel(Parcel dest, flags) {
        dest.writeString(getName());
        dest.writeInt(getAge());
    }

    Creator<User> = Creator<User>() {
        User createFromParcel(Parcel source) {
            User(source.readString(),source.readInt());
        }

        User[] newArray(size) {
            User[size];
        }
    };
}
com.example.root.pracact;

android.content.Intent;
android.support.v7.app.ActionBarActivity;
android.os.Bundle;
android.view.Menu;
android.view.MenuItem;
android.view.View;

java.io.Serializable;


MainActivity ActionBarActivity {

    onCreate(Bundle savedInstanceState) {
        .onCreate(savedInstanceState);
        setContentView(R.layout.);
        findViewById(R.id.).setOnClickListener(View.OnClickListener() {
            onClick(View v) {
                Intent i = Intent(MainActivity.,AnotherAct.);i.putExtra(, User(,));startActivity(i);
            }
        });
    }

    onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu., menu);
        ;
    }

    onOptionsItemSelected(MenuItem item) {
        id = item.getItemId();

        (id == R.id.) {
            ;
        }

        .onOptionsItemSelected(item);
    }
}
com.example.root.pracact;

android.content.Intent;
android.support.v7.app.ActionBarActivity;
android.os.Bundle;
android.view.Menu;
android.view.MenuItem;
android.widget.TextView;


AnotherAct ActionBarActivity {

    TextView ;
    onCreate(Bundle savedInstanceState) {
        .onCreate(savedInstanceState);
        setContentView(R.layout.);
        = (TextView) findViewById(R.id.);
        Intent i =getIntent();
        User user =  i.getParcelableExtra();
        .setText(String.(,user.getName(),user.getAge()));
    }

    onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu., menu);
        ;
    }

    onOptionsItemSelected(MenuItem item) {
        id = item.getItemId();

        (id == R.id.) {
            ;
        }

        .onOptionsItemSelected(item);
    }
}

鍾志遠 江蘇南京  904727147
性能

相關文章
相關標籤/搜索