Android--数据回传机制--传递对象

数据回传机制

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值