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

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

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


person Paulo Barros    schedule 15.05.2015    source источник
comment
Может ли это помочь вам?   -  person Ircover    schedule 18.05.2015
comment
@Ирковер, да. Я бы сказал, что мой вопрос дублирует вопрос. Должны ли вы опубликовать свой комментарий в качестве ответа, чтобы я принял его? Я не знаю, как поступить, но вы спасли мою жизнь =).   -  person Paulo Barros    schedule 21.05.2015


Ответы (3)


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

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());
person Ircover    schedule 22.05.2015

Вы должны быть в состоянии использовать

соло.getCurrentActivity()

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

person Paul Harris    schedule 19.05.2015
comment
Здравствуйте, Пол. Большое спасибо за помощь. К сожалению, этот метод возвращает активность, которую должен тестировать мой ActivityInstrumentationTestCase2, а не текущую активность в фокусе. Я мог бы решить свою проблему, выполнив следующее: динамически получать текущую активность на переднем плане"> stackoverflow.com/questions/18115493/ - person Paulo Barros; 20.05.2015
comment
Раньше была известная проблема, из-за которой вам сказали бы, что вы ошибаетесь, если бы вы построили соло-активность определенным образом, и если вы опубликуете это, я могу сказать вам, так ли это. - person Paul Harris; 20.05.2015
comment
Вы говорите об использовании конструкторов Solo Solo(getInstrumentation(), activity) и Solo(getInstrumentation())? Игра с ними мне не удалась. - person Paulo Barros; 21.05.2015
comment
Я был да, вторая версия, скорее всего, сработает, использует ли ваша деятельность хост вкладок или что-то в этом роде? Я понимаю, что у вас есть обходной путь, но кажется неправильным, что роботиум запутался. - person Paul Harris; 22.05.2015

У меня работает, минимальный уровень 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;
}
person Denis Voloshin    schedule 21.05.2015