如何通过UIAutomator2获取activity名称?

How to obtain activity name through UIAutomator2?

我正在为 Android 应用构建一些通用测试工具并尝试获取 activity 名称(例如 com.android.calculator/.Calculatorcom.android.calculator 可以通过 UiDevice.currentPackageName,痛苦来自第二部分)在测试期间。也就是说,我的工具可能会测试与我的不在同一个包中的其他应用程序。例如,测试股票计算器应用程序。

以下是我的尝试列表:

  1. UiDevice.currentActivityName 已弃用,它没有提供准确的信息
  2. InstrumentationRegistry.getInstrumentation().targetContext.getSystemService<ActivityManager>(),然后访问 ActivityManager.getRunningTasks(1).get(0).topActivity,它总是 returns 相同的值,即使视图已切换(这也已弃用)
  3. 与 2 类似,我尝试了 ActivityManager.getAppTasks().get(0).getTaskInfo().topActivity,但这一直给我 null
  4. ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(RESUMED)。这给了我一个空的集合
  5. Application.ActivityLifecycleCallbacks。我在应用程序中注册了它,但没有收到回调。
  6. (有点效果,但不完美)使用 adb dumpsys activity 然后在那里找到它。但是这样我必须等待任意时间直到视图更新,否则结果仍然不准确

所以我现在正处于死胡同中,感谢在此问题上的任何帮助。我尽量避免反射,因为据我所知它不适用于较新的设备。所以任何线索将不胜感激。

由于没有发布答案,我想分享一下我目前的策略,它并不完美,但有点帮助。

所以首先,由于 UiDevice.getActivityName 已弃用,我只能通过 adb 获取 activity 名称。具体来说,我对低于 28 的 API 使用 adb shell dumpsys activity top,否则使用 adb shell dumpsys activity activities

然后我订阅了 AccessibilityEventListener 回调。具体来说,每当我收到类型为 AccessibilityEvent.TYPE_WINDOWS_CHANGED 的回调时,我都会 运行 adb 命令。您可以使用此方法设置 AccessibilityEventListener:setOnAccessibilityEventListener