首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >虚拟窗口窗口输出

虚拟窗口窗口输出
EN

Stack Overflow用户
提问于 2017-05-30 16:03:20
回答 1查看 588关注 0票数 2

我正在尝试列出Android设备上显示的所有UI元素。我通过在adb shell中运行"dumpsys window windows | grep "Window #来做到这一点,这给了我一个从窗口n到窗口0的窗口列表。

我想知道输出顺序是如何确定的。窗口n在堆栈的顶部,窗口0在堆栈的底部吗?另外,这些字段的含义是什么?例如,第一行如下所示

代码语言:javascript
复制
Window #64 Window{793212d u0 NavigationBar}:

值793212d和u0表示什么?

EN

回答 1

Stack Overflow用户

发布于 2020-07-02 02:55:24

关于输出顺序:

  • 窗口按z顺序从上到下遍历,因此最上面的窗口最先出现。

关于字段:

通过System#identityHashCode.获取的

  • 793212d是窗口的(唯一) ID

  • u0是指窗口所属的用户ID。用户id与Unix UID不同,它是一个更高级的概念。Android将多个Unix UID分组为一个用户ID,即前100.000个Unix UID属于用户ID 0,依此类推(reference)。为了确定窗口的用户ID,安卓将查找窗口的Unix UID (每个应用程序都有自己的Unix UID),然后将Unix UID映射到用户ID。

  • NavigationBar是窗口的标题。

技术细节:在调用dumpsys window windows时,会在WindowManagerService (link)触发一个转储请求。该类有一个RootWindowContainer类型的成员mRoot,转储请求将被转发到该成员(link)。相关代码为:

代码语言:javascript
复制
        forAllWindows((w) -> {
            if (windows == null || windows.contains(w)) {
                pw.println("  Window #" + index[0] + " " + w + ":");
                w.dump(pw, "    ", dumpAll || windows != null);
                index[0] = index[0] + 1;
            }
        }, true /* traverseTopToBottom */);

w的类型为WindowState,它覆盖toString以获得您在dumpsys输出(link)中看到的String表示。相关代码为:

代码语言:javascript
复制
mStringNameCache = "Window{" + Integer.toHexString(System.identityHashCode(this))
    + " u" + UserHandle.getUserId(mOwnerUid)
    + " " + mLastTitle + (mAnimatingExit ? " EXITING}" : "}");

RootWindowContainer#forAllWindows方法遍历mChildren列表,该列表被指定为按z顺序(linklink):

代码语言:javascript
复制
    // List of children for this window container. List is in z-order as the children appear on
    // screen with the top-most window container at the tail of the list.
    protected final WindowList<E> mChildren = new WindowList<E>();
代码语言:javascript
复制
    boolean forAllWindows(ToBooleanFunction<WindowState> callback, boolean traverseTopToBottom) {
        if (traverseTopToBottom) {
            for (int i = mChildren.size() - 1; i >= 0; --i) {
                if (mChildren.get(i).forAllWindows(callback, traverseTopToBottom)) {
                    return true;
                }
            }
        ...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44256755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档