天天看点

【小王的安卓之路】Android安卓入门之Intent(意图)及其功能解析Intent-意图

Intent-意图

  • 1.Intent是什么?
  • 2.Intent是干什么用的?
  • 3.Intent使用方法
  • 4.Intent过滤器

一.Intent是什么?

官方文档是这样说的:

An intent is an abstract description of an operation to be performed. It can be used with startActivity to launch an Activity, broadcastIntent to send it to any interested BroadcastReceiver components, and startService(Intent) or bindService(Intent, ServiceConnection, int) to communicate with a background Service.

An Intent provides a facility for performing late runtime binding between the code in different applications. Its most significant use is in the launching of activities, where it can be thought of as the glue between activities. It is basically a passive data structure holding an abstract description of an action to be performed.

乌拉乌拉。。。。。。。一大堆,说的简单点,Intent的核心思想就是传递信息!那它到底是传递什么信息,给谁传递信息呢?

且往下看

二.Intent是干什么用的?

Intent是一个消息传递对象,你可以使用它从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个:

启动 Activity:(上篇文章中有提到)

Activity 表示应用中的一个屏幕。通过将 Intent 传递给 startActivity(),您可以启动新的 Activity 实例。Intent 描述了要启动的 Activity,并携带了任何必要的数据。

如果你希望在 Activity 完成后收到结果,就调用 startActivityForResult()。在 Activity 的 onActivityResult() 回调中,你的 Activity 将结果作为单独的 Intent 对象接收。

启动服务:

Service 是一个不使用用户界面而在后台执行操作的组件。通过将 Intent 传递给 startService(),你可以启动服务执行一次性操作(例如,下载文件)。Intent 描述了要启动的服务,并携带了任何必要的数据。

如果服务旨在使用客户端-服务器接口,则通过将 Intent 传递给 bindService(),你可以从其他组件绑定到此服务。如需了解详细信息,请参阅服务指南。

传递广播:

广播是任何应用均可接收的消息。系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播。通过将 Intent 传递给 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast(),您可以将广播传递给其他应用。

而上篇文章中写到的Activity的显式启动和隐式启动,也是因为分别用了不同类型的Intent.而已。

三.Intent的使用方法

一个完整的Intent对象应该包含以下的信息:

  1. 组件名称 :要启动的组件名称,一般为目标组件的完整类型,如:com.demon.text1.Class,但如果是隐式Intent,则不具备这条信息,而是依靠第2条。
  2. 操作 :要执行的操作,如启动具有某种功能的Activity或者广播一个已经发生的事件,在一些社交平台分享一些资源等等
  3. 数据:这里一般指URI数据资源,如存储在SD卡里的图片资源,就是用URI解析获取。
  4. 类别:一个包含应处理 Intent 组件类型的附加信息的字符串。一般为对目标的描述。不常用。
  5. Extra :在Activity之间传递数据时,可以用键值对来包裹数据,如(name,“Tom”),(age,18)等。也可以将所有的Extra放入一个Bundle对象中。
  6. 标志:在 Intent 类中定义的、充当 Intent 元数据的标志。 标志可以指示 Android 系统如何启动 Activity(例如,Activity 应属于哪个任务),以及启动之后如何处理(例如,它是否属于最近的 Activity 列表)。

*显式启动和因式启动的方式在上一篇文章里说过了,这里我们看看一个Activty怎么被隐式启动所调用;

<activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.VIEW" />

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

这是一个AndroidManifest.xml里对Activity的配置,在标签里就指定了这个MainActivity可以响应的action为:android.intent.action.MAIN和android.intent.action.VIEW。所以如果你在任意一个Intent里调用这个action,就会跳到你的MainActivity中。

*往Intent里插入Extra数据

Intent putExtra(String name, long value)

Intent putExtra(String name, boolean value)

Intent putExtra(String name, double value)

Intent putExtra(String name, char value)

Intent putExtra(String name, int[] value)

Intent putExtra(String name, int value)

Intent putExtra(String name, double[] value)

Intent putExtra(String name, short value)

Intent putExtra(String name, long[] value)

Intent putExtra(String name, boolean[] value)

Intent putExtra(String name, short[] value)

putExtra()方法支持很多数据格式,究其原因是因为在内部实现时,不管什么数据类型,只要不是null,就会把它放入一个Bundle容器中,然后到目标页面后也是从Bundle容器中取出来。

在目标页面取出数据:

`Bundle bundle=getIntent().getExtras();

String name=bundle.getString(“name”);

`

四.Intent过滤器

我们找一段代码来具体分析:

<activity android:name="MainActivity">
    <!-- This activity is the main entry, should appear in app launcher -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" /><!--  !!!!!!!!!! -->
        <category android:name="android.intent.category.LAUNCHER" /><!--  !!!!!!!!!! -->
    </intent-filter>
</activity>

<activity android:name="ShareActivity">
    <!-- This activity handles "SEND" actions with text data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/><!-- ****************** -->
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
    <!-- This activity also handles "SEND" and "SEND_MULTIPLE" with media data -->
    <intent-filter>
        <action android:name="android.intent.action.SEND"/><!-- ****************** -->
        <action android:name="android.intent.action.SEND_MULTIPLE"/><!-- ****************** -->
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="application/vnd.google.panorama360+jpg"/>
        <data android:mimeType="image/*"/>
        <data android:mimeType="video/*"/>
    </intent-filter>
</activity>
           

第一个 Activity MainActivity 是应用的主要入口点。当用户最初使用启动器图标启动应用时,该 Activity 将打开:

ACTION_MAIN 操作指示这是主要入口点,且不要求输入任何 Intent 数据。

CATEGORY_LAUNCHER 类别指示此 Activity 的图标应放入系统的应用启动器。 如果 元素未使用 icon 指定图标,则系统将使用 元素中的图标。

这两个元素(感叹号标注)必须配对使用,Activity 才会显示在应用启动器中。

第二个 Activity ShareActivity 旨在便于共享文本和媒体内容。 尽管用户可以通过从 MainActivity 导航进入此 Activity,但也可以从发出隐式 Intent(与两个 Intent 过滤器之一匹配,星号*标注)的另一应用中直接进入 ShareActivity。

Intent 解析

当系统收到隐式 Intent 以启动 Activity 时,它根据以下三个方面将该 Intent 与 Intent 过滤器进行比较,搜索该 Intent 的最佳 Activity:

Intent 操作

Intent 数据(URI 和数据类型)

Intent 类别

下文根据如何在应用的清单文件中声明 Intent 过滤器,描述 Intent 如何与相应的组件匹配。

操作测试

要指定接受的 Intent 操作,Intent 过滤器既可以不声明任何 元素,也可以声明多个此类元素。例如:

<intent-filter>
    <action android:name="android.intent.action.EDIT" />
    <action android:name="android.intent.action.VIEW" />
    ...
</intent-filter>
           

要通过此过滤器,您在 Intent 中指定的操作必须与过滤器中列出的某一操作匹配。

如果该过滤器未列出任何操作,则 Intent 没有任何匹配项,因此所有 Intent 均无法通过测试。 但是,如果 Intent 未指定操作,则会通过测试(只要过滤器至少包含一个操作)。

总结

总的来说Intent是一个十分灵活的对象,关于服务和广播里的Intent我们到时候再讲。如果有不对或者不准确的地方,麻烦不吝指正。谢谢观看,我是不会打代码的小王。

【小王的安卓之路】Android安卓入门之Intent(意图)及其功能解析Intent-意图

继续阅读