10

putExtra() 和 setData() 有什么区别?我已经阅读了 android 文档,但它没有多大帮助。还有一个先前的问题Intent.setData vs Intent.putExtra 但仍不清楚。提前致谢。

4

4 回答 4

8

设置数据()

设置此意图正在操作的数据。此方法自动清除以前由 setType(String) 或 setTypeAndNormalize(String) 设置的任何类型。

注意:与正式的 RFC 不同,Android 框架中的方案匹配区分大小写。因此,您应该始终使用小写方案编写 Uri,或使用 normalizeScheme() 或 setDataAndNormalize(Uri) 确保将方案转换为小写。

参数

数据:此意图现在定位的数据的 Uri。

Intent 用于向 Android 系统发出某个事件已发生的信号。意图通常描述应该执行的操作并提供应该执行此类操作的数据。例如,您的应用程序可以通过意图启动某个 URL 的浏览器组件。下面的例子证明了这一点。

    String url = "http://www.google.com";
    Intent i = new Intent(Intent.ACTION_VIEW);
    i.setData(Uri.parse(url));
    startActivity(i); 

但是 Android 系统如何识别可以对特定意图做出反应的组件呢?

为此,使用了意图过滤器的概念。意图过滤器指定活动、服务或广播接收器可以响应的意图类型。因此,它声明了组件的功能。

Android 组件在 AndroidManifest.xml 中静态注册意图过滤器,或者在广播接收器的情况下也通过代码动态注册。意图过滤器由其类别、操作和数据过滤器定义。它还可以包含其他元数据。

如果向 Android 系统发送 Intent,则 Android 平台使用 Intent 对象中包含的数据运行接收方确定。在此,它确定为意图数据注册的组件。如果多个组件注册了同一个意图过滤器,用户可以决定应该启动哪个组件。

放额外()

向意图添加扩展数据。

参数

name:额外数据的名称。

value:字符串数组数据值。

返回相同的 Intent 对象,用于将多个调用链接到单个语句中。

于 2013-10-03T06:03:32.560 回答
5

putExtra允许您添加原始(或可打包)键值对。setData仅限于通过Uri. setData通常用于从另一个源请求数据的情况,例如在 startActivityForResult 中。

于 2013-10-03T05:52:04.100 回答
2

看一下源码:

/**
 * Set the data this intent is operating on.  This method automatically
 * clears any type that was previously set by {@link #setType} or
 * {@link #setTypeAndNormalize}.
 *
 * <p><em>Note: scheme matching in the Android framework is
 * case-sensitive, unlike the formal RFC. As a result,
 * you should always write your Uri with a lower case scheme,
 * or use {@link Uri#normalizeScheme} or
 * {@link #setDataAndNormalize}
 * to ensure that the scheme is converted to lower case.</em>
 *
 * @param data The Uri of the data this intent is now targeting.
 *
 * @return Returns the same Intent object, for chaining multiple calls
 * into a single statement.
 *
 * @see #getData
 * @see #setDataAndNormalize
 * @see android.net.Uri#normalizeScheme()
 */
public Intent setData(Uri data) {
    mData = data;  // private Uri mData
    mType = null;  // private String mType;
    return this;
}

/**
 * Add extended data to the intent.  The name must include a package
 * prefix, for example the app com.android.contacts would use names
 * like "com.android.contacts.ShowAll".
 *
 * @param name The name of the extra data, with package prefix.
 * @param value The String data value.
 *
 * @return Returns the same Intent object, for chaining multiple calls
 * into a single statement.
 *
 * @see #putExtras
 * @see #removeExtra
 * @see #getStringExtra(String)
 */
public Intent putExtra(String name, String value) {
    if (mExtras == null) {
        mExtras = new Bundle();
    }
    mExtras.putString(name, value);
    return this;
}
于 2014-04-30T21:17:18.150 回答
2

setData()是传递必须采取行动的数据;whileputExtra()是发送有关该操作的额外信息。

例如,如果一个人正在开始一项要执行的活动ACTION_CALL,那么他必须设置要调用的号码setData()。如果他想传递任何其他额外信息,那么他应该使用putExtra().

于 2015-03-22T05:17:53.047 回答