2014-11-25 2 views
5

Robolectric позволяет проверить, что Activity был запущен с использованием shadowOf(activity).peekNextStartedActivity(). Однако этот метод не работает, если Activity запущен с FLAG_ACTIVITY_CLEAR_TOP. Это интуитивно понятно, так как целью этого флага является не запуск нового Activity, а перенос существующего Activity в задний стек спереди. Есть ли способ проверить этот сценарий?Проверка того, что действие было начато с FLAG_ACTIVITY_CLEAR_TOP

UPDATE

Мой сценарий тестирования заключается в следующем:

Есть 3 Деятельность участвующих, давайте назовем их A, B и C. Деятельность в испытании В, который был начат А. Б теперь начинается C для результата, и когда результат получен, возвращается к A с использованием флага FLAG_ACTIVITY_CLEAR_TOP. Хотя в то время в стеке нет активности A, я ожидаю, что он будет запущен и будет доступен через peekNextStartedActivity().

ответ

2

всякий раз, когда вы отправляете умысел деятельности (например), вы можете использовать метод установки флагов:

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

на результате деятельности (SomeActivity в примере), вы можете использовать метод getIntent:

getIntent().getFlags() 

поэтому реальный вопрос: как разделить обратно флаги в их основных компонентов (побитовое ИЛИ)

на основе этой статьи: http://code.tutsplus.com/articles/understanding-bitwise-operators--active-11301

просто проверить флаги с компонентом вы должны

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

В моем случае я был бы счастлив даже проверить, что действие было начато с помощью проверки его ComponentName, однако peekNextStartedActivity() не возвращает правильную активность, если я использую FLAG_ACTIVITY_CLEAR_TOP, чтобы запустить его. – Egor

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); 
} 

работает ли он для вас ?

UPDATE

Что касается меня, вы должны разделить этот тест на два:

  1. активность C возвращается правильный код результата
  2. активность B при вызове onActivityResult (это публичный метод) пожаротушение A

Что касается меня, нет смысла тестировать передачу Android в битве в деятельности. Поправьте меня, если я понял что-то не так.

+0

В моем сценарии я запускаю этот вид намерения в onActivityResult(), обрабатывая результат, отправленный другим действием (назовем его A). В тесте я запускаю Activity A, получаю его результат и вижу, вызвал ли он FLAG_ACTIVITY_CLEAR_TOP Intent. Тем не менее, peekNextStartedActivity() также и getNextStartedActivity() также дает мне намерение к действию A. – Egor

+0

Я бы разделил его на два теста –

+0

Да, но AFAIK это единственный способ проверить onActivityResult() – Egor

0

Это определенно решает вашу проблему.

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

, но если вы можете закончить текущую активность в момент намерения от В до С и когда он показывает результат и деятельность Finish C это Защиту принимает вас на экране.

Смежные вопросы