这就是问题所在。我的清单中有一个定义如下:
<activity
android:name=".HomeActivity"/>
<activity-alias
android:name=".MainActivity"
android:targetActivity=".HomeActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
现在,用户使用启动程序图标启动
MainActivity
,它将转发到HomeActivity
。我还打算从导航抽屉启动
HomeActivity
。它以Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP
标志开始-以重用活动的现有实例。问题是,这无法按预期工作,它实际上创建了一个新的
HomeActivity
实例(即使它当前位于顶部且可见!).这是因为活动backbackback包含一个
.MainActivity
条目,而不是它最后转发到的HomeActivity
条目。问:我怀疑这可能是Android系统的缺陷,也可能不是,但我很难找到一个像样的解决办法。在这里寻求帮助!:)
我只需要启动一个活动,当用户在navDrawer中选择一个项目时,这个活动应该得到onnewintent(),而不是新的活动生成!
去掉活动别名可以修复问题,但这不是我可以接受的选项…
以下是从Launcher启动活动后的
adb dumpsys
结果,然后用户在NavDrawer中选择“Home”,它直接启动活动,而不是通过别名(此转储确认有两个名称不同的条目): Main stack:
TaskRecord{4181c408 #61 A ru.treto.tile U 0}
Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=ru.treto.tile/.HomeActivity }
Hist #2: ActivityRecord{412514b8 ru.treto.tile/.HomeActivity}
Intent { flg=0x24000000 cmp=ru.treto.tile/.HomeActivity }
ProcessRecord{412b06e0 10165:ru.treto.tile/u0a63}
Hist #1: ActivityRecord{41723200 ru.treto.tile/.MainActivity}
Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=ru.treto.tile/.MainActivity }
ProcessRecord{412b06e0 10165:ru.treto.tile/u0a63}
最佳答案
不要在启动它的类中引用您的HomeActivity
,而是需要改变这些意图来启动“MainActivity
”。
前任:
Intent intent = new Intent();
intent.setClassName(mContext, "ru.treto.tile.MainActivity");
或者,如果使用另一个
IntentFilter
方案,则可以将这些intentfilter元素移动到清单中的alias
条目:<activity-alias
android:name=".MainActivity"
android:target="ru.treto.tile.HomeActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="ru.treto.tile.ACTION_OF_AWESOME" />
</intent-filter>
</activity-alias>