Intent传递数据

女排世界杯冠军95932025-05-14 12:16:42

转载请著名出处: 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 CREATOR = new Parcelable.Creator() {

@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 stringList = new ArrayList();

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 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 pList = new ArrayList();

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 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

瑞士历届世界杯成绩
当代中国的彝族妇女形象与文化认同