两个启动器活动

54

我有两个标记了Intent过滤器的活动。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.package"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="7" />

<application
    android:name=".MyApp"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >

    <!-- work order activity -->
    <activity
        android:name=".app.WorkOrderActivity"
        android:label="@string/work_order"
        android:taskAffinity="com.package.task_for_work_order_activity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

    <!-- inventory activity -->
    <activity
        android:name=".app.InventoryActivity"
        android:label="@string/inventory"
        android:taskAffinity="com.package.task_for_inventory_activity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

问题在于,当我安装APK文件时,没有显示任何活动,因为我理解的是系统无法指定应该显示什么活动。

我只需要在启动器中显示两个活动,请不要建议从第二个活动中删除意图过滤器,如果你这样做了,请提供另一种方法来在启动器中显示两个图标。


请告诉我更多细节,为什么您需要它? - Natali
1
因为我有两个完全分离的UI模块,所以我将它们保留在不同的活动中,并希望它们都可以从Android仪表板访问。 - Orest
1
在最新的Android版本中,上述代码可以正常工作 - 首个在Android清单中声明的活动将获得优先权并显示给用户。 - bschandramohan
5个回答

90

你需要通过向 intent-filter 添加以下行来指定哪个活动是默认活动:

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

将此代码插入默认活动并保留其余部分,然后它应该能够正常工作。

您可能还想使用属性android:icon="@drawable/myothericon"为第二个活动添加不同的图标。


1
啊,这就是我一直在找的,但我找不到它。这就是正确的答案。 - Mark B
年,这对我很有用。 - wangzhengyi
10
在最新的Android版本中,如果存在多个启动器活动并且没有放置category标签,则在Android清单文件中首先提到的活动将作为启动活动启动。 - RBT
1
当我启动两个活动时,我的手机上会显示两个启动图标。如何删除其中一个图标? - Hitesh Tarbundiya
1
答案是否已过时或完全错误?请参见https://dev59.com/5m025IYBdhLWcg3w6KSO - Heinzlmaen
这个功能无法正常工作。我有两个活动。第一个活动有一个名为“Main”的操作,而对于第二个活动,我添加了默认类别。但是它只打开第一个活动(没有默认但有Main)。我想打开第二个活动而不添加Main(因为这会添加2个图标)。但我不能从第一个活动中删除Main,因为它在一个库中。 - Tushar Gogna

4
在两个意图过滤器中定义 android:name 属性的 <action> 项目。
<application
    android:name=".MyApp"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >

    <!-- work order activity -->
    <activity
        android:name=".app.WorkOrderActivity"
        android:label="@string/work_order"
        android:taskAffinity="com.package.task_for_work_order_activity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name=".app.WorkOrderActivity"/>
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <!-- inventory activity -->
    <activity
        android:name=".app.InventoryActivity"
        android:label="@string/inventory"
        android:taskAffinity="com.package.task_for_inventory_activity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name=".app.InventoryActivity"/>
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

那个 <action android:name=".app.InventoryActivity"/> 是什么???你不需要它。 - user924

3

2
永远不要发布基本上是“其他地方”的答案……链接可能会被删除或更改……即使如此,你也像是在向其他用户展示这样的东西:“你想解决这个问题吗?去那里看看吧……”……然后变成了“循环逻辑之所以有效是因为循环逻辑之所以有效是因为循环逻辑之所以有效是因为goTo(charAt(0)”。 - Bonatti
请阅读此链接:“提供链接的上下文”,其中指出:鼓励提供外部资源的链接,但请在链接周围添加上下文,以便您的同行用户了解它是什么以及为什么存在。始终引用重要链接的最相关部分,以防目标站点无法访问或永久离线。 - Bonatti
我只是在请求您回答一个问题,通过给出答案,而不是把任何人引导到其他地方(即使是“内部”stackoverflow域),同样,那个问题的所有者可以“删除”问题,答案可以被编辑,甚至问题本身也可以关闭... 我要求您改进自己回答问题的方式,以帮助他人。 - Bonatti

3

我认为这是因为"android.intent.action.MAIN"的操作,这对我有用:

<application>
    <activity android:name=".MyActivityA" android:icon="@drawable/aicon"  android:label="@string/app_name">
        <intent-filter>
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".MyActivityB" android:icon="@drawable/bicon" android:label="@string/app_name">
        <intent-filter>
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
 </application>

2
我尝试过了,但是在这种情况下,第二个活动在我的启动器中没有显示出来...我找不到解决办法...也许这是Android 2.1的问题。 - Orest
我尝试删除第二个MAIN操作,并在2.3.3模拟器上运行它,但无用。 - Orest

2

我在运行API版本为29的模拟器上进行了测试。以下内容已经足够:

<activity
    android:name=".MyActivity"
    android:label="Activity 1"
    android:exported="true">

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

</activity>

<activity
    android:name=".MyActivity2"
    android:label="Activity 2"
    android:exported="true">

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

</activity>

一些人认为这种方法不起作用的原因是,如果应用程序已经在运行,无论您单击启动器上的哪个活动,它都会恢复运行该应用程序中的上一个活动。但是尝试(强制)停止应用程序,然后您将看到与您在启动器上单击的活动对应的活动开始运行。

我们通常不希望出现这种行为,因此我们可以通过使用<activity android:taskAffinity="an.identifier.for.the.task">在不同任务中启动活动,例如:

<activity
    android:name=".MyActivity"
    android:label="Activity 1"
    android:exported="true"
    android:taskAffinity=".task.sellers">

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

</activity>

<activity
    android:name=".MyActivity2"
    android:label="Activity 2"
    android:exported="true"
    android:taskAffinity=".task.buyers">

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

</activity>

我在智能手机版本的应用程序中有这个解决方案。它正常工作。但是在我的 Android 11 手表版本的应用程序上却无法正常工作。你有什么想法是什么原因吗? - Kacper Sierakowski
@KacperSierakowski,抱歉,但我不知道(我从未使用过Wear OS)。 - Peppe L-G

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