Android 之数据传递小结
2014-11-17 11:39
134 查看
Android开发中,在不同模块(如Activity)间经常会有各种各样的数据需要相互传递,常用的的有五种传递方式。它们各有利弊,有各自的应用场景。下面分别介绍一下:
1、 Intent对象传递简单数据
Intent的Extra部分可以存储传递的数据,可以传送int, long, char等一些基础类型。
[1]发送页面:
[2]接收页面:
2.、Intent对象传递复杂数据(引入java.util.*)
有时候传递如ArrayList之类复杂些的数据,这种原理是和上面一种是一样的,只是在传参数前,要用新增加一个List将对象包起来。如下:
[1]发送页面:
[2]接收页面:
3、通过实现Serializable接口(引入java.util.*)
通过将数据序列化后,再将其传递出去。
(1)发送页面:
(2)接收页面:
4、通过实现Parcelable接口
通过实现Parcelable接口,把要传的数据打包在里面,然后在接收端自己分解出来。这个是Android独有的,在其本身的源码中也用得很多,
效率要比Serializable相对要好。
(1)首先要定义一个类,用于 实现Parcelable接口
实现Parcelable
(2)发送页面
(3)接收页面
5、通过单例模式实现参数传递
(1)单例模式的特点就是可以保证系统中一个类有且只有一个实例。这样很容易就能实现,在A中设置参数,在B中直接访问了,是效率最高的。
单例模式
(2)发送页面
(3)接收页面
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); }
相关文章推荐
- ASP.NET页面间数据传递小结
- Web程序中网页间数据传递方法小结
- android中intent传递数据的方式
- 【Android中级教程(三)之不同Activity之间的数据传递---Bundle对象的使用】的改进!
- Android之Bundle传递数据详解与实例及Bundle与SharedPreferences的区别
- ASP.NET页面间数据传递小结
- 关于Android中传递数据的一些讨论
- Android数据传递相关内容概述
- ASP.NET 页面间数据传递方法小结
- 关于Android中传递数据的一些讨论
- Web程序中网页间数据传递方法小结
- Android如何在Activity和Service之间传递数据
- Web程序中网页间数据传递方法小结
- 网页间数据传递方法小结
- Android开发循序渐进实例2--画面间数据传递例子
- Web程序中网页间数据传递方法小结
- Web程序中网页间数据传递方法小结
- Android中级教程(三)之不同Activity之间的数据传递---Bundle对象的使用!
- Android如何在Activity和Service之间传递数据
- 关于Android中传递数据的一些讨论