android之Parcel机制学习

摘要:
Parcel源码的分析,可以参考曹文斌的探索Android中的Parcel机制(上)。在Android中,最常见的使用Parcel类的情况是:在Activity间传递数据。创建Text.java类实现Parcelable接口。packagecom.cb.test;importandroid.os.Parcel;importandroid.os.Parcelable;publicclassTextimplementsParcelable{privateStringstring="hello,cb";publicText(){setString;}publicText{setString;}publicstaticfinalParcelable.CreatorCREATOR=newParcelable.Creator(){publicTextcreateFromParcel{returnnewText;}publicText[]newArray{returnnewText[size];}};publicStringgetString(){returnstring;}publicvoidsetString{this.string=string;}publicintdescribeContents(){return0;}publicvoidwriteToParcel{dest.writeString;}}接下来通过两个Activity之间传递Text对象来了解Parcel机制。MainActivity.javapackagecom.cb.test;importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.MotionEvent;importandroid.widget.TextView;publicclassMainActivityextendsActivity{privatefinalintSUB_ACTIVITY=0;privateTexttext=newText();@OverridepublicvoidonCreate{super.onCreate;setContentView;}@OverridepublicbooleanonTouchEvent{//触发触摸事件,传递Text对象,跳转到SubActivityif{Intentintent=newIntent();intent.setClass;//设置跳转的类为SubActivitytext.setString("whoiscb?");//设置text对象的string值intent.putExtra;//将text对象放到intent中startActivityForResult;}returnsuper.onTouchEvent;}@OverrideprotectedvoidonActivityResult{//回调时,调用此函数处理super.onActivityResult;if{if{if{text=data.getParcelableExtra;//通过getParcelableExtra方法获取text对象.setText;}}}}}SubActivity.javapackagecom.cb.test;importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.MotionEvent;importandroid.widget.TextView;publicclassSubActivityextendsActivity{privateTexttext;@OverridepublicvoidonCreate{super.onCreate;setContentView;Intentintent=getIntent();if(intent!

Parcel源码的分析,可以参考曹文斌的探索Android中的Parcel机制(上)

本质上把Parcel当成一个Serialize,不同在于它是在内存中完成的序列化和反序列化,利用的是连续的内存空间,因此会更加高效。

在Android中,最常见的使用Parcel类的情况是:在Activity间传递数据。在Activity间通过Intent传递数据的时候,可以利用Parcelable机制传递复杂的对象

通过创建一个工程来学习使用Parcel机制。

创建Text.java类实现Parcelable接口。

packagecom.cb.test;

importandroid.os.Parcel;
importandroid.os.Parcelable;

public class Text implementsParcelable {
    private String string = "hello,cb";

    publicText() {
        setString("hello,cb");
    }

    publicText(Parcel parcel) {
        setString(parcel.readString());
    }

    public static final Parcelable.Creator<Text> CREATOR = new Parcelable.Creator<Text>() {

        publicText createFromParcel(Parcel source) {
            return newText(source);
        }

        public Text[] newArray(intsize) {
            return newText[size];
        }
    };

    publicString getString() {
        returnstring;
    }

    public voidsetString(String string) {
        this.string =string;
    }

    public intdescribeContents() {
        return 0;
    }

    public void writeToParcel(Parcel dest, intflags) {
        dest.writeString(string);
    }
}

接下来通过两个Activity之间传递Text对象来了解Parcel机制。

MainActivity.java

packagecom.cb.test;

importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.view.MotionEvent;
importandroid.widget.TextView;

public class MainActivity extendsActivity {
    private final int SUB_ACTIVITY = 0;
    private Text text = newText();
    @Override
    public voidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    public booleanonTouchEvent(MotionEvent event) {   //触发触摸事件,传递Text对象,跳转到SubActivity
        if (event.getAction() == MotionEvent.ACTION_UP) {
            Intent intent = newIntent();
            intent.setClass(this, SubActivity.class);  //设置跳转的类为SubActivity
            text.setString("who is cb?");    //设置text对象的string值
            intent.putExtra("MyText", text);    //将text对象放到intent中
            startActivityForResult(intent,SUB_ACTIVITY);  
        }
        return super.onTouchEvent(event);
    }

    @Override
    protected void onActivityResult(int requestCode, intresultCode, Intent data) {  //回调时,调用此函数处理
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode ==SUB_ACTIVITY){
            if (resultCode ==RESULT_OK){
                if (data.hasExtra("MyText")){
                    text = data.getParcelableExtra("MyText"); //通过getParcelableExtra方法获取text对象
                    ((TextView) findViewById(R.id.text)).setText(text.getString());
                }
            }
        }
    }
}

SubActivity.java

packagecom.cb.test;

importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.view.MotionEvent;
importandroid.widget.TextView;

public class SubActivity extendsActivity {
    privateText text;
    
    @Override
    public voidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Intent intent =getIntent();
        if (intent != null){
            if (intent.hasExtra("MyText")){
                text = intent.getParcelableExtra("MyText");
                ((TextView) findViewById(R.id.text)).setText(text.getString());
            }
        }
    }
    
    @Override
    public booleanonTouchEvent(MotionEvent event){  //触发触摸事件,重新设置了text对象是string值,发送intent调用MainActivity。
        if (event.getAction() ==MotionEvent.ACTION_UP){
            Intent intent = newIntent();
            if (text != null){
                text.setString("cb is a handsome boy");
                intent.putExtra("MyText", text);
            }
            setResult(RESULT_OK,intent);
            finish();
        }
        return super.onTouchEvent(event);
    }
}

参考:

Android中的Parcel是什么 解释很给力

Android开发:什么是Parcel(2)对处理的数据类型进行分析

探索Android中的Parcel机制(下) 具体例子实现

免责声明:文章转载自《android之Parcel机制学习》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SetTimer的使用问题libcurl进行HTTP GET获取JSON数据(转载)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python之SQLAlchemy

ORM介绍 orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型...

【自制工具类】Java删除字符串中的元素

这几天做项目需要把多个item的id存储到一个字符串中,保存进数据库。保存倒是简单,只需要判断之前是否为空,如果空就直接添加,非空则拼接个“,” 所以这个字符串的数据结构是这样的 String str = "a,b,c,d"; 保存简单了,那么删除指定元素呢?这就有点麻烦了,取网上查了好久,不是js的实现就是其他语言的,所以决心自己写个工具类,看了一上午,...

通过wireshark获取应用接口并使用爬虫爬取网站数据(二)

接上文 找到接口之后连续查看了几个图片,结果发现图片都很小,于是用手机下载了一个用wireshark查看了一下url 之前接口的是 imges_min下载的时候变成了images soga,知道之后立马试了一下 果然有效, 但是总不能一个一个的查看下载吧 于是连夜写了个java爬虫 下面是代码 packagecom.feng.main; importj...

android SQLite使用SQLiteOpenHelper类对数据库进行操作

一、 SQLite介绍SQLite是android内置的一个很小的关系型数据库。SQLite的官网是http://www.sqlite.org/,可以去下载一些文档或相关信息。博客中有一篇有稍微详细一点的介绍,大家可以去看一下。二、 SQLiteOpenHelper的使用方法SQLiteOpenHelper是一个辅助类来管理数据库的创建和版本。可以通过继承...

MongoDB配置文件YAML-based选项全解

配置文件部分 MongoDB引入一个YAML-based格式的配置文件。2.4版本以前的仍然兼容。 我的mongodb配置文件: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39...

C# 调用带参数EXE文件及带启动参数EXE制作

(一)、先制作一个带启动参数的EXE文件。  步骤:             1、定义全局私有变量:private string[] s = new string[1];  //这里为了简单起见,只做一个参数            2、  在窗体的构造函数中初始化启动参数               public Form1(string[] p) ...