如果使用FLAG_ACTIVITY_REORDER_TO_FRONT,则后退按钮不会加载堆栈中的最后一个活动

时间:2016-05-23 08:01:38

标签: android android-intent

我有两个屏幕,A和B.屏幕A有一个启动活动B的按钮,屏幕B有一个启动活动A的按钮。

预期的行为是,如果活动在后台堆栈中可用,则应将其重新排序到前端而不创建新的活动。为此,我在两个活动的点击事件中添加了标志FLAG_ACTIVITY_REORDER_TO_FRONT。这是听众代码。

Button btn=(Button)findViewById(R.id.button);
final Activity activity=this;
btn.setOnClickListener(new View.OnClickListener(){
   @Override
   public void onClick(View v){
      Intent intent=new Intent(activity,ScreenB.class);
      intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
      startActivity(intent);
   }
});

这是预期的。 A是第一个屏幕(在启动后,因此A不是启动器屏幕)。

  • Stack是“A(Top)”
  • 点击屏幕A上的按钮。屏幕B是(新创建的)启动。堆栈是“A-> B(顶部)”
  • 现在点击屏幕B上的按钮。屏幕A是(重新排序到前面)启动。堆栈是“B-> A(顶部)”

此时,如果按下后退按钮,则应删除A并且B应该是可见的(理论上)。但是会发生什么,在后退按钮App上不再可见,并且移动设备的主发射器出现。如果我从最近的应用程序重新打开应用程序,它将在B处打开。这意味着当按下后退按钮时B必须在堆栈中,但是应用程序没有显示,而是显示移动启动器。

我还应该做些什么才能获得预期的行为?

我添加了用于测试的屏幕C(第3屏幕)

现在我有3个屏幕。所有人都有两个按钮来启动另外两个。

  • Stack是“A(Top)”
  • 从屏幕A,单击ButtonB,B启动(新),堆栈A-> B(顶部)
  • 从屏幕B,点击ButtonC,启动C(新),堆栈A-> B-> C(顶部)
  • 点击屏幕C,点击ButtonA,A启动(重新排序),堆栈B-> C-> A(顶部)
  • 按下后退按钮,A被移除,应用程序熄灭,移动启动器可见。堆栈B-> C(顶部)
  • 从最近的应用列表中打开应用。 C是可见的。堆栈B-> c(顶部)
  • 按压背部,移除C并且可见B.堆栈B(顶部)。此时它表现正常。

1 个答案:

答案 0 :(得分:2)

这是Android中的一个已知问题,它在Kitkat(4.4.2)之后重新出现并且尚未修复。有关此问题的更多信息,请参阅此link

question包含有关该主题的更详细的讨论,但总的来说,存在相关的变通方法,但它们的有效性因您的用例而异,并且每个都可能会引入一些不必要的后果,例如设置{{将您的活动1}}移至launchMode文件中的singleInstance