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