数据回传机制

    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"));