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

(0)

相关推荐

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

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

  • Android 通过Intent使用Bundle传递对象详细介绍

    Android 通过Intent使用Bundle传递对象 Android开发中有时需要在应用中或进程间传递对象,下面详细介绍Intent使用Bundle传递对象的方法. 被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable Java中使用的是Serializable,而谷歌在Android使用了自定义的Parcelable. 两种序列化方式的区别: 1.在使用内存的时候,Parcelable比Serializa

  • android中Intent传值与Bundle传值的区别详解

    举个例子我现在要从A界面跳转到B界面或者C界面   这样的话 我就需要写2个Intent如果你还要涉及的传值的话 你的Intent就要写两遍添加值的方法 那么 如果我用1个Bundle  直接把值先存里边 然后再存到Intent中 不就更简洁吗? 另外一个例子如果我现在有Activity A ,B ,C:现在我要把值通过A经过B传给C你怎么传 如果用Intent的话 A-B先写一遍 再在B中都取出来 然后在把值塞到Intent中 再跳到C 累吗?如果我在A中用了 Bundle 的话  我把Bun

  • Android编程使用Intent传递图片的方法详解

    本文实例讲述了Android编程使用Intent传递图片的方法.分享给大家供大家参考,具体如下: 基本思路是先把bitmap转化为byte数组,用Intent传递数组,在将数组转化为bitmap bitmap转化为byte数组的方法: private byte[] Bitmap2Bytes(Bitmap bm){ ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.

  • Android编程实现使用Intent传输包含自定义类的ArrayList示例

    本文实例讲述了Android编程实现使用Intent传输包含自定义类的ArrayList.分享给大家供大家参考,具体如下: 前言 之前项目中通过Intent只是传输简单的字符串,这次因为需要在前一个页面联网获取对象数据,然后在下一个页面使用,所以考虑到使用Intent传输包含自定义类的ArrayList. Serializable Java的对象序列化指的是将那些实现了Serializable接口的对象转换成一个字节序列,并且能在需要的时候再将这个字节序列完全恢复为之前的对象. 想实现对象的序列

  • Android开发之利用Intent实现数据传递的方法

    本文实例讲述了Android利用Intent实现数据传递的方法.分享给大家供大家参考,具体如下: 在Android开发过程中,很多人都熟悉Intent,这是个用于在多个View之间共享数据的类.本节主要讲述通过点选ListView中的文本,把文本中的URL加载到一个新的页面上,并且打印出来.为了方便,我先把前面一篇<Android开发之利用jsoup解析HTML页面的方法>的代码重新贴一下,因为在上一节后,代码做了少许修改: try { doc = Jsoup.parse(new URL(&q

  • Android Activity中使用Intent实现页面跳转与参数传递的方法

    本文实例讲述了Android Activity中使用Intent实现页面跳转与参数传递的方法.分享给大家供大家参考,具体如下: 新建一个FirstAvtivity.java package com.zhuguangwei; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.O

  • Android系列之Intent传递对象的几种实例方法

    在Android中intent传递对象主要有2种方式分别是,Bundle.putSerializable(Key,Object)和Bundle.putParcelable(Key, Object);当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口,以下是我为大家做的一个实例 首先我们建立一个工程项目命名为:ObjectTestDemo 然后我们再修改main.xml布局文件,主要增加2个按钮view plaincopy to

  • Android中ArrayList和数组相互转换

    List-–>数组 在大家开发中应该经常碰到List与数组类型之间的相互转换,举一个简单的例子: package test.test1; import java.util.ArrayList; import java.util.List; public class Test { /** * @param args */ public static void main(String[] args) { List list=new ArrayList(); list.add("王利虎"

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

    Intent是Android中一个非常重要的概念,跟这个词的本意(意图,目的)一样,这个类在Android中的作用就是要调用某个组建去做某一件事,比如通过startActivity启动一个Activity,通过startService启动一个Service,通过sendBroadcast发送一个广播等,它相当于各个组建间的一个桥梁.很重要的一点是这个过程是可以跨进程的,比如在应用中可以启动调用某个播放器组件(系统自身的或者第三方的)来播放一段视频,启动照相机程序拍照等等. 当我们启动视频播放器播

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

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

  • Android Intent传递数据大小限制详解

    前言 在sendBroadcast,startActivity时,我们会用到Intent. Intent可以携带一些数据,比如基本类型数据int.Boolean,或是String,或是序列化对象,Parcelable与Serializable. Intent传递数据时,如果数据太大,可能会出现异常.比如App闪退,或是Intent发送不成功,logcat报错等等. 这就牵涉到一个问题:Intent 传递数据大小限制. Intent到底能够携带多少数据呢? 使用Intent传送数据时,可能会出现异

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

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

  • Android使用Intent传递组件大数据

    目录 数据传输 替代方案 数据传输 在Android开发过程中,我们常常通过Intent在各个组件之间传递数据.例如在使用startActivity(android.content.Intent)方法启动新的 Activity 时,我们就可以通过创建Intent对象然后调用putExtra() 方法传输参数. val intent = Intent(this, TestActivity::class.java) intent.putExtra("name","name&quo

  • 关于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附加数据的两种实现方法

    本文实例讲述了Android之Intent附加数据的两种实现方法.分享给大家供大家参考.具体如下: 第一种写法,用于批量添加数据到Intent: Intent intent = new Intent(); Bundle bundle = new Bundle(); //该类用作携带数据 bundle.putString("name", "林计钦"); intent.putExtras(bundle); //为意图追加额外的数据,意图原来已经具有的数据不会丢失,但ke

  • android使用intent传递参数实现乘法计算

    本文实例为大家分享了android使用intent传递参数实现乘法计算的具体代码,供大家参考,具体内容如下 主界面上是两个EditText和一个按钮.用于输入两个数字参数. calcute.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    

  • Android中Intent传递对象的两种方法Serializable,Parcelable

    Android中的传递有两个方法,一个是Serializable,另一个是Parcelable. Serializable是J2SE本身就支持的.而Parcelable是Android所特有的. 二者的使用场景和区别: 1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable. 2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC. 3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelab

随机推荐