2015-05-15 80 views
10

我有一個Android應用程序的Robotium測試,它擴展了ActivityInstrumentationTestCase2。測試在循環中運行,隨機點擊活動視圖。我想在每次迭代開始時驗證哪些活動目前關注。這種行爲對我來說很重要,因爲其中一個按鈕能夠啓動另一個Activity,因此循環中的其他操作不可行,因爲它們引用了待測活動(這是我停止Robotium測試時)。如何使用Robotium/Android SDK找出堆棧頂部的Activity?

我想要一個適用於任何Activity的通用解決方案,而無需更改onDestroy()方法。此解決方案也必須適用於按下主頁按鈕時。

+1

Can [that](http://stackoverflow.com/a/18115551/4762282)能幫助你嗎? – Ircover

+0

@翻譯,是的。我會說我的問題是一個重複的問題。您是否應該將您的評論發佈爲我接受的答案?我不知道如何在這裏繼續,但你救了我的lfie =)。 –

回答

1

我們發現,this鏈接包含這個問題的答案。

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

您應該能夠使用

solo.getCurrentActivity()

用於這個目的,這個工作不適合你?如果沒有病態,則在構建獨奏對象時使用,並預先考慮潛在問題並詢問您的代碼以及您使用的是哪種版本的roborium。

+0

你好,保羅。非常感謝您的幫助。不幸的是,這種方法返回ActivityInstrumentationTestCase2應該測試的活動,而不是當前關注的活動。我可以通過以下解決我的問題:http://stackoverflow.com/questions/18115493/android-dynamicly-get-the-current-activity-in-foreground/18115551#18115551 –

+0

曾經有一個已知的問題,它如果你以某種方式構建了獨奏活動,會發現你錯了,如果你發佈了,那麼我可以告訴你是否它。 –

+0

您是否在討論Solo構造函數Solo(getInstrumentation(),activity)和Solo(getInstrumentation())的使用?玩這些並不適合我。 –

0

這一個對我的作品,最小的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; 
}