Android中的Intent和Intent-Filter详解(二)

时间:2022-01-28 15:32:40


Android中的Intent和Intent-Filter详解(一)


DataType属性与intent-filter配置

Data属性接收一个Uri对象作为其值,Uri对象类似于“content://com.android.contacts/contacts/#”,关于Uri的相关知识大家可以自行搜索。

Data属性通常用于向Action属性提供操作的数据。例如,如果actionACTION_EDITdata的值应该指明被编辑文档的Uri;如果actionACTION_CALLdata的值应该是一个以“tel:”开头并在其后附加号码的Uri;如果actionACTION_VIEWdata应该以“http:”开头并在其后附加网址的Uri

Type属性用于指定该Data指定的Uri对应的MIME类型,下面这个网站讲解了什么是MIME,并列出了大部分MIME类型对照表:

http://www.w3school.com.cn/media/media_mimeref.asp

Data属性与Type属性可以相互覆盖,这与DataType设置的先后顺序有关:

  • 如果Intent先设置Data属性,后设置Type属性,那么Type属性将会覆盖Data属性;

  • 如果Intent先设置Type属性,后设置Data属性,那么Data属性将会覆盖Data属性;

  • 如果希望Intent既有Data属性,也有Type属性,应该调用IntentsetDataAndType()方法。

下面是针对这三种情况的例子:

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();

   
//同时设置TypeData属性
   
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();
}

DateType不仅可以在代码中设置,还可以在AndroidManifest.xml中通过<data…/>元素设置,<data…/>元素的格式如下:

<data android:mimeType=""

   
android:scheme=""

   
android:host=""

   
android:port=""

   
android:path=""

   
android:pathPrefix=""

   
android:pathPattern=""/>

属性定义如下:

<data…/>元素的属性

描述

mimeType

该组件所能匹配的IntentType属性

scheme

该组件所能匹配的IntentData属性的scheme部分,即协议标识,例如httpcontent

host

该组件所能匹配的IntentData属性的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属性

IntentExtra属性用于在多个Action/Activity之间传递、交换数据,IntentExtra属性值应该是一个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应用需要启动某个组件(ActivityServiceBroadcastReceiver)时,总需要借助于Intent来实现。Intent封装了应用程序的启动意图,降低了组件之间的耦合,提高了系统的可扩展性和可维护性。要掌握Intent,需要知道Intent的属性ComponentActionCategoryDataType等属性的用法,并能通过代码和<intent-filter …/>配置各属性。