系统API
可以传递的数据类型
1、传递8大基本类型+String+CharSequence及其数组类型2、传递ArrayList集合public Intent putIntegerArrayListExtra(String name, ArrayList<Integer> value)public Intent putStringArrayListExtra(String name, ArrayList<String> value)public Intent putCharSequenceArrayListExtra(String name, ArrayList<CharSequence> value)public Intent putParcelableArrayListExtra(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序列化对象(注意:BitMap默认实现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。