2014-11-25 12 views
5

Robolectric consente di testare che è stato avviato un Activity utilizzando shadowOf(activity).peekNextStartedActivity(). Tuttavia, questo metodo non sembra funzionare se Activity viene avviato con FLAG_ACTIVITY_CLEAR_TOP. Questo è intuitivo dal momento che lo scopo di questo flag non è quello di avviare un nuovo Activity ma di portare uno esistente nello stack posteriore in primo piano. C'è un modo per testare questo scenario?Verificare che un'attività sia stata avviata con FLAG_ACTIVITY_CLEAR_TOP

UPDATE

mio scenario di test è la seguente:

Ci sono 3 Attività coinvolti, diamo loro una chiamata, B e C. Attività in prova è B, che è stato avviato da A. B ora inizia C per il risultato e quando il risultato viene ricevuto torna a A usando il flag FLAG_ACTIVITY_CLEAR_TOP. Anche se non ci sono attività A nello stack in quel momento, mi aspetto che venga avviato e che sia disponibile tramite peekNextStartedActivity().

risposta

2

ogni volta che si invia un intento dall'attività (per esempio), è possibile utilizzare il metodo di bandiere:

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

sull'attività portato (SomeActivity nell'esempio) è possibile utilizzare il metodo getIntent:

getIntent().getFlags() 

quindi la vera domanda è: come dividere di nuovo le bandiere nelle loro componenti di base (OR bit a bit)

sulla base di questo articolo: http://code.tutsplus.com/articles/understanding-bitwise-operators--active-11301

semplicemente controllare le bandiere con il componente è necessario prova

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

Nel mio caso, sarei felice di controllare che l'attività sia stata avviata tramite il controllo di ComponentName, tuttavia, peekNextStartedActivity() non restituisce l'attività corretta se utilizzo FLAG_ACTIVITY_CLEAR_TOP per avviarlo. – Egor

0

ho provato:

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

Per il codice successivo:

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

Funziona per voi ?

UPDATE

Quanto a me si dovrebbe dividere questo test in due:

  1. attività C sta tornando corretto codice risultato
  2. Attività B quando si chiama onActivityResult (è il metodo pubblico) incendi A

Per quanto mi riguarda, non ha senso testare intenti transitori Android betw altre attività. Correggimi se ho capito qualcosa di sbagliato.

+0

Nel mio scenario, sto sparando questo tipo di Intento in onActivityResult(), gestendo il risultato inviato da un'altra attività (chiamiamola A). Nel test, avvio l'attività A, ne ricevo il risultato e vedo se ha attivato l'intento FLAG_ACTIVITY_CLEAR_TOP. Tuttavia, peekNextStartedActivity() (e getNextStartedActivity()) mi dà l'intenzione di attività A. – Egor

+0

L'ho diviso in due prove –

+0

Sì, ma AFAIK è l'unico modo per testare suActivityResult() – Egor

0

Risolve definitivamente il tuo problema.

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

ma se è possibile completare l'attività corrente al momento di intenti da B a C e quando mostra il risultato e l'attività Fine C Ti porta definizione su uno schermo.

Problemi correlati