概述
Android中的Intent和Intent-Filter详解(一)
Data、Type属性与intent-filter配置
Data属性接收一个Uri对象作为其值,Uri对象类似于“content://com.android.contacts/contacts/#”,关于Uri的相关知识大家可以自行搜索。
Data属性通常用于向Action属性提供操作的数据。例如,如果action为ACTION_EDIT,data的值应该指明被编辑文档的Uri;如果action为ACTION_CALL,data的值应该是一个以“tel:”开头并在其后附加号码的Uri;如果action为ACTION_VIEW,data应该以“http:”开头并在其后附加网址的Uri。
Type属性用于指定该Data指定的Uri对应的MIME类型,下面这个网站讲解了什么是MIME,并列出了大部分MIME类型对照表:
http://www.w3school.com.cn/media/media_mimeref.asp
Data属性与Type属性可以相互覆盖,这与Data和Type设置的先后顺序有关:
-
如果Intent先设置Data属性,后设置Type属性,那么Type属性将会覆盖Data属性;
-
如果Intent先设置Type属性,后设置Data属性,那么Data属性将会覆盖Data属性;
-
如果希望Intent既有Data属性,也有Type属性,应该调用Intent的setDataAndType()方法。
下面是针对这三种情况的例子:
private voidtemp() {
//先设置Type属性,再设置Data属性
Intent intent1 =newIntent();
intent1.setType("image/jpeg");
intent1.setData(Uri.parse("http://www.52ij.com/uploads/allimg/160317/1110103957-0.jpg"));
Toast.makeText(MainActivity.this,intent1.toString(),Toast.LENGTH_SHORT).show();
//先设置Data属性,再设置Type属性
Intent intent2 =newIntent();
intent2.setData(Uri.parse("http://www.52ij.com/uploads/allimg/160317/1110103957-0.jpg"));
intent2.setType("image/jpeg");
Toast.makeText(MainActivity.this,intent2.toString(),Toast.LENGTH_SHORT).show();
//同时设置Type和Data属性
Intent intent3 =newIntent();
intent3.setDataAndType(Uri.parse("http://www.52ij.com/uploads/allimg/160317/1110103957-0.jpg"),"image/jpeg");
Toast.makeText(MainActivity.this,intent3.toString(),Toast.LENGTH_SHORT).show();
}
Date和Type不仅可以在代码中设置,还可以在AndroidManifest.xml中通过<data…/>元素设置,<data…/>元素的格式如下:
<data android:mimeType="" android:scheme="" android:host="" android:port="" android:path="" android:pathPrefix="" android:pathPattern=""/>
属性定义如下:
<data…/>元素的属性 | 描述 |
mimeType | 该组件所能匹配的Intent的Type属性 |
scheme | 该组件所能匹配的Intent的Data属性的scheme部分,即协议标识,例如http、content等 |
host | 该组件所能匹配的Intent的Data属性的host部分,即IP、域名 |
port | 端口号 |
path | 二级路径,例如”/mypath”、”/contact/#” |
pathPrefix | 设置path路径以什么开头 |
pathPattern | 设置带统配符的路径,通配符为“*”和“.*” |
Data属性的“匹配”过程则有些差别,它会先检查<intent-filter …/>里的<data …/>子元素,子元素的属性指定不全或只指定一部分,造成的结果是不一样的,想深入了解请自行百度”android <intent-filter> data属性”。
附上一段简单的例子:
@OnClick({R.id.button1,R.id.button2,R.id.button3})
public voidonClick(View view) {
Intent intent = newIntent();
switch (view.getId()) {
caseR.id.button1:
intent.setData(Uri.parse("http://www.baidu.com"));
intent.setAction(Intent.ACTION_VIEW);
startActivity(intent);
break;
case R.id.button2:
intent.setData(ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,1));
intent.setAction(Intent.ACTION_EDIT);
startActivity(intent);
break;
case R.id.button3:
intent.setData(Uri.parse("tel:13112345678"));
intent.setAction(Intent.ACTION_DIAL);
startActivity(intent);
break;
}
}
Extra属性
Intent的Extra属性用于在多个Action/Activity之间传递、交换数据,Intent的Extra属性值应该是一个Bundle对象,Bundle对象就想一个Map对象,可以传递基本类型和其数组对象,以及实现Parclable接口的自定义对象及其数组。
Flag属性
Flag属性用于为该Intent添加一些额外的控制旗标,Intent可调用addFlag()方法来为Intent添加控制旗标。常用的控制旗标如下:
Flag旗标 | 作用 |
FLAG_ACTIVITY_BROUGHT_TO_FRONT | 若通过该flag启动的Activity已存在,下次再启动时,会将该Activity带到前台,而不会重新实例化一个,而通过该Activity启动的Activity在栈中的位置会按顺序往下压一格。 |
FLAG_ACTIVITY_CLEAR_TOP | 相当于加载模式中的singleTask,通过该flag启动的Activity,在栈中若其上面还有其它Activity,会将其它Activity全部弹出栈(销毁),而不是将其它Activity往下压一格。 |
FLAG_ACTIVITY_NEW_TASK | 默认的启动旗标,控制重新创建一个Activity |
FLAG_ACTIVITY_NO_ANIMATION | 控制Activity启动时不使用动画 |
FLAG_ACTIVITY_NO_HISTORY | 被启动的Activity(不包含被该Activity启动的Activity)将不会保留在当前栈中(具体保存在哪我也不清楚),而且也不会回调onActivityResult() |
FLAG_ACTIVITY_REORDER_TO_FRONT | 和FLAG_ACTIVITY_BROUGHT_TO_FRONT一样,我也不知道区别在哪 |
FLAG_ACTIVITY_SINGLE_TOP | 相当于加载模式中的singleTop,若栈顶的Activity就是当前将启动的Activity,则不会重新实例化一个。 |
|
|
总结
主要介绍了Intent的功能和用法,当Android应用需要启动某个组件(Activity、Service、BroadcastReceiver)时,总需要借助于Intent来实现。Intent封装了应用程序的“启动意图”,降低了组件之间的耦合,提高了系统的可扩展性和可维护性。要掌握Intent,需要知道Intent的属性Component、Action、Category、Data、Type等属性的用法,并能通过代码和<intent-filter …/>配置各属性。
最后
以上就是无语哈密瓜为你收集整理的Android中的Intent和Intent-Filter详解(二) Data、Type属性与intent-filter配置 的全部内容,希望文章能够帮你解决Android中的Intent和Intent-Filter详解(二) Data、Type属性与intent-filter配置 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复