<activity-alias> 打破了 singleTop 模式的约定

dim*_*suz 7 android android-intent android-activity

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

<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>
Run Code Online (Sandbox Code Playgroud)

现在,用户开始MainActivity使用启动器图标,它转发到HomeActivity.

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

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

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

我只需要启动单个活动,当用户在导航抽屉中选择一个项目时,该单个活动应该得到 onNewIntent(),而不是新活动的产生!

摆脱活动别名可以解决问题,但这对我来说不是一个可以接受的选择......

adb dumpsys是从启动器启动活动后的结果,然后用户在 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}
Run Code Online (Sandbox Code Playgroud)

JRa*_*ond 3

您不需要HomeActivity在启动它的类中引用您的内容,而是需要更改这些意图来启动“ MainActivity”。

前任:

Intent intent = new Intent();
intent.setClassName(mContext, "ru.treto.tile.MainActivity");
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用其他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>
Run Code Online (Sandbox Code Playgroud)