Activity之间参数传递方式
2016-05-05 14:43
344 查看
在Android中的Activity中,我们会经常的进行数据的交互,本文就是针对使用频繁的Activity与Activity之间的几种数据传递方式进行了解以及使用。
Activity之间的数据传递,我总结了,大概常见的有4中,Intent传递简单数据,Bundle传递数据包,传递值对象,获取Activity的返回参数,废话不多说,一一道来。
MainActivity
OtherActivity
以上代码简单易懂,下面我们看第二种方式。
OtherActivity
通过使用Bundle可以传递稍微复杂的数据,进行数据交互。
那我们就先自定义一个数据类型
在这里我们定义了两个都是String类型的参数,并且实现了Serializable接口。使我们的自定义数据类型进行数据序列化
在MainActivity中
直接进行自定义对象的传递,并赋予两个参数
OtherActivity
使用UserBean对象获取序列化后的对象并进行强制转换,并通过获取的对象,进行操作。
使用序列化很简单,方便的可以进行复杂,大量数据的传递,但是,Serializable与Parcelable相比而言 效率比较低 ,所以Android平台又给我们提供了Parcelable,他是一个专门针对移动工具上数据序列化的接口,那么,下面我们就来进行学习。
UserBean
我们实现了Parcelable接口,并且实现了3个方法,
writeToParcel
这个方法中是需要我么去手动读取的,我们把我们要传递的变量保存,以供其他的成员变量或者组件使用,那么再来看如何获取,很简单
OtherActivity
这时,我们依然成功的获取到了传递过来值。
小结
MainActivity
OtherActivity
到这里,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传递数据包
MainActivityIntent 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的四种基本常见的传递数据的方式就差不多说完了,菜鸟一只,如果可以帮到你,你就多来逛逛吧!!
相关文章推荐
- CGI-BIN目录
- hdu4635
- 移植u-boot到mini2440--SPL初探
- @Register指令
- 在静态函数调用指针函数写法
- 如何画Flot折线图
- textarea框换行处理
- ES6 let
- android OTG支持问题整理
- 【深入理解JVM】:垃圾收集(GC)概述
- 十八 访问限制
- c#调用带有安全认证的java webservice
- 大型网站系统架构演化之路
- 图片下载工具类,可更新UI
- plsql中&符号的处理
- 用JXLS和poi导出Excel
- Javascript深入浅出学习笔记(10)
- angularJs-route路由详解
- 树链剖分 spoj 375 Query on a tree(剖分入门)
- 支持向量机SVM推导及求解过程