数据回传机制
Activity中有一个startActivityForResult()方法也可以用来启动服务,但这个方法期望在活动销毁的时候(finish())能够返回一个结果给上一个活动
- 跳转页面
Intent intent = new intent(this,SecondActivity.class);
//使用startActivityForResult方法开启新的Activity
参数:Intent对象,请求吗(用于判别数据的来源)
startActivityForResult(intent,1);
- 返回数据
Intent intent = getIntent();
//装入返回数据
intent.putExtra(“extra_data","hello");
//返回源页面
setResult(RESULT_OK,intent);
//销毁当前活动
finish();
- 接收数据
//在SecondActivity销毁后,自动回调onActivityResult方法
protected void onActivityResult(int requestCode , int resultCode , Intent data){
super.onActivityResult(requestcode,resultcode,data);
if(requestCode==1){
if(resultCode==RESULT_OK){
String s = intent.getStringExtra("extra_data");
}
}
}
- 如果用户在SecondActivity中并不是用过点击按钮返回,而是通过按下Back键返回到FirstActivity
//在SecondActivity中重写onBackPressed
@Override
public void onBackPressed(){
Intent intent = new Intent();
intent.putExtra("data_return","elll");
setResult(RESULT_OK,intent);
//销毁当前活动
finish();
}
Android中,Activity和Fragment之间传递对象有两种方法:
* 可以通过“对象序列化”并存入Bundle或者Intent中进行传递,
- 序列化对象可以实现Java的Seriallizable,Parcelable接口
* 也可以将对象转换为JSON格式的字符串,进行传递
- 转换为JSON字符串,需要用到Gson的库
1、Serializable接口
1)
public class Author implements Serializable{
private int id;
private String name;
//...
}
2)传递数据
Author author = new Author();
author.setId("1");
author.setName("zz");
Intent intent = new Intent(this,SecondActivity.java); intent.putExtra("author",author);
startIntent(intent);
3)接收数据
Author author=(Author)getIntent().getSeriallizableExtra("book“);
2、转换为JSON格式数据
1)
public class Author{
private int id;
private String name;
//... }
2)发送数据
Author author=new Author();
author.setId(1);
author.setName("Bruce Eckel");
Intent intent = new Intent(this,SecondActivity.class);
//Intent装入JSON数据
intent.putExtra("author",new Gson().toJson(author));
startIntent(intent);
3)接收数据
String authorJson = getIntent().getStringExtra("author");
//new一个JSON对象,将JSON格式的字符串-->目标对象
Author author = new Gson().fromJson(authorJson , Author.class);
3、Parcelable接口
实现Parcelable接口需要实现两个方法:
* describeContents方法:内容接口描述,默认返回0即可
* writeToParcel方法:将传递的数据打包到Parcel容器中
1)
public class Author implements Parcelable{
private int id;
private String name;
@Override
public int describeContents(){
return 0;
}
@Override
public void writeToParcel(Parcel dest,int flags){
//该方法将类的数据写入到外部提供的Parcel中,即打包需要传递的数据到Parcel容器爆粗
//以便从Parcel容器获取数据
dest.writeString(name);
dest.writeInt(id);
}
public static final Creator<Author> CREATOR=new Creator<Author>(){
@Override
public Author crateFromParcel(Parcel source){
//从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层
Author author = new Author();
author.setName(source.readString());
author.setId(source.readInt());
return author;
}
@Override
public Author[] newArray(int size){
//创建一个类型为T,长度为size的数组,进一句话return new T[size]即可。
//方法是提供外部类反序列化本类数组使用
return new Author[size];
}
};
}
2)传递数据
Author author = new Author();
author.setId("1");
author.setName("zz");
Intent intent=new Intent(this,SecondActivity.class);
intent.putExtra("Author",author);
startActivity(intent);
3)接收数据
Author author = getIntent().getParcelableExtra("author");
总结分析:
可以看出,通过转换为字符串的速度是最慢的。
Seralizable次之,Parcelable比Seralizable快10倍。
所以从性能上考 虑,我们必定优先选择Parcelable。
速率:Parcelable>Serializable>JSON
-----------------------------------------------------------------------------------
但是Parcelable有大量重复的模板代码,如何简化这些操作?
简化Parcel操作:
如果你使用android Studio 可以通过安装android-parcelable-intellij-plugin插件,或者自己配置模板进行操作
Parceler使用非常简单:
1、在定义Model时用@Parcel进行注解
@Parcel
public class Author {
int id;
String name;
//setter & getter...
}
2、在传递数据的时候使用Parcels的wrap方法来包装成一个Parcelable对象。
-Intent intent=new Intent(this,SecondActivity.class);
intent.putExtra("Author", Parcels.wrap(author));
startActivity(intent);
3、获取数据时用Parcels的unwrap方法来获取对象。
Author author=Parcels.unwrap(getIntent().getParcelableExtra("book"));