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

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传递就是了。比如可以把这个树节点存到全局变量里,目的组件直接访问这个全局变量即可。

时间: 2024-09-18 03:06:41

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

Android开发入门(二)使用意图 2.4 使用Intent传递数据

除了能从一个Activity返回数据结果之外,向一个Activity传递数据也是很常用的. 1. 新建一个 工程,PassData. 2. main.xml中的代码. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width

Android Intent传递数据底层分析详细介绍

Android  Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没有想过这样一个问题:ActivityB中获取到的对象跟上一个Activity中的那个对象有什么关系? 换句话说就是,我在ActivityB中通过Intent获取的对象跟ActivityA中的那个对象,有没有可能是同一个对象? 按照常理来说,博主提出一个设想后续的就是证明过程了,但是我要遗憾的告诉你,

请问:android中intent传递对象的问题

问题描述 请问:android中intent传递对象的问题 请教个问题,如果如果 我用intent传递一个A类的对象a, a中包含类B的对象b.那么b还需要序列化吗? 理由呢? 解决方案 需要的,不然b里面的数据是传递不过去的

android-关于Android使用Intent传递对象问题

问题描述 关于Android使用Intent传递对象问题 mainactivity: Intent intent = new Intent(SearchResultActivity.this SearchResultDetailActivity.class); intent.putExtra(""poiItemDetail"" poiItemDetail); startActivityForResult(intent 3); secondactivity: PoiI

android中intent传递list或者对象的方法_Android

本文实例讲述了android中intent传递list或者对象的方法.分享给大家供大家参考.具体实现方法如下: 方法一: 如果单纯的传递List<String> 或者List<Integer>的话 就可以直接使用 代码如下: 复制代码 代码如下: intent.putStringArrayListExtra(name, value)  intent.putIntegerArrayListExtra(name, value) 方法二: 如果传递的是List<Object>

Android中Intent传递对象的3种方式详解_Android

前言 相信Intent的用法大家已经比较熟悉了,Intent可以用来启动Activity,Service等等,同时我们也可以通过Intent来进行传递数据,当我们使用Intent在Activity 间传递信息时发现putExtra() 方法并不支持自定义对象的传输,下面就来介绍三种解决方式. 一.Serializable 方式 这是最简单的一种方法,因为我们要做的就是让我们自定义的对象实现 Serializable 这个空接口. public class Person implements Se

关于Android Activity之间传递数据的6种方式

使用Inten的putExtra传递 第一个Activity中 //创建意图对象 Intent intent = new Intent(this,TwoActivity.class); //设置传递键值对 intent.putExtra("data",str); //激活意图 startActivity(intent); 第二个Activity中 // 获取意图对象 Intent intent = getIntent(); //获取传递的值 String str = intent.ge

android中intent传递list或者对象的方法

本文实例讲述了android中intent传递list或者对象的方法.分享给大家供大家参考.具体实现方法如下: 方法一: 如果单纯的传递List<String> 或者List<Integer>的话 就可以直接使用 代码如下: 复制代码 代码如下:intent.putStringArrayListExtra(name, value)  intent.putIntegerArrayListExtra(name, value) 方法二: 如果传递的是List<Object>,

Android往服务器传递数据 不用框架不会影响性能吗?

问题描述 Android往服务器传递数据 不用框架不会影响性能吗? Android往服务器传递数据 不用框架不会影响性能吗?说真的 ................. 解决方案 性能开销在服务器的处理以及网络通讯,用不用框架影响不大.用httpclient足够了. 当然你用框架可能调用更简单.严格来说用了反倒性能更差. 解决方案二: 性能开销在服务器de处理以及网络通讯,用不用框架影响不大.用httpclient足够了. 解决方案三: 还是要看你的服务器需要处理的客户端数量,同时有多少客户端,然