Android 使用Intent传递数据的实现思路与代码

 更新时间:2013年01月13日 14:15:13   作者:  
Intent是Android中一个非常重要的概念,跟这个词的本意(意图,目的)一样,这个类在Android中的作用就是要调用某个组建去做某一件事,接下来详细介绍,感兴趣的朋友可以参考下
Intent是Android中一个非常重要的概念,跟这个词的本意(意图,目的)一样,这个类在Android中的作用就是要调用某个组建去做某一件事,比如通过startActivity启动一个Activity,通过startService启动一个Service,通过sendBroadcast发送一个广播等,它相当于各个组建间的一个桥梁。很重要的一点是这个过程是可以跨进程的,比如在应用中可以启动调用某个播放器组件(系统自身的或者第三方的)来播放一段视频,启动照相机程序拍照等等。

当我们启动视频播放器播放一段视频的时候,首先要告诉播放器播放哪个视频文件,这就涉及到intent的数据传递功能,Intent传递数据有两种方式:setData,putExtra。前者的参数是Uri,Uri是全局的可以访问的数据的一个标识,比如磁盘上的一个文件,数据库中的一个联系人等,后者的参数可以是具体的基本数据类型和对象。对于对象,传递的是对象的成员,包括基本的数据成员和成员对象。Intent要求传递的对象以及其成员对象实现了Serializable或者Parcelable,是可以持久化的(考虑到跨进称传递,可以理解,可能先在传递前,把对象保存到一个缓冲区域,然后再从这个区域取)。

当初次接触android时,有过一个的困惑,先看代码
复制代码 代码如下:

// MyCls
class MyCls implements Seriliazable
{
public String mValue;
}


// ActivityA
MyCls mMyCls;
// 跳转到ActivityB
Intent intent = new Intent();
mMyCls = new MyCls();
mMyCls.mValue = "ActivityA";
intent.putSerializable("MyCls", mMyCls);
intent.setClass(this, ActivityB.class);
startActivity(intent);

// ActivityB
MyCls cls = (MyCls)getIntent().getSerializable("MyCls");
cls.mValue = "ActivityB";

我的疑惑是:在ActivityB中,把cls的mValue更改了,为什么ActivityA里,mMyCls.mValue没变?难道B中cls是A中mMyCls的拷贝吗,为什么API没讲到?当初长时间纠结于intent传递的是对象引用还是对象的拷贝而不得解,上网查资料也没有任何这方面的解答。而现在可以释然了,相信有同样疑惑的读者看了这篇文章后也会释然。

对于复杂对象,现在例举树节点做说明,一个树节点,其成员对象有父节点和子节点的队列,在用Intent传递这样一个节点时,会不断递归,导致实际上传递的是整棵树!如果这个树比较膨大的话,效率会十分低。transient修饰符可以解决这个问题,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。我们可以在节点中把父节点和子节点队列修饰为transient,这样在传递的过程中就不会传递它们,接收时,父节点和子节点为null。但是很显然这样会导致信息丢失了。

一般而言会有这样的情况:不用跨进程访问其它组件,而传递的复杂对象又需要保证完整的信息不丢失,怎么办呢?很简单,既然在同一进程中,内存对大家都是可访问的,用intent传递这个对象真是牛刀杀鸡了,不用intent传递就是了。比如可以把这个树节点存到全局变量里,目的组件直接访问这个全局变量即可。

相关文章

  • Android实现QQ侧滑菜单效果

    Android实现QQ侧滑菜单效果

    这篇文章主要为大家详细介绍了Android实现QQ侧滑菜单效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Android通过ViewModel保存数据实现多页面的数据共享功能

    Android通过ViewModel保存数据实现多页面的数据共享功能

    这篇文章主要介绍了Android通过ViewModel保存数据实现多页面的数据共享功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • Android ListView滑动改变标题栏背景渐变效果

    Android ListView滑动改变标题栏背景渐变效果

    这篇文章主要为大家详细介绍了Android ListView滑动改变标题栏背景渐变效果,透明转变成不透明,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Android自定义View实现球形动态加速球

    Android自定义View实现球形动态加速球

    这篇文章主要为大家详细介绍了Android自定义View实现球形动态加速球,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Android LayoutInflater深入分析及应用

    Android LayoutInflater深入分析及应用

    这篇文章主要介绍了Android LayoutInflater分析的相关资料,需要的朋友可以参考下
    2017-02-02
  • Android SharedPreferences实现记住密码和自动登录界面

    Android SharedPreferences实现记住密码和自动登录界面

    本篇文章主要介绍了Android记住密码和自动登录界面的实现(SharedPreferences),具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-02-02
  • Android开发之Activity全透明渐变切换方法

    Android开发之Activity全透明渐变切换方法

    下面小编就为大家分享一篇Android开发之Activity全透明渐变切换方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • Android如何创建自定义ActionBar

    Android如何创建自定义ActionBar

    这篇文章主要教大家如何创建自定义的ActionBar,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • android push推送相关基本问答总结

    android push推送相关基本问答总结

    现在网上一大堆的关于推送方面的实现原理:1.通过pull(拉),也就是通过客户端主动定时轮询服务器请求数据。2.通过push(推),服务器通过一个长连接主动推送消息到客户端。这两个方式都可以实现推送功能。pull这个方式没什么问题好理解。
    2015-05-05
  • Android仿京东首页画轴效果

    Android仿京东首页画轴效果

    这篇文章主要为大家详细介绍了Android仿京东首页画轴效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12

最新评论