2015-05-15 2 views
10

Ich habe einen Robotium-Test für eine Android-Anwendung, die ActivityInstrumentationTestCase2 erweitert. Der Test arbeitet in einer Schleife, indem er willkürlich auf aktive Ansichten klickt. Ich möchte zu Beginn jeder Iteration überprüfen, welche Aktivität gerade im Fokus steht. Dieses Verhalten ist wichtig für mich, weil eine der Schaltflächen in der Lage ist, eine andere Aktivität zu starten, wodurch weitere Aktionen in der Schleife nicht möglich sind, da sie sich auf die zu testende Aktivität beziehen (dh wenn ich den Robotium-Test abbringe).Wie kann man herausfinden, welche Aktivität mit Robotium/Android SDK ganz oben auf dem Stack liegt?

Ich möchte eine generische Lösung, die für jede Aktivität funktionieren würde, ohne die onDestroy() -Methode ändern zu müssen. Diese Lösung muss auch funktionieren, wenn die Home-Taste gedrückt wird.

+1

Kann [dass] (http://stackoverflow.com/a/18115551/4762282) Ihnen helfen? – Ircover

+0

@Ircover, ja. Ich würde sagen, meine Frage ist eine doppelte Frage. Solltest du deinen Kommentar als Antwort für mich akzeptieren? Ich bin mir nicht sicher, wie ich hier vorgehen soll, aber du hast meine Lefie gerettet =). –

Antwort

1

Wie wir herausgefunden haben, this Link, um die Antwort auf diese Frage enthält.

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

Sie sollten

solo.getCurrentActivity()

für diesen Zweck verwenden können, funktioniert dies nicht für Sie? Wenn Sie nicht krank sind, vermeiden Sie das potentielle Problem und fragen Sie nach Ihrem Code, wenn Sie das Solo-Objekt konstruieren und welche Version von Roborium Sie verwenden.

+0

Hallo, Paul. Vielen Dank für die Hilfe. Leider gibt diese Methode die Aktivität zurück, die meine ActivityInstrumentationTestCase2 testen soll, nicht die aktuelle Aktivität für den Fokus. Ich könnte mein Problem lösen, indem ich folgendes befolge: http://StackOverflow.com/Questions/18115493/android-dynamicly-get-the-current-activity-in-foreground/18115551#18115551 –

+0

Dort war ein bekanntes Problem, wo es war Wenn du die Solo-Aktivität auf eine bestimmte Art und Weise konstruierst, würdest du falsch liegen, wenn du das postest, dann kann ich dir sagen, ob es das ist. –

+0

Sprechen Sie über die Verwendung der Solo-Konstruktoren Solo (getInstrumentation(), Aktivität) und Solo (getInstrumentation())? Mit denen zu spielen, funktionierte nicht für mich. –

0

Dieses ist für mich funktioniert, ist das Minimum SDK Level 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; 
} 
Verwandte Themen