putExtra()和setData()有什么区别?我已经阅读了android文档,但它没有多大帮助。 还有一个问题Intent.setData vs Intent.putExtra,但目前尚不清楚。 提前谢谢。
答案 0 :(得分:8)
<强>使用setData()强>
设置此意图操作的数据。此方法自动清除先前由setType(String)或setTypeAndNormalize(String)设置的任何类型。
注意:Android框架中的方案匹配区分大小写,与正式的RFC不同。因此,您应始终使用小写方案编写Uri,或使用normalizeScheme()或setDataAndNormalize(Uri)以确保将方案转换为小写。
参数的
数据:此意图目前定位的数据的Uri。
意图用于向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系统,则Android平台使用Intent对象中包含的数据运行接收器确定。在此,它确定为意图数据注册的组件。如果多个组件已注册相同的intent过滤器,则用户可以决定应该启动哪个组件。
<强> putExtra()强>
将扩展数据添加到intent中。
参数:
name:额外数据的名称。
value:String数组数据值。
返回相同的Intent对象,用于将多个调用链接到单个语句中。
答案 1 :(得分:5)
putExtra
允许您添加原始(或可分段)键值对。 setData
仅限于传递Uri
。 setData
通常用于从其他来源请求数据的情况,例如在startActivityForResult中。
答案 2 :(得分: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;
}
答案 3 :(得分:2)
setData()
是传递必须采取行动的数据;而putExtra()
将发送有关该操作的额外信息。
例如,如果有人开始执行ACTION_CALL
的活动,那么他必须设置要在setData()
中拨打的号码。如果他想传递任何其他额外信息,那么他应该使用putExtra()
。