Intent 数据传递 总结


系统API
 
       
 
       


可以传递的数据类型
 
       
 
       
1、传递 8大基本类型+String+CharSequence及其数组类型
2、 传递 ArrayList集合
    public Intent put IntegerArrayListExtra(String name, ArrayList<Integer> value)
    public Intent put StringArrayListExtra(String name, ArrayList<String> value)
    public Intent put CharSequenceArrayListExtra(String name, ArrayList<CharSequence> value)
    public Intent put ParcelableArrayListExtra(String name, ArrayList<? extends Parcelable> value)
3、 传递普通对象
     1)将对象转换为Json字符串
     intent.putExtra("book",new Gson().toJson(book));
     Book book=new Gson().fromJson( getIntent().getStringExtra("book") ,Book. class );
     2)使用Serializable、Parcelable序列化对象(注意:B itMap默认实现Parcelable接口)
     public Intent putExtra(String name, Parcelable value)
     public Intent putExtra(String name, Parcelable[] value)

 
        
本质上,以上都是通过Bundle进行传递的。
private Bundle mExtras;  
public  Intent putExtra(String name,  int  value) {
    if (mExtras == null)   mExtras  =  new   Bundle () ;
    mExtras.putInt(name, value);
    return this;
}  
public Intent putExtra(String name, int[] value) {
    if (mExtras == null)  mExtras  =  new   Bundle() ;
    mExtras.putIntArray(name, value);
    return this;
}  

全局变量
 
       
 
       
传来传去不方便,直接定义全局数据
如果想某个数据可以在任何地方都能获取到,可以考虑使用 Application全局对象 ! 
Android系统在每个程序运行的时候创建一个Application对象,而且只会创建一个,所以Application 是单例模式的一个类,而且Application对象的生命周期是整个程序中最长的,他的生命 周期等于这个程序的生命周期。 在任意地方,我们都可以通过MyApp.getInstance()来获得Application的全局对象!

注意事项:
Application对象是存在于内存中的,也就有它可能会被系统杀死,比如这样的场景: 
我们在Activity1中往application中存储了用户账号,然后在Activity2中获取到用户账号,并且显示! 
如果我们点击home键,然后过了N久后,系统为了回收内存kill掉了我们的app。这个时候,我们重新 打开这个app,这个时候很神奇的,回到了Activity2的页面,但是如果这个时候你再去获取Application 里的用户账号,程序就会报NullPointerException。
之所以会发生上述crash,是因为这个Application对象是全新创建的,可能你以为App是重新启动的, 其实并不是,仅仅是创建了一个新的Application,然后启动上次用户离开时的Activity,从而创造App 并没有被杀死的假象!所以如果是比较重要的数据的话,建议你还是进行本地化。另外在使用数据的时候 要对变量的值进行非空检查!还有一点就是:不止是Application变量会这样,单例对象以及公共静态变量 也会这样~

单例模式传参
上面的Application就是基于单例的,单例模式的特点就是可以保证系统中一个类有且只有一个实例, 这样很容易就能实现在A中设置参数,在B中直接访问了。这是几种方法中效率最高的。

序列化对象
 
       
 
       
1、Serializable实现步骤
  • ①业务Bean实现Serializable接口,写上getter和setter方法
  • ②Intent通过调用putExtra(String name, Serializable value)传入对象实例,当然对象有多个的话,我们也可以先Bundle.putSerializable(x,x); 
  •  Intent通过调用getSerializableExtra()方法获得对象实例
  • ④调用对象get方法获得相应参数

2、Parcelable实现步骤
  • ①业务Bean实现Parcelable接口,重写writeToParcel方法,将你的对象序列化为一个Parcel对象
  • ②重写describeContents方法,内容接口描述,默认返回0就可以了
  • ③实例化Parcelable.Creator<T> 类型的静态内部对象CREATOR,实现接口Parcelable.Creator,重写createFromParcel方法和newArray方法
  • ④同样式通过Intent的putExtra()方法传入对象实例,或通过Bundle传递多个实例

3、 Serializable,Parcelable这 两种序列化方式的比较
  • a)在使用内存方面,Parcelable比Serializable性能高,所以推荐使用Parcelable。 
  • b)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。 
  • c)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性,在外界有变化的情况下,建议使用Serializable。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值