显式Intent和隐式Intent

显式Intent

Intent有多个构造函数的重载,其中一个是Intent(Context packageContext,Class<?>cls)。这个函数中有两个参数,第一个函数要求提供一个启动活动的上下文,第二个参数指定想要启动的目标活动,通过这个构造函数就可以构造出Intent的意图。然后通过startActivity()方法启动活动。现有A、B两个活动,示例代码如下:

Intent intent=new Intent(A.this,B.class);

startActivity(intent);

使用这种方式来启动活动,Intent的“意图”非常明显,因此我们称之为显式Intent。

隐式Intent

通过字面意思就能知道,隐式Intent相比显式Intent就要含蓄些,隐式Intent通过指定一系列action和category信息,然后交由系统去分析这个Intent并帮我们找出可以响应这个Intent的活动去启动。

通过在<activity>标签下配置<intent-filter>的内容,可以指定当前活动能够响应的action和category,打开AndroidManifest.xml,添加如下代码:

<activity android:name=".SecondActivity">
    <intent-filter>
        <action android:name="com.example.activitytest.Action_START" />

        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

在<action>中我们指明了当前活动可以响应com.example.activitytest.Action_START,<category>标签则包含了一些附加信息,能够更加精准的指明了当前活动能够响应的Intent。

使用新的Intent构造函数:

Intent intent=new Intent(“com.example.activitytest.ACTION_START”);

startActivity(intent);

由于<category android:name="android.intent.category.DEFAULT" />是一种默认的category,所以可以不用特意指定。

一个活动可以指定多个category,Intent活动也可以指定多个category进行匹配。

隐式Intent的更多用法

使用隐式Intent,不仅可以启动自己程序内的活动,还可以启动其他程序的活动,使Android各个应用间的功能实现共享。以访问浏览器为例:

Intent intent=new Intent(Intent.ACTION_VIEW);

Intent.setData(Uri.parse(“http://www.baidu.com”));

StartActivity(intent);

“Intent.ACTION_VIEW”,这是一个Android系统内置的动作,其常量值为android.intent.VIEW。然后通过Uri.parse()方法,将一个网址字符串解析成一个Uri对象,然后调用Intent的setData()方法将这个Uri对象传递进去。

与此对应,我们还可以在<intent-filter>标签中配置<data>标签,目的是能够更加精确地指定当前活动能够响应什么类型的数据。<data>标签中主要可以配置以下内容:

Android:scheme。用于指定数据的协议部分,如http。

Android:host。用于指定数据的主机名部分,如www.Baidu.com

Android:port。用于指定数据的端口部分,一般紧随在主机名之后。

Android:path。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。

Android:mimeType。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。

除了http协议外,我们还可以指定很多其他协议,比如geo表示显示地理位置,tel表示拨打电话。表达拨打电话的代码如下:

Intent intent=new Intent(Intent.ACTION_DIAL);

Intent.setData(Uri.parse(“tel:10086”));

startActivity(intent);

posted on 2018-07-18 22:44  see&code  阅读(309)  评论(0)    收藏  举报

导航