您的位置:首页 > 其它

Activity之间参数传递方式

2016-05-05 14:43 344 查看
在Android中的Activity中,我们会经常的进行数据的交互,本文就是针对使用频繁的Activity与Activity之间的几种数据传递方式进行了解以及使用。

Activity之间的数据传递,我总结了,大概常见的有4中,Intent传递简单数据Bundle传递数据包传递值对象获取Activity的返回参数,废话不多说,一一道来。

1 . Intent传递简单数据

Intent是四大组件之间的联系纽带,他可以携带一些简单的数据进行交互。

MainActivity

Intent intent = new Intent(MainActivity.this,OtherActivity.class);

intent.putExtra("name","MirGao");

intent.putExtra("age","24");

startActivity(intent);


OtherActivity

Intent intent = getIntent();

tv.setText(intent.getStringExtra("name") + "  " + intent.getStringExtra("age"));


以上代码简单易懂,下面我们看第二种方式。

2 . Bundle传递数据包

MainActivity

Intent intent = new Intent(MainActivity.this,OtherActivity.class);

Bundle bundle = new Bundle();

bundle.putString("name","MirGao");
bundle.putString("age","24");

intent.putExtras(bundle);
startActivity(intent);


OtherActivity

Intent intent = getIntent();

Bundle b = intent.getExtras();

tv.setText(b.getString("name") + "  " + b.getString("age"));


通过使用Bundle可以传递稍微复杂的数据,进行数据交互。

3 . 传递值对象

所谓的值对象,就是我们通常在项目中自定义的,有数据类型的。

那我们就先自定义一个数据类型

public class UserBean implements Serializable{

private String name;
private String age;

public UserBean(String name, String age) {
this.name = name;
this.age = age;
}

public void setName(String name) {
this.name = name;
}

public void setAge(String age) {
this.age = age;
}

public String getName() {
return name;
}

public String getAge() {
return age;
}
}


在这里我们定义了两个都是String类型的参数,并且实现了Serializable接口。使我们的自定义数据类型进行数据序列化

MainActivity

Intent intent = new Intent(MainActivity.this,OtherActivity.class);

intent.putExtra("UserBean",new UserBean("MirGao","24"));

startActivity(intent);


直接进行自定义对象的传递,并赋予两个参数

OtherActivity

UserBean userBean ;

userBean = (UserBean) getIntent().getSerializableExtra("UserBean");

tv.setText(userBean.getName() + "  " + userBean.getAge());


使用UserBean对象获取序列化后的对象并进行强制转换,并通过获取的对象,进行操作。

使用序列化很简单,方便的可以进行复杂,大量数据的传递,但是Serializable与Parcelable相比而言 效率比较低 ,所以Android平台又给我们提供了Parcelable,他是一个专门针对移动工具上数据序列化的接口,那么,下面我们就来进行学习。

UserBean

public class UserBean implements Parcelable{

private String name;
private String age;

public UserBean(String name, String age) {
this.name = name;
this.age = age;
}

protected UserBean(Parcel in) {
name = in.readString();
age = in.readString();
}

public void setName(String name) {
this.name = name;
}

public void setAge(String age) {
this.age = age;
}

public String getName() {
return name;
}

public String getAge() {
return age;
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(getName());
dest.writeString(getAge());
}

public static final Creator<UserBean> CREATOR = new Creator<UserBean>() {
@Override
public UserBean createFromParcel(Parcel in) {
return new UserBean(in.readString(),in.readString());
}

@Override
public UserBean[] newArray(int size) {
return new UserBean[size];
}
};

}


我们实现了Parcelable接口,并且实现了3个方法,

writeToParcel

这个方法中是需要我么去手动读取的,我们把我们要传递的变量保存,以供其他的成员变量或者组件使用,那么再来看如何获取,很简单

OtherActivity

UserBean userBean = getIntent().getParcelableExtra("UserBean");

tv.setText(userBean.getName() + "  " + userBean.getAge());


这时,我们依然成功的获取到了传递过来值。

小结

Serializable和Parcelable都是序列化接口,因为Serializable简单,方便,Android系统对他有自动完成序列化的操作,所以速度是比较慢的。而Parcelable中都是手动去添加数据类型,读取数据,Android系统并没有给我们提供序列化机制,所以Parcelable的数据是相对复杂的,但是速度是比较快的。所以在使用时,注意优缺点选择。


4 . 获取Activity的返回参数

这部分就是activity的回调机制,这个比较简单,就不多说了,上上代码

MainActivity

public class MainActivity extends AppCompatActivity {

private Button next_btn;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

next_btn = (Button) findViewById(R.id.button);

next_btn.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,OtherActivity.class);

intent.putExtra("UserBean",new UserBean("MirGao","24"));
startActivityForResult(intent,1);
}
});
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == 1){
if (requestCode == 1){
// TODO
//做你需要做的操作
}
}

}
}


OtherActivity

public class OtherActivity extends Activity {

private TextView tv;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.other);

tv = (TextView) findViewById(R.id.tv);

UserBean userBean = getIntent().getParcelableExtra("UserBean");
tv.setText(userBean.getName() + "  " + userBean.getAge());

setResult(1);
}
}


到这里,Activity的四种基本常见的传递数据的方式就差不多说完了,菜鸟一只,如果可以帮到你,你就多来逛逛吧!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: