让<activity-alias>打破singleTop模式的契约</activity-alias>

时间:2015-02-22 20:15:33

标签: android android-intent android-activity

这就是问题所在。我有一个&lt; activity-alias&gt;在我的清单中定义如下:

<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

我也有一个Intent从导航抽屉中启动HomeActivity。它以Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP标志开头 - 重用现有的活动实例。

问题是这不能按预期工作,它实际上创建了HomeActivity的新实例(即使它当前位于顶部且可见!)。 发生这种情况是因为活动后台包含.MainActivity的条目,而不是最终转发到的HomeActivity

问题:我怀疑这可能是也可能不是Android中的错误,但我很难找到一个合适的解决方法。在这里寻求帮助! :)

我只需要启动单个活动,当用户在navdrawer中选择一个项目时,该单个活动应该是onNewIntent(),而不是新生成的活动!

摆脱一个活动别名修复了一些事情,但对我来说这不是一个可接受的选择......

这是从启动器启动活动后的adb dumpsys结果,然后用户选择&#39; Home&#39;在navdrawer中直接启动活动,而不是通过别名(此转储确认有两个具有不同名称的条目):

  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}

1 个答案:

答案 0 :(得分:3)

您不必在启动它的类中引用您的HomeActivity,而是需要更改这些意图以启动&#34; MainActivity&#34;代替。

EX:

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>