Android:为什么将Android应用程序的名称作为起始活动的名称?

kik*_*iki 3 android

在我的清单文件中,我将应用程序名称作为MyApp,将起始活动的名称作为主菜单.

<application android:theme="@style/theme" android:icon="@drawable/myicon" android:label="@string/app_name">
    <activity android:name=".MainMenu"
              android:label="@string/mainmenu_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
Run Code Online (Sandbox Code Playgroud)

当我在android的默认菜单屏幕中看到应用程序图标时,显示的名称是主菜单.为什么MyApp不是应用程序显示的名称?

Fel*_*lix 10

因为您的应用可以定义在启动器中显示的多个活动.具有此类意图过滤器的所有活动:

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)

将出现在启动器中,每个都有自己的标签.事实上,如果你没有在你的活动上定义一个标签,它从应用程序继承的基本上是一种商品.


此外,每个活动都有自己的android:icon(同样,它继承自<application>商品).使用此属性,您的两个启动器条目不仅可以具有不同的标签,还可以具有不同的图标.


更一般地说,即使是"非主要"活动也可以处理某些类型的事件,在这些情况下,它们的标签和图标是相关的.例如,如果您的某个活动(无关紧要)处理ACTION_SEND意图(如大多数共享应用程序那样 - 请参阅Facebook,Twitter,...),那么每当用户在任何应用程序中按下"共享"按钮时,可以完成向用户显示某些活动的应用程序列表(在这种情况下,这些应用程序可以是Facebook,Twitter和您的应用程序).此列表将包含图标和标签(即Facebook徽标Facebook的).您的条目的显示将由您的接收定义的android:iconandroid:label属性决定<activity>,并且只有在它没有定义它们时,它们才会从您的接收中获取<application>.

这允许您在不修改应用程序名称的情况下输入"通过MyApp共享"等条目.或者,如果您的应用程序还有一个处理的活动ACTION_VIEW,那么该活动可能具有标签"在MyApp中查看".


更深入地挖掘<intent-filter>元素可以拥有自己的标签和图标.基本上,Android选择图标和标签来显示如下:

  • 如果<intent-filter>有,请选择,停止.
  • 如果<activity>有,请选择,停止.
  • 挑选一个<application>.

这在两种情况下很有用:

  1. 您不想更改活动的标签/图标:也许您想在其他地方使用它们,例如标题栏(并且您不希望标题栏说"通过MyApp共享")
  2. 您有多个意图过滤器的活动.例如,您可以在同一活动中处理两者ACTION_SENDACTION_VIEW意图.在这种情况下,您将为该活动设置两个意图过滤器,其标签为"通过MyApp共享"和"在MyApp中查看".

我希望我已经明确表示,这些是非常基本的事情,起初可能很难掌握,但这为构建应用程序并将它们与Android系统和/或其他应用程序集成提供了极大的灵活性.


另外需要注意的是,您可以轻松地拥有一个在启动器中没有任何条目的应用程序(通过上面提到的intent过滤器没有任何活动).这些是完全有效的应用程序,在创建仅限服务的应用程序(例如小部件)时,这是一种很好的做法.