Как узнать, какая активность находится поверх стека, используя Robotium/Android SDK?

У меня есть тест Robotium для приложения для Android, который расширяет ActivityInstrumentationTestCase2. Тест работает на цикле, случайно нажимая на активные виды. Я хотел бы подтвердить в начале каждой итерации, что в настоящее время Activity. Такое поведение важно для меня, потому что одна из кнопок способна запускать другое действие, что делает невозможным дальнейшие действия в цикле, поскольку они относятся к тестируемой активности (это когда я останавливаю тест Robotium).

Я хотел бы, чтобы общее решение работало для любого Activity, без необходимости изменения метода onDestroy(). Это решение также должно работать, когда нажата кнопка "Домой".

Ответ 1

Как мы выяснили, эта ссылка содержит ответ на этот вопрос.

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

для этой цели, разве это не работает для вас? Если это не так, упредите потенциальную проблему и спросите у вас код, когда вы строите сольный объект и какую версию робора вы используете.

Ответ 3

Это работает для меня, минимальный уровень 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;
}