zoukankan      html  css  js  c++  java
  • 安卓通过putExtra传递数据的几种方式

    通过intent传递数据时,使用以下代码报错:

    hMap<string, object=""> map=(Map<string, object="">) parent.getItemAtPosition(position);
    				intent.putExtra("userInfoMap", map);


    但是使用以下的代码是正常的:

    HashMap<string, object=""> map=(HashMap<string, object="">) parent.getItemAtPosition(position);
    				intent.putExtra("userInfoMap", map);

    这是为啥呢,作为小白的我上网查找了一番,发现只有能序列化的数据才能放进去,intent传递数据的方法有以下几个:

    Intent 	putExtra(String name, String[] value)
    Intent 	putExtra(String name, Parcelable value)
    Intent 	putExtra(String name, long value)
    Intent 	putExtra(String name, boolean value)
    Intent 	putExtra(String name, double value)
    Intent 	putExtra(String name, Parcelable[] value)
    Intent 	putExtra(String name, char value)
    Intent 	putExtra(String name, int[] value)
    Intent 	putExtra(String name, int value)
    Intent 	putExtra(String name, double[] value)	 	 	 	
    Intent 	putExtra(String name, short value) 	 	 	 	 	
    Intent 	putExtra(String name, long[] value) 	 	 	 	 	
    Intent 	putExtra(String name, boolean[] value) 	 	 	 	 	
    Intent 	putExtra(String name, short[] value) 	 	 	 	 	
    Intent 	putExtra(String name, String value) 	 	 	 	 	
    Intent 	putExtra(String name, Serializable value) 	 	 	 	 	
    Intent 	putExtra(String name, float[] value) 	 	 	 	 	
    Intent 	putExtra(String name, Bundle value) 	 	 	 	 	
    Intent 	putExtra(String name, byte[] value) 	 	 	 	 	
    Intent 	putExtra(String name, CharSequence value) 	 	 	 	 	
    Intent 	putExtra(String name, char[] value) 	 	 	 	 	
    Intent 	putExtra(String name, byte value) 	 	 	 	 	
    Intent 	putExtras(Intent src) 	 	 	 	 	
    Intent 	putExtras(Bundle extras)

    可以看到其可以传递的包括基本数据类型(含基本数据类型的数组)、String(包含数组)、Parcelable(包含数组)、Serializable、Bundle、CharSequence、Intent几种类型的数据。对于Map类型(超类)的数据以及Long,Integer,Double,Byte,Float,Short,由于没有 实现序列化接口,所以无法通过这种方法传递值

    对于序列化数据的传递方式,可以采用如下方式传递

    提交activity

     lst.setOnItemClickListener(new OnItemClickListener() {
        
        public void onItemClick(AdapterView parent, View view,
          int position, long id) {
         
         HashMap map=(HashMap) parent.getItemAtPosition(position);
         Intent intent=new Intent();
         intent.setClass(btsAllinfoActivity.this,btsMapActivity.class);
         intent.putExtra("bts_map", map);       
         startActivity(intent);
         
        }
       });


    接收数据activity

    Intent intent=getIntent();  
    map=(HashMap)intent.getSerializableExtra("bts_map");  
      System.out.println("111111111111");
      System.out.println(map.get("bt_id"));
      System.out.println(map.get("bt_name"));
      System.out.println(map.get("bt_lon"));
      System.out.println(map.get("bt_lat"));
      System.out.println("111111111111");

    对于Bundle类型的数据,可以采用如下方式:

    提交activity

     
    HashMap map=(HashMap) parent.getItemAtPosition(position);
         Intent intent=new Intent();
         intent.setClass(btsAllinfoActivity.this,btsMapActivity.class);
         Bundle bundle = new Bundle();   
         bundle.putSerializable("bts_map", map);
         intent.putExtras(bundle);
         
         startActivity(intent);




    接收activity

    Bundle bundle = getIntent().getExtras();
      
      map=(HashMap)bundle.getSerializable("bts_map");
      
      System.out.println("111111111111");
      System.out.println(map.get("bt_id"));
      System.out.println(map.get("bt_name"));
      System.out.println(map.get("bt_lon"));
      System.out.println(map.get("bt_lat"));
      System.out.println("111111111111");
    


    对于Parcelable类型的数据

    对于Android来说传递复杂类型,主要是将自己的类转换为基础的字节数组,Activity之间传递数据是通过Intent实现的。

    Android序列化对象主要有两种方法,实现Serializable接口、或者实现Parcelable接口。

    实现Serializable接口是JavaSE本身就支持的,而Parcelable是Android特有的功能,效率比实现Serializable接口高,

    而且还可以用在进程间通信(IPC)中。实现Serializable接口非常简单,声明一下就可以了。

    而实现Parcelable接口稍微复杂一些,但效率更高,推荐用这种方法提高性能。
    Parcelable接口的作用:实现了Parcelable接口的实例可以将自身的状态信息(状态信息通常指的是各成员变量的值)写入Parcel,

    也可以从Parcel中恢复其状态。Parcel用来完成数据的序列化传递。

    对于Parcel数据的传递方式,可以采用如下方式传递

    通过实现Parcelable接口序列化对象的步骤:
    
    1、实现Parcelable接口。
    2、并且实现Parcelable接口的public void writeToParcel(Parcel dest, int flags)方法 。
    3、自定义类型中必须含有一个名称为CREATOR的静态成员,该成员对象要求实现Parcelable.Creator接口及其方法。

    实体类实现接口:

    public class Person implements Parcelable {
     
        public static final Parcelable.Creator CREATOR = new Creator() {
     
            @Override
            public Person[] newArray(int size) {
                return null;
            }
     
            @Override
            public Person createFromParcel(Parcel source) {
                Person result = new Person();
                result.age = source.readInt();
                result.name = source.readString();
                result.address = source.readParcelable(Address.class.getClassLoader());
                return result;
            }
        };
        private Address address;
        private String name;
        private int age;
     
        @Override
        public int describeContents() {
            return 0;
        }
     
        public Address getAddress() {
            return address;
        }
     
        public void setAddress(Address address) {
            this.address = address;
        }
     
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(age);
            dest.writeString(name);
            dest.writeParcelable(address, PARCELABLE_WRITE_RETURN_VALUE);
        }
     
        public String getName() {
            return name;
        }
     
        public void setName(String name) {
            this.name = name;
        }
     
        public int getAge() {
            return age;
        }
     
        public void setAge(int age) {
            this.age = age;
        }
     
        @Override
        public String toString() {
            return "Person [address=" + address + ", name=" + name + ", age=" + age
                    + "]";
        }
     
    }
    //官方的文档里说在不同进程之间使用Parce,在同进程内使用Bind,
    public void sendBroadCast(View viwe){
        Log.d("test",Thread.currentThread().getName()+ "发送了一个消息给广播");
        Person person = new Person();
        person.setAge(18);
        Address address = new Address();
        address.setStreet("延陵南路");
        person.setName("carlos");
        person.setAddress(address);
        Intent intent = new Intent("aaaa");
        intent.setClass(this, SendActivity.class);
    //    intent.putParcelableArrayListExtra(name, value)
        intent.putExtra("person", person);
        startActivity(intent);
        }
  • 相关阅读:
    HDU1285-确定比赛名次(拓扑排序)
    ftp sftp
    Python with 用法
    odoo 非root用户运行不成功
    linux 删除软连接
    vscode wsl php
    WSL 修改默认登录用户为root
    WSL ssh服务自启动
    odoo 获取model的所有字段
    odoo 在"动作"("Action")菜单中添加子菜单, 点击子菜单弹窗自定义form
  • 原文地址:https://www.cnblogs.com/wangfeng520/p/5044600.html
Copyright © 2011-2022 走看看