• 热门专题

Intent传递数据

作者:  发布日期:2015-06-24 22:09:56
Tag标签:数据  
  • 出处: http://blog.csdn.net/forwardyzk/article/details/46620021

    在界面跳转的时候,我们使用Intent,Intent怎样传递数据,可以传递什么数据呢.下面我们就以下这几方便做介绍.

    1.Intent传递怎样传递数据

    2.Intent可以传递什么类型数据

    2.1.Intent传递基本数据和基本数据数组

    2.2.Intent传递Parcelable对象

    2.3.Intent传递Serializable对象

    2.4.Intent传递String,Integer,CharSequence泛型集合

    2. 5.Intent传递基本自定义对象集合

    3.怎样使用startActivityForResult,OnActivityResult,setResut之间的怎样传递数据

    Intent怎样传递数据

    Intent之间传递数据是通过Bundle传递.

    查看Intent对象的方法putExtra方法的源码.

    这里是以传递int类型的数据为例,你也可以查看传递其他类型数据的方法.经查看源码,发现其实就是把传递的key-value放在了mExtras对象中,就是Bundle对象中.

    获取数据的时候,我们在目标Activity中,先获取Intent对象(getIntent()),然后使用getXXX方法,通过key获取值

    Intent可以传递什么类型的数据

    Intent传递基本数据和基本数据数组

    在MainActivity开启BaseActivity

    在ManActivity中传递数据

    public final static String BASE = "base";
     
    /**
         * 传递基本对象数据,和数组
         */
        public void base() {
            Intent intent = new Intent(MainActivity.this, BaseActivity.class);
            intent.putExtra(BASE, 110);
            startActivity(intent);
        }

     

    在BaseAcitvity获取MainActvity传递过来的数据

     

    private void initData() {
            //获取Intent后,通过key获取对应的值,然后把值设置给TextView
            int base = getIntent().getIntExtra(MainActivity.BASE, 0);
            tv.setText(String.valueOf(base));
        }
    

     

    这里就以int类型为例,其他的基本数据类型用法和这是一样的.

    Intent传递Parcelable对象

    我们先看官方文档是怎样实现这个接口的

    必须重写writeToparcel和describeContents方法,必须创建一个Parcelable.Create 类型的CREATOR对象.

    首先要自定义Persion类,实现Parcelable接口.

     

    public class Persion implements Parcelable {
        private String name;
        private int age;
    
        public Persion() {
        }
    
        public Persion(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        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 "Persion{" +
                    "name='" + name + ''' +
                    ", age=" + age +
                    '}';
        }
    
        public static final Parcelable.Creator<Persion> CREATOR = new Parcelable.Creator<Persion>() {
    
            @Override
            public Persion createFromParcel(Parcel source) {
                Persion persion = new Persion();
                persion.name = source.readString();
                persion.age = source.readInt();
                return persion;
            }
    
            @Override
            public Persion[] newArray(int size) {
                return new Persion[size];
            }
        };
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(name);
            dest.writeInt(age);
        }
    }

    在MainActivity开启ParceActivity.

     

    在ManActivity传递Parcelable类型数据

     

    /**
         * 传递Parcelable对象
         */
        public void parce() {
            Persion persion = new Persion();
            persion.setName("张三");
            persion.setAge(20);
            Intent intent = new Intent(MainActivity.this, ParceActivity.class);
            intent.putExtra(PARCE, persion);
            startActivity(intent);
        }

    在ParceActivity获取数据

     

     

     TextView tv = (TextView) findViewById(R.id.tv);
            Persion p = getIntent().getParcelableExtra(MainActivity.PARCE);
            tv.setText(p.toString());

    使用的是getParcelableExtra方法,通过key获取值.

     

    Intent传递Serializable对象

    自定义Student类实现Serializable接口

     

    public class Student implements Serializable {
        private  String stuName;
        private  String stuClassName;
    
        public Student(String stuName, String stuClassName) {
            this.stuName = stuName;
            this.stuClassName = stuClassName;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "stuName='" + stuName + ''' +
                    ", stuClassName='" + stuClassName + ''' +
                    '}';
        }
    }
    
    在MainActivity开启SerActivity

     

    在MainActivity传递数据

     

      public final static String SERCI = "serci";
        /**
         * 传递Serializable对象
         */
        public void serial() {
            Student student = new Student("李四", "计算机一班");
            Intent intent = new Intent(MainActivity.this, SerActivity.class);
            intent.putExtra(MainActivity.SERCI, student);
            startActivity(intent);
        }

    在SerActivity获取传递的数据

     

     

    TextView tv = (TextView) findViewById(R.id.tv);
            Student s = (Student) getIntent().getSerializableExtra(MainActivity.SERCI);
            tv.setText(s.toString());

     

    当我们传递自定义类的时候,我们是要实现Parcelable还是实现Serializable.

     

    实现Serializable接口是为了将对象转化为字节流,可以存到本地外存储设备上,或者通过网络传输,当使用此对象的时候,可以讲此字节流重新序列化为对应的对象.

    实现Parcelable对象,其不能将对象存到本地外存储设置上,因为parcelable是轻量级的序列化和反序列化机制,全部是在内存中进行序列化和反序列华化,效率比较高.

     

    建议:

    当你的对象需要在外部存储设备上存储,那么就实现Serializable接口,如果你的对象只是在界面之间传递,不需要存储的本地外存储设备,还是最好实现Parcelable对象.

     

    Intent传递String,Integer,CharSequence泛型集合

    这里以String类型的集合为例,

    在MainActivity中开启ListActivity

    在MainActivity传递数据

     

    /**
         * 传递基本数据List集合,只有传递String,Integer,CharSequence泛型的集合
         */
        public void list() {
            ArrayList<String> stringList = new ArrayList<String>();
            stringList.add("abc");
            stringList.add("def");
            stringList.add("123");
            stringList.add("456");
            Intent intent = new Intent(MainActivity.this, ListActivity.class);
            intent.putStringArrayListExtra(MainActivity.LIST, stringList);
            startActivity(intent);
        }

     

    在ListActiviy获取数据

     

     

    TextView tv = (TextView) findViewById(R.id.tv);
            //获取String List
            List<String> stringList = getIntent().getStringArrayListExtra(MainActivity.LIST);
            //拼接集合中的String
            boolean flag = true;
            StringBuffer sb = new StringBuffer();
            sb.append("[");
            for (String s : stringList) {
                if (flag) {
                    sb.append(s);
                    flag = false;
                } else {
                    sb.append(",").append(s);
                }
            }
            sb.append("]");
            tv.setText(sb.toString());

     

     

    Intent传递基本自定义对象集合

    传递自定对象的集合,自定义对象必须实现Parcelable

    在MainActivity中开启CustomActivity

    在MainActivity传递数据

    使用putParcelableArrayListExtra方法传递数据

     

    /**
         * 传递自定义bean泛型集合,bean必须继承Parcelable
         */
        public void custom() {
            ArrayList<Persion> pList = new ArrayList<Persion>();
            pList.add(new Persion("张三", 30));
            pList.add(new Persion("李四", 31));
            pList.add(new Persion("王五", 32));
            Intent intent = new Intent(MainActivity.this, CustomActivity.class);
            intent.putParcelableArrayListExtra(MainActivity.CUSTOM, pList);
            startActivity(intent);
            Bundle bundle = new Bundle();
        }

     

    在CustomActivity获取数据

    使用getParcelableArrayListExtra获取数据

     

    TextView tv = (TextView) findViewById(R.id.tv);
            //获取persionList
            List<Persion> persionList = getIntent().getParcelableArrayListExtra(MainActivity.CUSTOM);
            //拼接集合中的Persion
            boolean flag = true;
            StringBuffer sb = new StringBuffer();
            sb.append("[");
            for (Persion persion : persionList) {
                if (flag) {
                    sb.append(persion.toString());
                    flag = false;
                } else {
                    sb.append(",").append(persion.toString());
                }
            }
            sb.append("]");
            tv.setText(sb.toString());

    怎样使用startActivityForResult,OnActivityResult,setResut之间的怎样传递数据

     

    在MainActivity中使用startActivityForResult开去ForResultActivity,必须要在MainActiviy中重写OnActivityResult方法,当ForResultActivity界面finish()掉后,会自动的调用MainActivity中的OnActivityResult方法.

    如果在ForResultActivity界面中要传递数据给MainAcitivity,就是用setResult方法传递,一定要保证setResult方法是在finish()之前调用的.如果不需要ForResultActivity界面传递给MainActivity,就不需要使用setResult方法

    当点击返回键的时候,界面直接finish掉了,不能保证finish之前调用setResult方法,所以要ForResultActivity中重写onBackPressed方法.

    在MainActivity界面传递数据

     

    public final static String FORRESULT = "forresult";
        public  final  static  int RESULT_OK=100;
        private void forResult() {
            Intent intent = new Intent(MainActivity.this, ForResultActivity.class);
            intent.putExtra(FORRESULT, "for result");
    //        startActivity(intent);
            startActivityForResult(intent, RESULT_OK);
    
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            switch (requestCode) {
                case RESULT_OK:
                    String str = data.getStringExtra(FORRESULT);
                    Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
                    break;
            }
        }

    在ForResultAcitivity传递回去数据

     

     

    public class ForResultActivity extends ActionBarActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_for_result);
            //获取MainActivity传递过来的数据
           String forResult= getIntent().getStringExtra(MainActivity.FORRESULT);
            findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    //                Intent intent=new Intent();
    //                intent.putExtra("bb","aa");
                    setResult(MainActivity.RESULT_OK,getIntent());//将MainActivity传过来的数据传递回去,也可以创建新的Intent传回去
                    finish();
                }
            });
        }
    
        @Override
        public void onBackPressed() {
            setResult(RESULT_OK,getIntent());//将MainActivity传过来的数据传递回去,也可以创建新的Intent传回去
            super.onBackPressed();
        }
    }
    


     

    到此Intent传递数据已经介绍完了,其中每个类型只举了一个例子,具体什么类型的,可以查看对应的方法,用法和上面介绍的是一样的.

     

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规