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

Intent 数据传递 总结的更多相关文章

  1. 转-Activity之间数据传递之Intent数据传递

    Intent意图 可用于Activity之间的数据传递,一般可分为下面两种情况,从当前Activity传递到目标Activity后有无返回值: 1.传递后无返回值的情况: 1 2 3 4 5 6 7 ...

  2. Intent数据传递

    (1)首先是Activity的简单跳转: 1).Activity的切换一般是通过Intent来实现的,Intent是一个Activity到达另一个Activity的引路者,它描述了起点(当前Activ ...

  3. (Android数据传递)Intent消息传递机制 “Intent”“数据传递”

    Intent类的继承关系:   需要注意的是,该类实现了Parcelable(用于数据传递)和Cloneable接口. Intent是一种(系统级别的)消息传递机制,可以在应用程序内使用,也可以在应用 ...

  4. intent--Activity之间数据传递之Intent数据传递

    intent传值: 4,intent传集合 3,intent传对象, 2,传递后有返回值的情况:当需要从目标Activity回传数据到原Activity时,可以使用上述方法定义一个新的Intent来传 ...

  5. android Activity之间数据传递 Parcelable和Serializable接口的使用

    Activity之间传数据时,为了避免麻烦,往往会将一些值封装成对象,然后将整个对象传递过去.传对象的时候有两种情况,一种是实现Parcelable接口,一种是实现Serializable接口.0.解 ...

  6. Android Intent不可传递大数据

    今天用intent传递一个bitmap,结果一直出错,intent无法执行,原来是intent不能传递大数据导致的,具体是多大,不太清楚,但我传递的bitmap在1m以上.

  7. 安卓开发-intent在Activity之间数据传递

    安卓开发-intent在Activity之间数据传递 [TOC] intent实现普通跳转 使用intent的setclass方法,示例(由此界面跳转到NewActivity界面) //使用setOn ...

  8. Activity系列讲解---数据传递

    在Android中,不同的Activity实例可能运行在一个进程中,也可能运行在不同的进程中.因此需要一种特别的机制帮助我们在Activity之间传递消息.Android中通过Intent对象来表示一 ...

  9. android第一行代码-3.activity之间的调用跟数据传递

    前面两节所有应用都是同一个activity中的,是时候讲activity之间交互的操作了,此后会涉及到intent这个概念,这也算一个新的里程碑开始. 主要内容包括intent的使用,以及activi ...

随机推荐

  1. 已经不再更新新浪、网易及CSDN博客了!

    RT, 将常驻以下博客: 地址1:51CTO技术博客:http://javalittleman.blog.51cto.com/ 地址2:博客园:http://www.cnblogs.com/javal ...

  2. JavaScript 客户端JavaScript之事件(DOM API 提供模块之一)

    具有交互性的JavaScript程序使用的是事件驱动的程序设计模型.   目前使用的有3种完全不同的不兼容的事件处理模型. 1.原始事件模型 (一种简单的事件处理模式) 一般把它看作0级DOM API ...

  3. static和const关键字的作用

    static关键字至少有下列n个作用: (1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值: (2)在模块内的stat ...

  4. php 编译安装选项

    ./configure --prefix=/usr/local/php/ --with-config-file-path=/etc/php5/cli/ --with-config-file-scan- ...

  5. SVM的点滴

    SVM 1. 普通SVM的分类函数可表示为: 其中ai为待优化参数,物理意义即为支持向量样本权重,yi用来表示训练样本属性,正样本或者负样本,为计算内积的核函数,b为待优化参数. 其优化目标函数为: ...

  6. Linux下快速静态编译Qt以及Qt动态/静态版本共存

    Qt下静态编译Qt,根据我的经验,如果按照Windows下那种直接拿官方sdk安装之后的文件来编译是行不通的,需要直接下载Qt的source包,目前诺基亚的源码叫做qt-everywhere-open ...

  7. Kill Process by Name

    Kill Process by Name(works in: Microsoft Windows 95/98/ME/NT/2000/XP)It is sometimes necessary to te ...

  8. HDOJ 1326 Box of Bricks(简单题)

    Problem Description Little Bob likes playing with his box of bricks. He puts the bricks one upon ano ...

  9. HDU_2056——相交矩形的面积

    Problem Description Given two rectangles and the coordinates of two points on the diagonals of each ...

  10. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.", PowmInsecureWarning

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAApcAAAB3CAIAAADZ1fxtAAAbFElEQVR4nO2dzbHDOo6FHY9S0WqqZt