android开发中,我们的Activity之间总避免不了进行数据的传递,几种传递方式大致如下,各有各的用处:

1、Intent携带简单的数据

Intent intent=new Intent();Bundle bundle=new Bundle();bundle.putString("username","Mary");bundle.putInt("age",23);intent.putExtras(bundle);

 参数接收:

Bundle bundle=getIntent().getExtras(); String username=bundle.getString("username"); int age=bundle.getInt("age");


2、Intent携带例如ArrayList之类复杂的数据
 注意:在传参数前,要用新增加一个List将对象包起来
 初始化数据:

Map map=new HashMap(); map.put("aaa","hello"); map.put("bbb","world"); List> list=new ArrayList>(); list.add(map);                                                                  Intent intent=new Intent(); Bundle bundle=new Bundle(); //须定义一个list用于在bundle中传递需要传递的List,这个是必须要的 ArrayList bundleList=new ArrayList(); bundleList.add(list);                                                                  bundle.putParcelableArrayList("list",bundleList); intent.putExtras(bundle);   

参数接收:

Bundle bundle=getIntent().getExtras(); List bundleList=bundle.getParcelbleArrayList("list"); List> list=(List>)bundleList.get(0); //遍历输出


3、通过实现Serializable接口传递参数
 初始化数据:

Map map=new HashMap(); map.put("aaa","hello"); map.put("bbb","world");                                                              Bundle bundle=new Bundle(); bundle.putSerializable("map",map); Intent intent=new Intent(); intent.putExtras(bundle);


参数接收:

Bundle bundle=getIntent().getExtras(); //HashMap没问题 //LinkedHashMap,转换时会抛出ClassCastException,何解 Map map=(Map)bundle.getSerializable("map"); //遍历输出 


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

Parcelable实现要点:需要实现三个东西

1)writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中.声明如下:

writeToParcel (Parcel dest, int flags) 具体参数含义见javadoc

2)describeContents方法。没搞懂有什么用,反正直接返回0也可以

3)静态的Parcelable.Creator接口,本接口有两个方法:

createFromParcel(Parcel in) 实现从in中创建出类的实例的功能

newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。估计本方法是供外部类反序列化本类数组使用。

定义一个DataParcelable实现Parcelable接口,将要传输的数据定义在这个类里面:

package com.xin.activity;                                                        import java.util.HashMap; import java.util.Map;                                                        import android.os.Parcel; import android.os.Parcelable;                                                        public class DataParcelable implements Parcelable{     //定义要被传输的数据     public int age;     public String username;     public String password;     public Map map=new HashMap();                                                            @Override     public int describeContents() {         return 0;     }                                                            /**     * 类的数据写入外部提供的Parcel     */     @Override     public void writeToParcel(Parcel out, int flags) {         //将数据映射到Parcel中去         out.writeInt(age);         out.writeString(username);         out.writeString(password);         out.writeMap(map);     }                                                                public static final Parcelable.Creator CREATOR=new Parcelable.Creator() {                                                                /**         * 创建出类的实例         */         @SuppressWarnings("unchecked")         @Override         public DataParcelable createFromParcel(Parcel in) {             DataParcelable data=new DataParcelable();             //将映射在Parcel对象中的数据还原出来             //这里的顺序一定要和writeToParcel中定义的顺序一致才行             data.age=in.readInt();             data.username=in.readString();             data.password=in.readString();             data.map=in.readHashMap(HashMap.class.getClassLoader());             return data;         }                                                                @Override         public DataParcelable[] newArray(int size) {             return new DataParcelable[size];         }     }; }

注意上面方法中createFromParcel读取的顺序要和writeToParcel写入的顺序一致才行,这样才能保证相同数据类型的数据能够按顺序被读取出来!里面是这样的一个设计机制.

初始化DataParcelable数据并将其放到Intent对象中去:

Intent intent=new Intent(MainActivity.this,OtherActivity.class); DataParcelable data=new DataParcelable(); data.age=23; data.username="hello"; data.password="world"; data.map=new HashMap(); data.map.put("aaa","123"); data.map.put("bbb","456"); intent.putExtra("data", data); startActivity(intent);

读取DataParcelable中的数据:

         Intent intent=getIntent(); DataParcelable data=intent.getParcelableExtra("data"); System.out.println("age="+data.age+",username="+data.username+",password="+data.password+",map="+data.map);大家根据自己的需要和使用场景,选择自己的数据存储方式吧!!

更多相关文章

  1. 【Frida Hook 学习记录】Frida Hook Android(安卓)常用方法
  2. 往Android的Application对象里存储数据的陷阱
  3. Android(安卓)Service 服务—— bindService与remoteService
  4. android 异步加载
  5. Android(安卓)数据持久化方式
  6. Android系列学习:JSON解析
  7. Android(安卓)View事件派发机制详解与源码分析
  8. Android动态获取权限,多组权限
  9. Android(安卓)ormlite 框架介绍

随机推荐

  1. (转)boot.img的结构
  2. 使用proguard进行代码混淆时的问题
  3. Android(安卓)获取控件高度宽度三种方法,
  4. android中Application使用
  5. XML 常见符号的实体定义:用在 Android(安
  6. android源代码下载、编译、刷机、编译模
  7. Android(安卓)8 wifi 扫描时间间隔
  8. 应用程序文件Android安全分析挑战:运行时
  9. android客户端序列化对象提交,服务器反序
  10. android Toast大全(五种)