15

我想在我的应用程序中有两个主要活动。所以在我的清单中我放了:

<activity
    android:name="mypackage1.MainActivity"
    android:label="@string/title_activity_main">

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

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

<activity
    android:name="mypackage2.MainActivity2"
    android:label="@string/title_activity_main2">

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

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

</activity>

在我的应用程序菜单中创建了两个图标。但是当我点击它们中的每一个时,第一个活动 MainActivity 总是会启动。有可能有两个主要活动吗?如果是这样,我所做的有什么问题?谢谢

4

3 回答 3

18

LAUNCHER意图过滤器决定了应用程序抽屉/启动器中显示的内容。这就是为什么您会显示两个图标的原因。

但是,您还设置了意图过滤器,它为整个包DEFAULT设置了默认值。Activity由于您设置了两次,因此您会遇到第一个/最新注册的优先级问题。删除DEFAULT过滤器后,您将能够启动在启动器中单击的任何内容。

简而言之,从两个活动中删除以下行:

<category android:name="android.intent.category.DEFAULT" /> 
于 2013-03-20T14:48:24.157 回答
14

是的,只需将您的两个或多个<activity>s 标记为LAUNCHER清单中。 此外,您必须android:taskAffinity在两个 Launcher-Activity 上设置属性,指定确切的包和要启动的 Activity。

<activity android:label="MyApp" android:name=".MyApp" android:taskAffinity="com.example.MainActivity">
        <intent-filter>
            <action android:name=".MyApp"/>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
</activity>


<activity android:label="Settings" android:name=".Settings" android:taskAffinity="com.example.SettingsActivity" >
    <intent-filter>
        <action android:name=".Settings"/>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>
于 2013-03-20T14:48:53.750 回答
0

使用android:documentLaunchMode="intoExisting", 根据意图的组件名称和数据 URI 启动单独的任务。如果没有这个(默认情况下),活动将共享所有相同的活动,android:documentLaunchMode默认为none.

intoExisting: The system searches for a task whose base intent's ComponentName and data URI match those of the launching intent. If the system finds such a task, the system clears the task, and restarts with the root activity receiving a call to onNewIntent(android.content.Intent). If the system does not find such a task, the system creates a new task. source

    <activity
        android:name=".CameraActivity"
        android:exported="true"
        android:documentLaunchMode="intoExisting"
        android:label="@string/app_1_label">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".ProfilePoseNetActivity"
        android:exported="true"
        android:documentLaunchMode="intoExisting"
        android:label="@string/app_2_label">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

The intention of potroae using task affinities to prevent your 2 activities from sharing the same task. However, it is annoying to have to select a task name, i.e. com.example/SettingsActivity for every task you want to launch separately.

于 2020-08-21T10:56:01.037 回答