【问题标题】:Two main activities in AndroidManifest.xmlAndroidManifest.xml 中的两个主要活动
【发布时间】:2013-03-20 14:46:50
【问题描述】:

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

<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。有可能有两个主要活动吗?如果是这样,我所做的有什么问题? 谢谢

【问题讨论】:

    标签: android android-manifest


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我似乎遇到了麻烦。如果 ActivityA 启动了,我按下 ActivityB 的启动器,就会出现 ActivityA。
    【解决方案2】:

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

    【讨论】:

    • 来自文档 - “默认情况下,应用程序中的所有活动都具有相同的亲和力。”,因此您不必设置它。
    • 我阅读了这个问题,并在一个测试应用程序中进行了尝试。我的回答是有效的并且工作得很好。您不必设置不同的亲和力。
    • 它按照@poitroae 的建议工作。所以我会接受它是正确的。
    • @Gyonder,当然可以 - 我建议在没有不相关的任务亲和性设置的情况下基本相同。你在做一些不必要的事情,你不明白。
    • 我迟到了:在一个启动器活动 (A) 上设置 taskAffinity 解决了单击应用程序抽屉/启动器中的第二个启动器 (B) 会打开内存中的问题应用程序的活动 (A) 与打开预期活动 (B)。
    【解决方案3】:

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

    intoExisting:系统搜索其基本 Intent 的 ComponentName 和 data URI 与启动 Intent 匹配的任务。如果系统发现这样的任务,系统会清除该任务,并在根活动接收到 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,这很烦人。

    【讨论】:

      猜你喜欢
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      相关资源
      最近更新 更多