Android开发中,在不同模块(如Activity)间经常会有各种各样的数据需要相互传递,我把常用的几种

方法都收集到了一起。它们各有利弊,有各自的应用场景。

我现在把它们集中到一个例子中展示,在例子中每一个按纽代表了一种实现方法。

1. 利用Intent对象携带简单数据

利用Intent的Extra部分来存储我们想要传递的数据,可以传送int, long, char等一些基础类型,对复杂的对象就无能为力了。

        1.1 设置参数

[java]

       //传递些简单的参数

Intent intentSimple = new Intent();

intentSimple.setClass(MainActivity.this,SimpleActivity.class);

Bundle bundleSimple = new Bundle();

bundleSimple.putString("usr", "xcl");

bundleSimple.putString("pwd", "zj");

intentSimple.putExtras(bundleSimple);

startActivity(intentSimple);

1.2 接收参数

[java]

       this.setTitle("简单的参数传递例子");

//接收参数

Bundle bunde = this.getIntent().getExtras();

String eml = bunde.getString("usr");

String pwd = bunde.getString("pwd");

 
 
 
2. 利用Intent对象携带如ArrayList之类复杂些的数据

这种原理是和上面一种是一样的,只是要注意下。 在传参数前,要用新增加一个List将对象包起来。

2.1 设置参数

[java]

//传递复杂些的参数

Map<String, Object> map1 = new HashMap<String, Object>();

map1.put("key1", "value1");

map1.put("key2", "value2");

List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

list.add(map1);

Intent intent = new Intent();

intent.setClass(MainActivity.this,ComplexActivity.class);

Bundle bundle = new Bundle();

//须定义一个list用于在budnle中传递需要传递的ArrayList<Object>,这个是必须要的

ArrayList bundlelist = new ArrayList();

bundlelist.add(list);

bundle.putParcelableArrayList("list",bundlelist);

intent.putExtras(bundle);

startActivity(intent);

2.1 接收参数

[java]

<span style="white-space:pre">  </span>   this.setTitle("复杂参数传递例子");

        //接收参数

         Bundle bundle = getIntent().getExtras();

         ArrayList list = bundle.getParcelableArrayList("list");

        //从List中将参数转回 List<Map<String, Object>>

         List<Map<String, Object>> lists= (List<Map<String, Object>>)list.get(0);

         String sResult = "";

         for (Map<String, Object> m : lists)

         {

             for (String k : m.keySet())

             {

                  sResult += "\r\n"+k + " : " + m.get(k);

             }

         }

3. 通过实现Serializable接口

3.1 设置参数

利用Java语言本身的特性,通过将数据序列化后,再将其传递出去。

[java]

//通过Serializable接口传参数的例子

HashMap<String,String> map2 = new HashMap<String,String>();

map2.put("key1", "value1");

map2.put("key2", "value2");

Bundle bundleSerializable = new Bundle();

bundleSerializable.putSerializable("serializable", map2);

Intent intentSerializable = new Intent();

intentSerializable.putExtras(bundleSerializable);

intentSerializable.setClass(MainActivity.this,

                            SerializableActivity.class);

startActivity(intentSerializable);

3.2 接收参数

[java]

          this.setTitle("Serializable例子");

  //接收参数

   Bundle bundle = this.getIntent().getExtras();

   //如果传 LinkedHashMap,则bundle.getSerializable转换时会报ClassCastException,不知道什么原因

   //传HashMap倒没有问题。

   HashMap<String,String> map =  (HashMap<String,String>)bundle.getSerializable("serializable");

String sResult = "map.size() ="+map.size();

Iterator iter = map.entrySet().iterator();

while(iter.hasNext())

{

    Map.Entry entry = (Map.Entry)iter.next();

    Object key = entry.getKey();

    Object value = entry.getValue();

    sResult +="\r\n key----> "+(String)key;

    sResult +="\r\n value----> "+(String)value;

}

 
 
 
 
4. 通过实现Parcelable接口

这个是通过实现Parcelable接口,把要传的数据打包在里面,然后在接收端自己分解出来。这个是Android独有的,在其本身的源码中也用得很多,

效率要比Serializable相对要好。

4.1 首先要定义一个类,用于 实现Parcelable接口

因为其本质也是序列化数据,所以这里要注意定义顺序要与解析顺序要一致噢。

[java]

public class XclParcelable implements Parcelable {

    //定义要被传输的数据

    public int mInt;

    public String mStr;

    public HashMap<String,String> mMap = new HashMap<String,String>();

    //Describe the kinds of special objects contained in this Parcelable's marshalled representation.

    public int describeContents() {

        return 0;

    }

    //Flatten this object in to a Parcel.

    public void writeToParcel(Parcel out, int flags) {

        //等于将数据映射到Parcel中去

        out.writeInt(mInt);

        out.writeString(mStr);

        out.writeMap(mMap);

    }

    //Interface that must be implemented and provided as a public CREATOR field

    //that generates instances of your Parcelable class from a Parcel.

    public static final Parcelable.Creator<XclParcelable> CREATOR

            = new Parcelable.Creator<XclParcelable>() {

        public XclParcelable createFromParcel(Parcel in) {

            return new XclParcelable(in);

        }

        public XclParcelable[] newArray(int size) {

            return new XclParcelable[size];

        }

    };

    private XclParcelable(Parcel in) {

        //将映射在Parcel对象中的数据还原回来

        //警告,这里顺序一定要和writeToParcel中定义的顺序一致才行!!!

        mInt = in.readInt();

        mStr  = in.readString();

        mMap  = in.readHashMap(HashMap.class.getClassLoader());

    }

    public XclParcelable() {

        // TODO Auto-generated constructor stub

    }

}

4.2  设置参数

[java]

//通过实现Parcelable接口传参的例子

                    Intent intentParcelable = new Intent();

                    XclParcelable xp = new XclParcelable();

                    xp.mInt = 1;

                    xp.mStr = "字符串";

                    xp.mMap = new HashMap<String,String>();

                    xp.mMap.put("key", "value");

                    intentParcelable.putExtra("Parcelable", xp);

                    intentParcelable.setClass(MainActivity.this,

                                              ParcelableActivity.class);

                    startActivity(intentParcelable);

4.3 接收参数

[java]

<span style="white-space:pre">      </span>this.setTitle("Parcelable例子");

        //接收参数

        Intent i = getIntent();

        XclParcelable xp = i.getParcelableExtra("Parcelable");

        TextView  tv = (TextView)findViewById(R.id.tv);

        tv.setText(  " mInt ="+xp.mInt

                    +"\r\n mStr"+xp.mStr

                    +"\r\n size()="+xp.mMap.size());

 
 
 
 
 
5. 通过单例模式实现参数传递

        单例模式的特点就是可以保证系统中一个类有且只有一个实例。这样很容易就能实现,

在A中设置参数,在B中直接访问了。这是几种方法中效率最高的。

5.1  定义一个单实例的类

[java]

//单例模式

public class XclSingleton

{

    //单例模式实例

    private static XclSingleton instance = null;

    //synchronized 用于线程安全,防止多线程同时创建实例

    public synchronized static XclSingleton getInstance(){

        if(instance == null){

            instance = new XclSingleton();

        }

        return instance;

    }

    final HashMap<String, Object> mMap;

    public XclSingleton()

    {

        mMap = new HashMap<String,Object>();

    }

    public void put(String key,Object value){

        mMap.put(key,value);

    }

    public Object get(String key)

    {

        return mMap.get(key);

    }

}

 5.2 设置参数

[java]

//通过单例模式传参数的例子

XclSingleton.getInstance().put("key1", "value1");

XclSingleton.getInstance().put("key2", "value2");

Intent intentSingleton = new Intent();

intentSingleton.setClass(MainActivity.this,

                        SingletonActivity.class);

startActivity(intentSingleton);

5.3 接收参数

[java]

<span style="white-space:pre">      </span>this.setTitle("单例模式例子");

        //接收参数

        HashMap<String,Object> map = XclSingleton.getInstance().mMap;

        String sResult = "map.size() ="+map.size();

        //遍历参数

        Iterator iter = map.entrySet().iterator();

        while(iter.hasNext())

        {

            Map.Entry entry = (Map.Entry)iter.next();

            Object key = entry.getKey();

            Object value = entry.getValue();

            sResult +="\r\n key----> "+(String)key;

            sResult +="\r\n value----> "+(String)value;

        }

 

Android传递数据5种方法的更多相关文章

  1. angular 4 router传递数据三种方法

    1.在查询参数中传递数据 <a  [routerLink]="['/product']" [queryParams]="{id:1,name:'dongian'}& ...

  2. Json传递数据两种方式(json大全)

    1.Json传递数据两种方式(json大全)----------------------------字符串 var list1 = ["number","name&quo ...

  3. Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!

    大网站都有推出自己的手机访问版本页面,不管是新闻类还是视频网站,我们在电脑是无法直接访问到手机网站的,比如我经常访问一个3g.qq.com这个手机站点,如果在电脑上直接打开它,则会跳转到其它页面,一般 ...

  4. 用Fiddler可以设置浏览器的UA 和 手动 --Chrome模拟手机浏览器(iOS/Android)的三种方法,亲测无误!

    附加以一种软件的方法是:用Fiddler可以设置浏览器的UA 以下3种方法是手动的 通过伪装User-Agent,将浏览器模拟成Android设备. 第一种方法:新建Chrome快捷方式 右击桌面上的 ...

  5. Android数据传递的五种方法汇总

    Android开发中,在不同模块(如Activity)间经常会有各种各样的数据需要相互传递,我把常用的几种 方法都收集到了一起.它们各有利弊,有各自的应用场景. 我现在把它们集中到一个例子中展示,在例 ...

  6. 两个activity之间传递数据用startActivityForResult方法。

    package com.example.testactivityresquest; import android.app.Activity; import android.content.Intent ...

  7. php页面传递参数值几种方法总结

    2013-06-06 18:02 (分类:) 又搞了一个学期的php,就这样吧. php是一种服务器的脚本语言,他也是现在最为流行的WEB开发语言,下面我们来讲述一下几种上在php开发应用中常用的四种 ...

  8. android 一题多改系列——android 打电话实现两种方法

    在android开发中,用户能够拨打电话是最基本的需求.俗话说“条条大路通罗马”,实现拨打电话的方式有多种,今天,就提供最常用两种. 首先,拨打电话,对于用户来说,是一个耗费的操作,因此,需要一定权限 ...

  9. mybatis学习之路----批量更新数据两种方法效率对比

    原文:https://blog.csdn.net/xu1916659422/article/details/77971696/ 上节探讨了批量新增数据,这节探讨批量更新数据两种写法的效率问题. 实现方 ...

随机推荐

  1. U盘容量变小解决办法

    之前买了个三星闪盘,容量32G,USB3.0 后来装了U盘系统Kali Linux,最近想用的时候发现容量变为6GB了,真的很奇怪. 于是万能的百度(别说为什么不用谷歌,防火墙呀...) 找到解决办法 ...

  2. SQL Server监控报警架构_如何添加报警

    一.数据库邮件报警介绍 数据库邮件是从SQL Server数据库引擎发送电子邮件企业解决方案,使用简单传输协议(SMTP)发送邮件.发送邮件进程与数据库的进程隔离,因此可不用担心影响数据库服务器. 数 ...

  3. Sentiment Analysis resources

    Wikipedia: Sentiment analysis (also known as opinion mining) refers to the use of natural language p ...

  4. Ubuntu 手动更新firefox的flash插件

    Ubuntu下 Firefox更新flash插件老是提示失败,自己动手丰衣足食啊. 1.下载tar文件,地址:http://get.adobe.com/cn/flashplayer/?no_redir ...

  5. 【bzoj1672】[USACO2005 Dec]Cleaning Shifts 清理牛棚

    题目描述 Farmer John's cows, pampered since birth, have reached new heights of fastidiousness. They now ...

  6. 常见http错误码解读

    HTTP常见错误 HTTP 错误 400 400 请求出错 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就无法重复此请求. HTTP 错误 401 401.1 未授权:登录失败 此错误表 ...

  7. plsql配置数据库连接

    工具/原料   PL/SQL 方法/步骤     在Oracle的安装文件下查找tnsnames.ora文件,一般路径如: ORACLE_HOME%\network\admin下: 如果真的找不到路径 ...

  8. JSON数据的使用

    JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON ...

  9. PYTHON 写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者

    def a4(arg): ret = {} for key,value in arg.items(): if len(value) > 2: ret[key] = value[0:2] else ...

  10. [CodeWars][JS]实现大整数加法

    问题描述 实现‘字符串加法’,即将两个以字符串形式表示的数字相加,得到结果然后返回一个新的字符串. 例如:输入‘123’,‘321’,返回‘444’. 这样在进行两个任意大的整数相加的时候,既不会溢出 ...