Как узнать, какая активность находится поверх стека, используя 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;
}