学习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
性能

相关文章
相关标签/搜索