Android五种数据传递方法

来源:互联网 发布:mac美国官网砍单 编辑:程序博客网 时间:2024/05/18 20:12

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

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

1.1 设置参数

//传递些简单的参数  

Intent intent = new Intent();  

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

Bundle bundle = new Bundle();  

bundle.putString("name", "zhouqingpeng"); 

bundle.putString("pwd", "123456"); 

intent.putExtras(bundle);  

startActivity(intent);  

1.2 接收参数

//接收参数  

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

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

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

 

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

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

2.1 设置参数

//传递复杂些的参数  

Map map1= new HashMap();  

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

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

List<Map> list = new ArrayList<Map>();  

list.add(map1);  

Intent intent = new Intent();  

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

Bundle bundle = new Bundle();  

//须定义一个list用于在budnle中传递需要传递的ArrayList

ArrayList bundlelist = new ArrayList();   

bundlelist.add(list);   

bundle.putParcelableArrayList("list",bundlelist); 

intent.putExtras(bundle);               

startActivity(intent);  

2.2 接收参数

//接收参数  

Bundle bundle = getIntent().getExtras();   

ArrayListlist = bundle.getParcelableArrayList("list");  

       //从List中将参数转回List<

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

         StringsResult = "";  

         for (Map m : lists)    

         {   

            for (String k : m.keySet())    

            {    

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

            }            

}    

3. 通过实现Serializable接口

3.1 设置参数

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

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

HashMap map2= new HashMap();  

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 接收参数

   //接收参数  

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

   //如果传 LinkedHashMap,则bundle.getSerializable转换时会报

//ClassCastException,不知道什么原因  

   //传HashMap倒没有问题。       

   HashMap map = (HashMap)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接口

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

public class XclParcelable implements Parcelable {  

    //定义要被传输的数据  

    public int mInt;  

    public String mStr;  

    public HashMap mMap = new HashMap();  

    public int describeContents() {  

        return 0;  

    }  

    public void writeToParcel(Parcel out, intflags) {  

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

        out.writeInt(mInt);         

        out.writeString(mStr);  

        out.writeMap(mMap);  

    }   

    public static final Parcelable.Creator CREATOR  

            = new Parcelable.Creator(){  

        public XclParcelablecreateFromParcel(Parcel in) {  

            return newXclParcelable(in);  

        }  

        public XclParcelable[]newArray(int size) {  

            return newXclParcelable[size];  

        }  

    };  

    private XclParcelable(Parcel in) {  

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

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

        mInt = in.readInt();         

        mStr  = in.readString(); 

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

    }  

    public XclParcelable() {  

        // TODO Auto-generatedconstructor stub  

    }  

}  

4.2  设置参数

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

Intent intentParcelable = new Intent();                  

XclParcelable xp = new XclParcelable();              

xp.mInt = 1;  

xp.mStr = "字符串";  

xp.mMap = new HashMap();  

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

intentParcelable.putExtra("Parcelable", xp);                     

intentParcelable.setClass(MainActivity.this,ParcelableActivity.class);    

startActivity(intentParcelable);     

4.3 接收参数

    this.setTitle("Parcelable例子");  

     //接收参数  

     Intent i = getIntent();    

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

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

     tv.setText("mInt="+xp.mInt+"\r\nmStr"+xp.mStr+"\r\nsize()="+xp.mMap.size()); 

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

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

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

5.1  定义一个单实例的类

//单例模式  

public class XclSingleton  

{  

    //单例模式实例  

    private static XclSingleton instance =null;  

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

    public synchronized static XclSingletongetInstance(){  

        if(instance == null){  

            instance = newXclSingleton();  

        }     

        return instance;  

    }     

    final HashMap mMap;  

    public XclSingleton()  

    {  

        mMap = new HashMap();  

    }  

    public void put(String key,Object value){ 

        mMap.put(key,value);  

    }  

    public Object get(String key)  

    {  

        return mMap.get(key);  

    }  

}  

5.2 设置参数

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

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

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

Intent intentSingleton = new Intent();               

intentSingleton.setClass(MainActivity.this,   

                       SingletonActivity.class);                    

startActivity(intentSingleton);   

5.3 接收参数

HashMap 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;               

        }

0 0