使用FLAG_ACTIVITY_CLEAR_TOP测试活动是否已启动

时间:2014-11-25 09:31:42

标签: android unit-testing android-activity robolectric

Robolectric允许使用Activity测试shadowOf(activity).peekNextStartedActivity()是否已启动。但是,如果ActivityFLAG_ACTIVITY_CLEAR_TOP启动,则此方法似乎无效。这是直观的,因为此标志的目的不是启动新的Activity,而是将后备堆栈中的现有Activity放在前面。有没有办法测试这种情况?

更新

我的测试场景如下:

涉及3个活动,让他们称他们为A,B和C.测试中的活动是B,由A.开始.B现在开始C得到结果,当收到结果时回到A使用FLAG_ACTIVITY_CLEAR_TOP标志。即使当时堆栈中没有活动A,我也希望它能够启动并通过peekNextStartedActivity()提供。

3 个答案:

答案 0 :(得分:4)

每当您从活动发送意图时(例如),您都可以使用set flags方法:

Intent i = new Intent(MyActivity.this, SomeActivity.class);
i.setFlags(FLAG_ACTIVITY_CLEAR_TOP | SOME_OTHER_FLAGS...);
startActivity(i);

关于结果活动(示例中的SomeActivity),您可以使用getIntent方法:

getIntent().getFlags()

所以真正的问题是:如何将标志拆分为基本组件(按位OR)

基于这篇文章:http://code.tutsplus.com/articles/understanding-bitwise-operators--active-11301

只需使用您需要的组件检查标志

if ((getIntent().getFlags() & FLAG_ACTIVITY_CLEAR_TOP) != 0)
{
     // do something here
}

答案 1 :(得分:0)

我试过测试:

private void checkMainActivityIsStarted()
{
    activity.showMainActivity();

    Intent intent = shadowOf( activity ).getNextStartedActivity();
    assertThat( intent ).hasComponent( Robolectric.application, MainActivity.class );
    assertThat( intent.getFlags() ).isEqualTo( Intent.FLAG_ACTIVITY_CLEAR_TOP );
}

下一个代码:

public void showMainActivity()
{
    Intent intent = new Intent( this, MainActivity.class );
    intent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );
    startActivity( intent );
}

它对你有用吗?

<强>更新

至于我,你应该把这个测试分成两部分:

  1. 活动C正在返回正确的结果代码
  2. 当您致电onActivityResult时,活动B(它是公共方法)会触发活动A
  3. 至于我,没有必要在活动之间测试Android传递意图。如果我理解错误,请纠正我。

答案 2 :(得分:0)

它绝对可以解决您的问题。

  Intent i = new Intent(MyActivity.this, SomeActivity.class);
    i.setFlags(FLAG_ACTIVITY_CLEAR_TOP | SOME_OTHER_FLAGS...);
    startActivity(i);

但是如果你可以在B到C的意图时完成你当前的活动,当它显示结果和完成C活动时,它将带你进入A屏幕。