• 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。





  • 相关阅读:
    Codeforces Round #538 (Div. 2) F. Please, another Queries on Array?
    2021 ICPC济南 J Determinant
    牛客小白月赛43 F 全体集合
    The 2021 ICPC Asia Regionals Online Contest (II) L Euler Function
    C++文件操作详解
    利用VC实现图像的特殊显示效果 小楼machine
    Mixed mode assembly is built against version 'v2.0.50727' 解决方案 小楼machine
    如何在对话框资源从一个项目导入到另一个项目使用 Visual c + +.net 或 Visual c + + 2005 小楼machine
    灰度图像阈值化分割常见方法总结及VC实现 小楼machine
    Visual C++多媒体设计及图形、图像处理 小楼machine
  • 原文地址:https://www.cnblogs.com/baiqiantao/p/5581832.html
Copyright © 2020-2023  润新知