系统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. Android Fragment用法之给Activity创建事件回调

    在某些案例中,可能需要Fragment与Activity共享事件.在Fragment内部定义一个回调接口是一个好方法,并且规定由持有它的Activity实现这个回调方法.当Activity通过接口接受 ...

  2. nodejs http.get乱码问题处理方法

    var req = http.get(url,function(res){ res.setEncoding('utf-8'); var html = '' res.on('data',function ...

  3. Oracle错误问题---- 《ora-12638:身份证明检索失败》

    使用客户端可以连接,但只有一个站点出现此问题,非常郁闷,网上查了一下,发现是用户认证问题,解决办法如下: 在ORACLE客户端目录下 NETWORK/ADMIN下的sqlnet.ora,使用记事本打开 ...

  4. ueditor从excel粘贴过来的表格不显示问题

    这是设置表格边框可见的办法

  5. IIS下图片防盗连设置详解

    小站只有100个IIS,盗链后经常是连主页都打不开,就想着弄个图片防盗链,在网上找了一下资料,正则表达式的写法啊,ISAPI_REWRITE基本配置啊等等,找来啃了一天终于发现有三个方法实现. 第一. ...

  6. 使用Jstl异常:The absolute uri: http://java.sun.com/jsp/jstl/core cannot&nbs

    错误提示是:        org.apache.jasper.JasperException: This absolute uri http://java.sun.com/jsp/jstl/core ...

  7. 从汇编来看c语言之变量

    1.基础研究 对如图程序进行编译连接,再用debug加载. 我们在偏移地址1fa处查看main函数的内容: 执行到1fd处,发现n的偏移地址为01a6,段地址存储在ds寄存器里,为07c4. 再查看函 ...

  8. MSSQL显错注入爆数字型数据的一点思考

    Title:MSSQL显错注入爆数字型数据的一点思考 --2011-02-22 15:23 MSSQL+ASP 最近在弄个站点,密码是纯数字的,convert(int,())转换出来不报错,也不知道其 ...

  9. SQL通过xml插入批量数据

    存储过程: CREATE PROCEDURE [dbo].[UP_PurchasexxxCard] @OrderInfo XMLASBEGIN SET NOCOUNT ON; DECLARE @Dat ...

  10. .net performance

    http://msdn.microsoft.com/en-us/library/ms173196.aspx http://www.zhihu.com/question/20314377 http:// ...