2015-05-15 19 views
10

Ho un test Robotium per un'applicazione Android, che estende ActivityInstrumentationTestCase2. Il test funziona su un loop, facendo clic in modo casuale sulle viste attive. Vorrei verificare all'inizio di ogni iterazione quale Attività è attualmente focalizzata. Questo comportamento è importante per me perché uno dei pulsanti è in grado di avviare un'altra attività, rendendo impossibili ulteriori azioni nel ciclo, poiché si riferiscono all'attività sotto test (questo è quando interrompo il test di Robotium).Come scoprire quale Attività è in cima allo stack usando Robotium/Android SDK?

Desidero una soluzione generica che funzioni per qualsiasi attività, senza la necessità di modificare il metodo onDestroy(). Questa soluzione deve funzionare anche quando viene premuto il pulsante Home.

+1

Può [che] (http://stackoverflow.com/a/18115551/4762282) aiutarti? – Ircover

+0

@Ircover, sì. Direi che la mia domanda è una domanda doppia. Dovresti pubblicare il tuo commento come risposta da accettare? Non sono sicuro di come procedere qui, ma hai salvato il mio lfie =). –

risposta

1

Come abbiamo scoperto, this link contiene la risposta a questa domanda.

ActivityManager am = (ActivityManager) this .getSystemService(ACTIVITY_SERVICE); 
List<RunningTaskInfo> taskInfo = am.getRunningTasks(1); 
ComponentName componentInfo = taskInfo.get(0).topActivity; 
Log.d(WebServiceHelper.TAG, "CURRENT Activity ::" + taskInfo.get(0).topActivity.getClassName()+" Package Name : "+componentInfo.getPackageName()); 
2

Si dovrebbe essere in grado di utilizzare

solo.getCurrentActivity()

per questo scopo, è questo non funziona per voi? Se non lo è, pre-empt il potenziale problema e chiedi il tuo codice quando costruisci l'oggetto solista e quale versione di roborium stai usando.

+0

Ciao, Paul. Grazie mille per l'aiuto. Sfortunatamente, questo metodo sta restituendo l'attività che il mio ActivityInstrumentationTestCase2 dovrebbe testare, non l'attività corrente su focus. Potrei risolvere il mio problema seguendo questo: http://stackoverflow.com/questions/18115493/android-dynamicly-get-the-current-activity-in-foreground/18115551#18115551 –

+0

C'era un problema noto dove ti sbaglierebbe se costruissi l'attività da solista in un certo modo, se lo pubblichi allora posso dirti se è così. –

+0

Stai parlando dell'uso dei Solo costruttori Solo (getInstrumentation(), activity) e Solo (getInstrumentation())? Giocare con quelli non ha funzionato per me. –

0

Questo funziona per me, il livello minimo SDK è 18

public static Activity getCurrentActivity(){ 
    try { 
     Class activityThreadClass = Class.forName("android.app.ActivityThread"); 
     Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null); 
     Field activitiesField = activityThreadClass.getDeclaredField("mActivities"); 
     activitiesField.setAccessible(true); 
     ArrayMap activities = (ArrayMap) activitiesField.get(activityThread); 
     for (Object activityRecord : activities.values()) { 
      Class activityRecordClass = activityRecord.getClass(); 
      Field pausedField = activityRecordClass.getDeclaredField("paused"); 
      pausedField.setAccessible(true); 
      if (!pausedField.getBoolean(activityRecord)) { 
       Field activityField = activityRecordClass.getDeclaredField("activity"); 
       activityField.setAccessible(true); 
       Activity activity = (Activity) activityField.get(activityRecord); 
       return activity; 
      } 
     } 
    }catch (Exception e){ 
     logger.error(e.getMessage()); 
    } 
    return null; 
}