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。





  • 相关阅读:
    java的构造方法 java程序员
    No result defined for action cxd.action.QueryAction and result success java程序员
    大学毕业后拉开差距的真正原因 java程序员
    hibernate的回滚 java程序员
    验证码 getOutputStream() has already been called for this response异常的原因和解决方法 java程序员
    浅谈ssh(struts,spring,hibernate三大框架)整合的意义及其精髓 java程序员
    你平静的生活或许会在某个不可预见的时刻被彻底打碎 java程序员
    Spring配置文件中使用ref local与ref bean的区别. 在ApplicationResources.properties文件中,使用<ref bean>与<ref local>方法如下 java程序员
    poj1416Shredding Company
    poj1905Expanding Rods
  • 原文地址:https://www.cnblogs.com/baiqiantao/p/5581832.html
Copyright © 2011-2022 走看看