我想在我的应用中有两个主要活动。所以在我的清单中我说:
<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总是会启动。是否可以进行两项主要活动?如果是这样,我做了什么错了? 感谢
答案 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
,这很烦人。