【问题标题】:How to find out which Activity is on top of the stack using Robotium/Android SDK?如何使用 Robotium/Android SDK 找出堆栈顶部的 Activity?
【发布时间】:2015-05-22 15:33:01
【问题描述】:

我有一个针对 Android 应用程序的 Robotium 测试,它扩展了 ActivityInstrumentationTestCase2。测试循环运行,随机点击活动视图。我想在每次迭代开始时验证当前关注的是哪个 Activity。这种行为对我来说很重要,因为其中一个按钮能够启动另一个 Activity,从而无法在循环中进行进一步的操作,因为它们指的是被测 Activity(这是我停止 Robotium 测试的时候)。

我想要一个适用于任何活动的通用解决方案,而无需更改 onDestroy() 方法。此解决方案也必须适用于按下 Home 按钮时。

【问题讨论】:

  • that能帮到你吗?
  • @Ircover,是的。我会说我的问题是重复的问题。你应该发表你的评论作为我接受的答案吗?我不确定如何在此处继续,但您保存了我的 lfie =)。

标签: android android-activity robotium android-sdk-tools


【解决方案1】:

你应该可以使用

solo.getCurrentActivity()

为此,这对您不起作用吗?如果没有生病,请在构建独奏对象时预先解决潜在问题并询问您的代码以及您使用的是哪个版本的 roborium。

【讨论】:

  • 你好,保罗。非常感谢您的帮助。不幸的是,此方法返回的是我的 ActivityInstrumentationTestCase2 应该测试的 Activity,而不是当前焦点所在的 Activity。我可以通过以下方式解决我的问题:stackoverflow.com/questions/18115493/…
  • 曾经有一个已知问题,如果您以某种方式构建单独活动,它会告诉您错误,如果您发布,那么我可以告诉您是否是这样。
  • 你说的是 Solo 构造函数 Solo(getInstrumentation(), activity) 和 Solo(getInstrumentation()) 的使用吗?玩那些对我不起作用。
  • 我是的,第二个版本更有可能工作,你的活动使用标签主机还是什么?我了解您有一个解决方法,但似乎是对 robotsium 感到困惑。
【解决方案2】:

我们发现,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());

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 2010-10-19
      • 2013-07-03
      • 2013-06-19
      相关资源
      最近更新 更多