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

转载于:https://www.cnblogs.com/jiaozebo/archive/2012/06/01/2530384.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Intent是一种用于在应用程序组件之间传递数据的机制。通过Intent,您可以将数据从一个Activity传递到另一个Activity,或者从一个Activity传递到Service或BroadcastReceiver。Intent可以携带不同类型的数据,例如字符串、整数、布尔值、数组等。您可以使用putExtra()方法将数据添加到Intent中,并使用getExtra()方法从Intent中获取数据。Intent还可以用于启动其他应用程序中的Activity或Service。 ### 回答2: Android中,Intent是一种非常常见的机制,用于在应用程序中传递数据Intent可以将数据从一个Activity传递到另一个Activity,也可以被广播到整个系统。在本文中,我们将讨论Android中的Intent传递数据Android中的Intent有两种类型:显式Intent和隐式Intent。显式Intent用来启动一个特定的组件(Activity、Service或Receiver),而隐式Intent会匹配最佳的组件来处理传递数据的请求。为了传递数据,我们需要将数据添加到Intent中,并通过putExtra()方法传递。 我们可以在Intent中附加多种数据类型,例如字符串、布尔值、整数、浮点数、对象等。您传递的数据类型取决于您的业务需求。以字符串为例,Intent可以通过传递键值对的方式在Activity之间传递字符串数据。下面是一个示例: ```java Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("name", "Mike"); startActivity(intent); ``` 上面的代码中,我们创建了一个名为intentIntent对象,将当前Activity的上下文和目标Activity的类作为参数传递给Intent构造函数。我们还通过putExtra()方法将一个名为“name”的字符串键值对附加到intent中。 在第二个Activity中,我们使用getXXXExtra()方法从Intent中获取数据。在这个例子中,我们使用getStringExtra()方法来检索名为“name”的字符串: ```java String name = getIntent().getStringExtra("name"); ... ``` 通过这种方式,我们可以将数据从一个Activity传递到另一个Activity,为后续操作提供方便。 在Android开发中,Intent传递数据是一项非常重要的工作。学会如何使用Intents和传递数据,将大大提高您的应用程序的交互性和实用性。 ### 回答3: Android中,我们可以使用intent传递数据,也就是将数据从一个Activity传递到另一个Activity。intent是一种可以在应用内部或应用之间交换数据的机制,它可以在两个不同的组件间传递数据,并且可以携带各种类型的数据,如字符串、整型、布尔型、对象等等。 首先,我们需要定义一个intent对象,然后使用它来传递数据。通过调用putExtra()方法,我们可以将要传递的数据放入intent中。这些数据可以是基本数据类型,也可以是自定义对象。例如,我们可以将一个字符串传递给另一个Activity,如下所示: ``` Intent intent = new Intent(this, AnotherActivity.class); String data = "Hello, Another Activity!"; intent.putExtra("key", data); startActivity(intent); ``` 在接收Activity中,我们需要使用getIntent()方法获取发送intent的数据。我们可以使用getStringExtra()方法来获取在intent中传递的字符串数据,如下所示: ``` Intent intent = getIntent(); String data = intent.getStringExtra("key"); ``` 我们还可以使用类似的方法来获取其他类型的数据,如getIntExtra()、getBooleanExtra()、getParcelableExtra()等等,取决于在intent中放置了什么类型的数据。 还有一种常用的情况是,我们需要在两个Activity之间传递对象。在这种情况下,需要确保对象是可序列化的。可以通过实现Serializable接口或Parcelable接口来实现对象的序列化。一旦对象被序列化,可以通过putExtra()方法将它放入intent中,然后在接收Activity中使用getSerializableExtra()或getParcelableExtra()方法来获取对象。 综上所述,intentAndroid中非常强大的一个概念,它使得不同组件之间可以传递各种数据类型,为Android应用程序的开发提供了很多便利。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值