Intent传递数据

转载请著名出处: 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传递数据已经介绍完了,其中每个类型只举了一个例子,具体什么类型的,可以查看对应的方法,用法和上面介绍的是一样的.

源码下载: http://download.csdn.net/detail/forwardyzk/8834831



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值