zoukankan      html  css  js  c++  java
  • 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); }
  • 相关阅读:
    编写一个程序的步骤
    vue实现瀑布流
    Vue 解决动态生成列表点击事件无效的问题
    筛选分类列表展示
    php实现类似慕课网,php中文网的分类功能
    在一个页面修改数据,并且ajax刷新数据列表的数据实现。
    记账小程序系统简单规划
    茶叶项目---产品的规格添加
    茶叶商城开发
    后端图片上传
  • 原文地址:https://www.cnblogs.com/xinaixia/p/4103216.html
Copyright © 2011-2022 走看看