zoukankan      html  css  js  c++  java
  • Intent 数据传递 总结


    系统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。





  • 相关阅读:
    Vagrant In Windows 10
    Game Console参数指北
    Java并发编程:volatile关键字解析
    自己实现Linkedlist,实现其常用的增、删、查的方法
    自己实现Arraylsit,实现其常用的几种增、删、该、查的方法
    使用@RequestPart同时上传表单数据和文件(转载)
    Springboot配置跨域访问
    Tesseract-OCR安装使用及样本训练
    Java使用tess4J进行OCR图像识别
    SpringBoot中的静态资源访问(转载)
  • 原文地址:https://www.cnblogs.com/baiqiantao/p/5581832.html
Copyright © 2011-2022 走看看