Android 之数据传递小结

      Android开发中,在不同模块(如Activity)间经常会有各种各样的数据需要相互传递,常用的的有五种传递方式。它们各有利弊,有各自的应用场景。下面分别介绍一下:

1、 Intent对象传递简单数据

      Intent的Extra部分可以存储传递的数据,可以传送int, long, char等一些基础类型。

[1]发送页面:

Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();     //打包发送
bundle.putString("name","123");    //绑定参数
intent.putExtra("maps",bundle);
startActivity(intent);

[2]接收页面:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TextView tv = new TextView(this);
    Intent intent = this.getIntent();
    Bundle bundle = intent.getBundleExtra("maps");     //获取打包数据bundle
    String name = bundle.getString("name");     //取出需要的数据
    tv.setText(name);
    setContentView(tv);
}

或者

@Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.second);
  TextView txt = (TextView)this.findViewById(R.id.txt);
  Intent intent = this.getIntent();
  Bundle bundle = intent.getBundleExtra("maps");     //获取打包数据bundle
  String name = bundle.getString("name");     //取出需要的数据
  txt.setText(name);
 }

2.、Intent对象传递复杂数据(引入java.util.*)

      有时候传递如ArrayList之类复杂些的数据,这种原理是和上面一种是一样的,只是在传参数前,要用新增加一个List将对象包起来。如下:

[1]发送页面:

//传递复杂些的参数  
Map<String, Object> map = new HashMap<String, Object>();
map.put("1", "传值");  
map.put("2", "成功");  
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
list.add(map);
Intent intent = new Intent(); intent.setClass(MainActivity.this,SecondActivity.class); Bundle bundle = new Bundle(); //须定义一个list用于在bundle中传递需要传递的ArrayList<Object>,这个是必须要的 ArrayList bundlelist = new ArrayList(); bundlelist.add(list); bundle.putParcelableArrayList("list",bundlelist); intent.putExtras(bundle); startActivity(intent);

[2]接收页面:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second);
    TextView txt = (TextView)this.findViewById(R.id.txt);

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 += " "+k + " : " + m.get(k); } } txt.setText(sResult); }

3、通过实现Serializable接口(引入java.util.*)

      通过将数据序列化后,再将其传递出去。

(1)发送页面:

//通过Serializable接口传参数的例子  
HashMap<String,String> hm = new HashMap<String,String>();  
hm.put("1", "传值");  
hm.put("2", "成功");  

Bundle bundle = new Bundle();  
bundle.putSerializable("serializable", hm);  
Intent intent = new Intent();
intent.putExtras(bundleSerializable); 
intent.setClass(MainActivity.this, SecondActivity.class); 
startActivity(intent);   

(2)接收页面:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second);
    TextView txt = (TextView)this.findViewById(R.id.txt);
		
    //接收参数  
   Bundle bundle = this.getIntent().getExtras();  
   //传HashMap
   HashMap<String,String> hm =  (HashMap<String,String>)bundle.getSerializable("serializable"); 
   String sResult = ""; 
   Iterator iter = hm.entrySet().iterator(); 
   while(iter.hasNext()) 
   { 
      Map.Entry entry = (Map.Entry)iter.next(); 
      Object key = entry.getKey(); 
      Object value = entry.getValue(); 
      sResult += (String)key; 
      sResult += (String)value;           
   } 
txt.setText(sResult); }

4、通过实现Parcelable接口

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

(2)发送页面

Intent intent = new Intent();                   
Person p = new Person();               
p.mInt = 1;  
p.mStr = "传值";  
p.mMap = new HashMap<String,String>();  
p.mMap.put("key", "value");                      
intent.putExtra("Parcelable", p);                      
intent.setClass(MainActivity.this, SecondActivity.class);     
startActivity(intent);    

(3)接收页面

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second);
    TextView txt = (TextView)this.findViewById(R.id.txt);
//接收参数 Intent intent = getIntent(); Person p = intent.getParcelableExtra("Parcelable"); String sResult = " mInt ="+ p.mInt +" mStr" + p.mStr + " mMap.size="+p.mMap.size(); txt.setText(sResult); }

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

(1)单例模式的特点就是可以保证系统中一个类有且只有一个实例。这样很容易就能实现,在A中设置参数,在B中直接访问了,是效率最高的。
package com.model;
import java.util.*;

public class XclSingleton {
    //单例模式实例  
    private static XclSingleton instance = null;  
    //synchronized 用于线程安全,防止多线程同时创建实例  
    public synchronized static XclSingleton getInstance(){  
        if(instance == null){  
            instance = new XclSingleton();  
        }     
        return instance;  
    }     
     
    public 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);  
    }       
}
单例模式

(2)发送页面

XclSingleton.getInstance().put("1", "传值");  
XclSingleton.getInstance().put("2", "成功");  		    	  
Intent intent = new Intent();                
intent.setClass(MainActivity.this, SecondActivity.class);                     

startActivity(intent);

(3)接收页面

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second);
    TextView txt = (TextView)this.findViewById(R.id.txt);
//接收参数 
    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 +=" key----> "+(String)key; 
        sResult +=" value----> "+(String)value;               
    }  txt.setText(sResult); }
原文地址:https://www.cnblogs.com/xinaixia/p/4103216.html