Intent属性详解三 data、type和extra
1 Data 执行时要操作的数据
在目标<data/>标签中包含了以下几种子元素,他们定义了url的匹配规则:
android:scheme 匹配url中的前缀,除了“http”、“https”、“tel”...之外,我们可以定义自己的前缀
android:host 匹配url中的主机名部分,如“google.com”,如果定义为“*”则表示任意主机名
android:port 匹配url中的端口
android:path 匹配url中的路径
在XML中声明可以操作的data域应该是这样的:
<activity android:name=".TargetActivity"> <intent-filter> <action android:name="com.scott.intent.action.TARGET"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="scott" android:host="com.scott.intent.data" android:port="7788" android:path="/target"/> </intent-filter> </activity>
注意:
这个标识比较特殊,它定义了执行此Activity时所需要的数据,也就是说,这些数据是必须的!!!!!所有如果其它条件都足以激活该Activity,但intent却没有传进来指定类型的Data时,就不能激活该activity!!!!
2 Intent的Type属性
Intent的Type属性显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
3 方法
1 settype
使用该函数表示要查找文件的mime类型(如*/*),这个和组件在manifest里定义的相对应,但在源代码里:
public Intent setData(Uri data) { mData = data; mType = null; return this; }
会将type设为null。
2 setdata
该函数的参数是uri,所以要将数据通过该函数传递时,记得要把数据转化为uri,如Uri.fromFile(new File("/mnt/sdcard/"))。
该函数源代码
public Intent setType(String type) { mData = null; mType = type; return this; }
3 setdataandtype
所以要同时设置data和type的话只能用函数setdataandtype了
public Intent setDataAndType(Uri data, String type) {
mData = data;
mType = type;
return this;
}
4 Extras:
Extras属性主要用于传递目标组件所需要的额外的数据。通过putExtras()方法设置。
常用值如下所示:
EXTRA_BCC:存放邮件密送人地址的字符串数组。
EXTRA_CC:存放邮件抄送人地址的字符串数组。
EXTRA_EMAIL:存放邮件地址的字符串数组。
EXTRA_SUBJECT:存放邮件主题字符串。
EXTRA_TEXT:存放邮件内容。
EXTRA_KEY_EVENT:以KeyEvent对象方式存放触发Intent的按键。
EXTRA_PHONE_NUMBER:存放调用ACTION_CALL时的电话号码
5 Demo源码
activity:
package mm.shandong.com.testdatatype; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.TextView; import java.util.ArrayList; public class TestDataTypeActivity extends AppCompatActivity { TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test_data_type); textView= (TextView) findViewById(R.id.textView); } public void readDataAndType1(View view){ Intent intent=new Intent(); Uri uri= Uri.parse("http://www.baidu.com/2.asp"); intent.setData(uri); intent.setType("abc/efg"); String str="Data: "+intent.getDataString()+", Type:"+intent.getType(); textView.setText(str); } public void readDataAndType2(View view){ Intent intent=new Intent(); intent.setType("abc/efg"); Uri uri= Uri.parse("http://www.baidu.com/2.asp"); intent.setData(uri); String str="Data: "+intent.getDataString()+", Type:"+intent.getType(); textView.setText(str); } public void readDataAndType3(View view){ Intent intent=new Intent(); Uri uri= Uri.parse("http://www.baidu.com/2.asp"); intent.setDataAndType(uri,"abc/efg"); String str="Data: "+intent.getDataString()+", Type:"+intent.getType(); textView.setText(str); } public void startDataAndType1(View view){ Intent intent=new Intent(); intent.setAction("TestDataTypeActivityXXX"); Uri uri= Uri.parse("ottp://"); intent.setData(uri); startActivity(intent); } public void startDataAndType2(View view){ Intent intent=new Intent(); intent.setAction("TestDataTypeActivityXXX"); Uri uri= Uri.parse("ottp://shandong.mm"); intent.setData(uri); startActivity(intent); } public void startDataAndType3(View view){ Intent intent=new Intent(); intent.setAction("TestDataTypeActivityXXX"); Uri uri= Uri.parse("ottp://shandong.mm:8080"); intent.setData(uri); startActivity(intent); } public void startDataAndType4(View view){ Intent intent=new Intent(); intent.setAction("TestDataTypeActivityXXX"); Uri uri= Uri.parse("ottp://shandong.mm:8080/pathparent/pathchild"); intent.setData(uri); startActivity(intent); } public void startDataAndType5(View view){ Intent intent=new Intent(); intent.setAction("TestDataTypeActivityXXX"); Uri uri= Uri.parse("ottp://shandong.mm:8080/pathparent/pathchild"); intent.setDataAndType(uri,"abc/efg"); startActivity(intent); } }
清单文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="mm.shandong.com.testdatatype"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".TestDataTypeActivity" android:configChanges="keyboardHidden|orientation|screenSize" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".TestDataTypeActivity1" android:configChanges="keyboardHidden|orientation|screenSize" android:label="含有scheme"> <intent-filter> <action android:name="TestDataTypeActivityXXX" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="ottp" /> </intent-filter> </activity> <activity android:name=".TestDataTypeActivity2" android:configChanges="keyboardHidden|orientation|screenSize" android:label="含有host"> <intent-filter> <action android:name="TestDataTypeActivityXXX" /> <category android:name="android.intent.category.DEFAULT" /> <data android:host="shandong.mm" android:scheme="ottp" /> </intent-filter> </activity> <activity android:name=".TestDataTypeActivity3" android:configChanges="keyboardHidden|orientation|screenSize" android:label="含有port"> <intent-filter> <action android:name="TestDataTypeActivityXXX" /> <category android:name="android.intent.category.DEFAULT" /> <data android:host="shandong.mm" android:port="8080" android:scheme="ottp" /> </intent-filter> </activity> <activity android:name=".TestDataTypeActivity4" android:configChanges="keyboardHidden|orientation|screenSize" android:label="含有path"> <intent-filter> <action android:name="TestDataTypeActivityXXX" /> <category android:name="android.intent.category.DEFAULT" /> <data android:host="shandong.mm" android:path="/pathparent/pathchild" android:port="8080" android:scheme="ottp" /> </intent-filter> </activity> <activity android:name=".TestDataTypeActivity5" android:configChanges="keyboardHidden|orientation|screenSize" android:label="data和type同时存在"> <intent-filter> <action android:name="TestDataTypeActivityXXX" /> <category android:name="android.intent.category.DEFAULT" /> <data android:host="shandong.mm" android:mimeType="abc/efg" android:path="/pathparent/pathchild" android:port="8080" android:scheme="ottp" /> </intent-filter> </activity> </application> </manifest>
本人微博:honey_11
Demo下载
最后,以上例子都来源与安卓无忧,请去应用宝或者豌豆荚下载:例子源码,源码例子文档一网打尽