您的位置:首页 > 移动开发 > Android开发

Android 之数据传递小结

2014-11-17 11:39 134 查看
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 += "\r\n"+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 +"\r\n mStr" + p.mStr + "\r\n 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 +="\r\n key----> "+(String)key;
sResult +="\r\n value----> "+(String)value;
}
txt.setText(sResult);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: