我的应用程序具有如下所示的活动堆栈
- A:加载活动
- B:主要活动
- C:详细活动
清单是这样的
<activity A>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity B android:launchMode="singleTask"/>
<activity C/>
当我从启动器启动应用程序时,它充当 A -> B -> C 。在活动 C 上按 Home 按钮并从最近的应用程序列表中调用它(长按 Home),显示 C。还行吧。
但是当我从通知启动应用程序时,因为我不想显示加载屏幕,所以启动活动 B。所以,用户可以导航 B -> C。
但是当用户在活动 C 上按 Home 并从最近的应用程序列表中选择应用程序时,B 会重新启动并且不会保留状态。所以C活动总是消失。
我尝试了许多标志选项,但没有找到解决方案。我想要的是应用程序的行为就像用户从启动器启动应用程序时一样。
我为这样的通知创建了待处理的意图。在我的应用程序中,我应该Intent.FLAG_ACTIVITY_CLEAR_TOP
用于活动 B。
Notification notice = new Notification(R.drawable.icon_notification, context.getString(R.string.app_name), System.currentTimeMillis());
Intent intent = new Intent(context, B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtras(i);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
我认为最近的应用程序列表发送相同的通知意图,所以总是调用活动 B。但是当我从启动器启动应用程序时,它只会将我发送到最后一个活动 C,而不是 B。
请帮助我。:(
更新
我已经解决了这个问题,如下所示。
- 添加具有不同任务亲和力的新活动 D。此活动刚开始 B(主要活动)
- 在通知中,开始活动 D
- 在活动 D 中,以一些标志开始活动 B 并自行完成
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0 ) {
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | Intent.FLAG_ACTIVITY_NEW_TASK);
} else {
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
我已经注册了活动 D,如下所示
<activity
android:name="D"
android:clearTaskOnLaunch="true"
android:excludeFromRecents="true"
android:exported="false"
android:launchMode="singleInstance"
android:noHistory="true"
android:taskAffinity="xxx"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
</activity>