AndroidManifest.xml中的两个主要活动

时间:2013-03-20 14:46:51

标签: android android-manifest

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

<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总是会启动。是否可以进行两项主要活动?如果是这样,我做了什么错了? 感谢

3 个答案:

答案 0 :(得分:18)

LAUNCHER意图过滤器决定了应用抽屉/启动器中显示的内容。这就是你出现两个图标的原因。

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

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

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

答案 1 :(得分:13)

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

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

答案 2 :(得分:0)

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

intoExisting:系统搜索一个任务,该任务的基本意图的 ComponentName和数据URI 与启动意图的任务相匹配。如果系统找到了这样的任务,则系统将清除该任务,然后以root活动重新启动,并接收对onNewIntent(android.content.Intent)的调用。如果系统找不到此类任务,则系统将创建一个新任务。 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>

potroae 的意图是使用任务相似性来防止您的2个活动共享同一任务。但是,必须为每个要单独启动的任务选择一个任务名称,即com.example/SettingsActivity,这很烦人。