android.intent.action.MAIN的含义是什么?

108

我看过很多不同且令人困惑的解释...

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

什么是...的意思?

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

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

 <category android:name="android.intent.category.DEFAULT" />
4个回答

112

ACTION_MAIN 被认为是应用程序的入口点。通常与 CATEGORY_LAUNCHER 结合在 <intent-filter> 中,以指示应该显示在主屏幕启动器中或任何其他自认为是启动器的地方的活动。这样的“启动器”可以使用 queryIntentActivities() 查询 PackageManager,以查找此类活动并将其显示给用户。

但是,ACTION_MAIN 可以与其他类别结合使用以进行其他专门的目的。例如,带有 ACTION_MAINCATEGORY_CAR_DOCK 表示当用户将手机放入制造商提供的汽车停靠站时应考虑显示的活动候选者。

当使用 startActivity() 时,如果 Intent 还没有被放置到任何类别中,则会将其放置到 CATEGORY_DEFAULT 中。因此,一个 <activity> <intent-filter> 需要指定 一些 <category>,如果没有其他内容可用,则使用 <category android:name="android.intent.category.DEFAULT" />


1
点赞!我知道你会回答这个问题,我一直在等待着像预期的那样阅读一个清晰简洁的答案。谢谢。 - Spurdow
8
嗯,你还没有解释为什么我们需要两个。我的意思是,ACTION_MAIN = ENTRY POINT,这一点我懂了。CATEGORY_LAUNCHER = 表示一个活动应该出现在主屏幕的启动器中。这两个句子只是用不同的措辞表达,它们不是吗? - frankelot
10
不,它们不是一样的。通过阅读答案,包括第二段提供的一个例子,可以看出这是ACTION_MAIN不同用法,它不涉及类似于主屏幕风格的启动器。 - CommonsWare
2
@vgokul129:因为主屏幕启动器专门寻找具有<intent-filter><action android:name="android.intent.action.MAIN" />以及<category android:name="android.intent.category.LAUNCHER" />的活动。 - CommonsWare
2
@vgokul129:“准确地说,在启动器中单击图标时,不应调用startActivity(intent)”——只有在编写自己的主屏幕和自己的启动器并提供此类功能时才会如此。主屏幕启动器的行为取决于该主屏幕的实现者。大多数关注启动广告活动,因为这是启动器的主要角色。您可以拥有一个立即调用finish()的活动,但用户会认为您的应用程序已损坏。 - CommonsWare
显示剩余7条评论

82

android.intent.action.MAIN 表示该活动是应用程序的入口点,即当您启动应用程序时,将创建此活动。

来自文档

ACTION_MAIN with category CATEGORY_HOME -- Launch the home screen.

此外,可以从这里了解更多信息。

Activity Action Start作为主入口点,不希望接收数据。

android.intent.category.DEFAULT主要用于隐式意图。如果您的Activity希望通过隐式意图启动,则应将此类别包含在其过滤器中。如果您的Activity可能会在未分配特定类别的情况下由隐式Intent启动,则其Intent过滤器应包括此类别。

android.intent.category.LAUNCHER

category -- 提供有关要执行的操作的附加信息。

CATEGORY_LAUNCHER表示它应该出现在Launcher中作为顶级应用程序。

请参阅文档:

  1. http://developer.android.com/reference/android/content/Intent.html
  2. http://developer.android.com/guide/topics/manifest/action-element.html

5
不,仅有MAIN本身不会“启动主页活动”。MAIN有很多用途。 - CommonsWare
请访问 https://dev59.com/1V8e5IYBdhLWcg3w7t_P#25219614 了解更多信息。 - Abhimanyu

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

这个应用的主要活动
 <category android:name="android.intent.category.LAUNCHER" />

它属于“启动器”类别,这意味着它会在任何被认为是“启动器”的地方(例如主屏幕)获得一个图标。
 <category android:name="android.intent.category.DEFAULT" />

如果没有指定其他类别,调用startActivity()将始终添加DEFAULT类别。通常即使您有其他类别,也只需添加android.intent.category.DEFAULT。这将保证如果请求Intent在使用startActivity(intent)启动Intent时没有提供任何类别,则接收Activity也可以接收这些Intent。来源:The Busy Coders Guide to Android Development。链接:https://commonsware.com/Android/

1
感谢您的解释。 - Pencilcheck

0
  • 以上的回答都很好,所以我只是想補充一些空缺。

<action / > 元素

  • 我们都知道当 Android 系统打开我们的应用时,它会发送一个隐式意图,如文档所述: Android 系统通过将意图的内容与设备上其他应用程序的清单文件中声明的意图过滤器的内容进行比较,找到适当的组件来启动。如果意图与意图过滤器匹配,则系统启动该组件并向其传递 Intent 对象。

  • 现在每个 intent-filter 根据意图的 <action><category/><data/> 来指定它接受的意图类型。

  • 因此,使用 <action><category/>,我们定义了我们的活动可以接受的意图的名称和类别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接