如何使用Robotium / Android SDK找出堆栈顶部的Activity?

我有一个Android应用程序的Robotiumtesting,它扩展了ActivityInstrumentationTestCase2。 testing在一个循环上运行,随机点击活动视图。 我想在每次迭代开始时validation哪些活动目前关注。 这种行为对我来说很重要,因为其中一个button能够启动另一个Activity,因此在循环中进一步的操作是不可能的,因为它们引用了被测活动(这是停止Robotiumtesting的时候)。

我想要一个适用于任何Activity的通用解决scheme,而不需要更改onDestroy()方法。 此解决scheme也必须在按下主页button时起作用。

Solutions Collecting From Web of "如何使用Robotium / Android SDK找出堆栈顶部的Activity?"

正如我们发现的, 这个链接包含了这个问题的答案。

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

你应该可以使用

solo.getCurrentActivity()

为此目的,这不适合你吗? 如果没有病态,则在构build独奏对象和您正在使用的哪个版本的roborium时,先行预测潜在问题并询问您的代码。

这个为我工作,最低的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; }