Android:Intent-Filter的工作原理如何?

时间:2015-10-13 10:01:57

标签: android android-intent intentfilter

我读了另一篇文章: Android: Understanding Intent-Filters但我仍然无法掌握Intent过滤器的功能以及它们的工作原理。

例如:

有什么区别:

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

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

            <action android:name="android.intent.action.SEND" />
            <action android:name="android.intent.action.SENDTO" />

            <data android:scheme="sms" />
            <data android:scheme="smsto" />
            <data android:scheme="mms" />
            <data android:scheme="mmsto" />
        </intent-filter>

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

            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.DEFAULT" />

            <action android:name="android.intent.action.SEND" />
            <action android:name="android.intent.action.SENDTO" />

            <data android:scheme="sms" />
            <data android:scheme="smsto" />
            <data android:scheme="mms" />
            <data android:scheme="mmsto" />
        </intent-filter>

为什么在第一种情况下应用程序列表中会显示应用程序图标,而在第二种情况下则不是?

当我需要打开Intent过滤器并关闭它时?

如果我这样做:

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
        <intent-filter>
            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.DEFAULT" />
         </intent-filter>
         <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <action android:name="android.intent.action.SENDTO" />
         </intent-filter>
         <intent-filter>
            <data android:scheme="sms" />
            <data android:scheme="smsto" />
            <data android:scheme="mms" />
            <data android:scheme="mmsto" />
        </intent-filter>

这是对的吗?

提前感谢答复和澄清:)

3 个答案:

答案 0 :(得分:1)

应该在接收者,服务或活动的开始和结束标签之间添加意图过滤器。它们表示应用程序可以处理的“隐含意图”。在您的应用程序菜单中,列出了所有应用程序,android会查找意图Main和Launcher。无论哪个应用程序将其作为意图过滤器,都会显示,并且一旦用户打开应用程序,就会调用与Main,Launcher关联的活动。

      <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

这两个与我的活动相关联的意图过滤器名为MainActivity告诉android到1)将我的应用程序放在菜单中。 2)用户选择应用程序后立即打开MainActivity。因此,您应该只有一个使用Main和Launcher的激活作为其意图过滤器。

例如,如果用户选择共享按钮及其隐含意图,则可以通过对话框/选择器调用具有过滤器形式的“共享选项”的应用程序。

编辑:

&LT;

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>

The first activity, MainActivity, is the app's main entry point—the activity that opens when the user initially launches the app with the launcher icon:

    The ACTION_MAIN action indicates this is the main entry point and does not expect any intent data.
    The CATEGORY_LAUNCHER category indicates that this activity's icon should be placed in the system's app launcher. If the <activity> element does not specify an icon with icon, then the system uses the icon from the <application> element.

These two must be paired together in order for the activity to appear in the app launcher.

The second activity, ShareActivity, is intended to facilitate sharing text and media content. Although users might enter this activity by navigating to it from MainActivity, they can also enter ShareActivity directly from another app that issues an implicit intent matching one of the two intent filters.

http://developer.android.com/guide/components/intents-filters.html 看看这个网站。因此,intent过滤器描述了活动可以做什么,如何启动(通过另一个应用程序或主启动器或浏览器)以及它可以执行的其他功能。

答案 1 :(得分:0)

相应于this指南:

  

要宣传您的应用可以接收的隐式意图,请声明一个   每个应用程序组件的更多或更多意图过滤器    清单文件中的元素。每个意图过滤器   根据intent的动作指定它接受的意图类型,   数据和类别。系统会向您提供隐含的意图   应用程序组件仅在意图可以通过您的一个意图时   过滤器。

     

应用组件应为每个唯一作业声明单独的过滤器   它可以做到。

     

每个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>

有关详细信息,请参阅the article

答案 2 :(得分:0)

阅读以下链接。这些将为您提供有关意图过滤器的好主意

http://www.tutorialspoint.com/android/android_intents_filters.htm

http://codetheory.in/android-intent-filters/