使用adb命令行查看当前Fragment情况_android adb 查看fragment层级-程序员宅基地

技术标签: Android Fragment的基本用法  android  Fragment  adb  


为了更好的了解Fragment在app中的存在状态(比如说,当前添加了几个Fragment、他们的层级关系如何、BackStack里有没有Fragment等),我们需要能够查看当前Fragment的情况。本文将介绍 如何通过adb命令行查看当前Fragment

1. 查看当前Fragment的adb命令

打开控制终端。就是那个黑窗口,window下可按win+R调出执行窗口,然后输入cmd,回车,就能弹出。mac电脑直接搜索terminal或者找到终端即可。
输入以下命令:

adb shell dumpsys activity fragment

2. 案例演示

下面用一个小案例来演示查看Fragment的过程。

2.1 案例代码

首先,准备Fragment: FragmentA.java

// 导包省略。。。
public class FragmentA extends Fragment {
    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
    
        return inflater.inflate(R.layout.fragment_a, container, false);
    }
}

然后,准备Activity: TestActivity.java

// 导包省略。。。
public class TestActivity extends AppCompatActivity {
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        
    }
    public void addFragment(View view) {
    
        getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.fragment_container, FragmentA.class, null)
                .commit();
    }

    public void addFragmentAndBackStack(View view) {
    
        getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.fragment_container, FragmentA.class, null)
                .addToBackStack("myBackStack")
                .setReorderingAllowed(true)
                .commit();
    }
}

布局文件:activity_test.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.fragment.app.FragmentContainerView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/fragment_container"
        />
    
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text="添加Fragment"
        android:onClick="addFragment"
        android:textAllCaps="false"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text="添加Fragment并加入BackStack"
        android:onClick="addFragmentAndBackStack"
        android:textAllCaps="false"
        />
</LinearLayout>

2.2 手机连接电脑,运行代码到手机

这里的连接指的是能够一键运行代码,安装到设备上进行调试开发的那种状态。需要开启开发者模式,打开USB调试,相信稍微有过Android开发经验的小伙伴都知道,不再赘述。

2.3 打开控制终端

打开控制终端。就是那个黑窗口,window下可按win+R调出执行窗口,然后输入cmd,回车,就能弹出。mac电脑直接搜索terminal或者找到终端即可。

2.4 输入adb命令

也就是上文提到的,输入以下命令:

adb shell dumpsys activity fragment

2.5 查看输出结果

输出内容很多,直接拉到最后,看关键词:“Local FragmentActivity”

 Local FragmentActivity cd1c582 State:
      mCreated=true mResumed=true mStopped=false    Back Stack Index: 0
    FragmentManager misc state:
      mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@d5cbaa8
      mContainer=androidx.fragment.app.FragmentActivity$HostCallbacks@d5cbaa8
      mCurState=7 mStateSaved=false mStopped=false mDestroyed=false

这里可以看到Local FragmentActivity里还没有Fragment。因为我们还没有点击添加Fragment按钮。

2.6 添加Fragment,再命令查看

点击“添加Fragment”按钮, 然后再次执行上面命令adb shell dumpsys activity fragment,结果如下:

 Local FragmentActivity 480780e State:
      mCreated=true mResumed=true mStopped=false    Active Fragments:
    FragmentA{
    70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
        mFragmentId=#7f0800d3 mContainerId=#7f0800d3 mTag=null
        mState=7 mWho=e04b5bf9-9719-4629-a914-bf9c0ef11b54 mBackStackNesting=0
        mAdded=true mRemoving=false mFromLayout=false mInLayout=false
        mHidden=false mDetached=false mMenuVisible=true mHasMenu=false
        mRetainInstance=false mUserVisibleHint=true
        mFragmentManager=FragmentManager{
    90a3819 in HostCallbacks{
    2c7b0de}}}
        mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
        mPopDirection=false
        mContainer=androidx.fragment.app.FragmentContainerView{
    9cce02e V.E...... ........ 0,52-1080,313 #7f0800d3 app:id/fragment_container1}
        mView=android.widget.LinearLayout{
    a1da7cf V.E...... ........ 0,0-1080,261}
        Child FragmentManager{
    9e22bf in FragmentA{
    70fbb60}}}:
          Back Stack Index: 0
          FragmentManager misc state:
            mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
            mContainer=androidx.fragment.app.Fragment$4@a52d8c
            mParent=FragmentA{
    70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
            mCurState=7 mStateSaved=false mStopped=false mDestroyed=false
    Added Fragments:
      #0: FragmentA{70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
    Back Stack Index: 0
    FragmentManager misc state:
      mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
      mContainer=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
      mCurState=7 mStateSaved=false mStopped=false mDestroyed=false

从上面可以看到,Local FragmentActivity的状态已经存在活跃的Fragment了:“Active Fragments”。
此时,活跃的Fragment就是我们添加的FragmentA,从输出信息中可以看出它的id、状态等信息。

关键信息解释:

  • Active Fragments:当前活跃的Fragment
  • Added Fragments: 当前被添加到容器View的Fragment
  • Back Stack: Fragment后台栈的情况

让我们再点击一次“添加Fragment”,看看添加两个Fragment后的情况

输出结果:

 Local FragmentActivity 480780e State:
      mCreated=true mResumed=true mStopped=false    Active Fragments:
    FragmentA{
    85b0d8} (d789ff6b-8df2-499b-a614-1e13d1496afa id=0x7f0800d3)
        mFragmentId=#7f0800d3 mContainerId=#7f0800d3 mTag=null
        mState=7 mWho=d789ff6b-8df2-499b-a614-1e13d1496afa mBackStackNesting=0
        mAdded=true mRemoving=false mFromLayout=false mInLayout=false
        mHidden=false mDetached=false mMenuVisible=true mHasMenu=false
        mRetainInstance=false mUserVisibleHint=true
        mFragmentManager=FragmentManager{
    90a3819 in HostCallbacks{
    2c7b0de}}}
        mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
        mPopDirection=false
        mContainer=androidx.fragment.app.FragmentContainerView{
    9cce02e V.E...... ........ 0,52-1080,313 #7f0800d3 app:id/fragment_container1}
        mView=android.widget.LinearLayout{
    14dc9b5 V.E...... ........ 0,0-1080,261}
        Child FragmentManager{
    3de4c31 in FragmentA{
    85b0d8}}}:
          Back Stack Index: 0
          FragmentManager misc state:
            mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
            mContainer=androidx.fragment.app.Fragment$4@fc38f16
            mParent=FragmentA{
    85b0d8} (d789ff6b-8df2-499b-a614-1e13d1496afa id=0x7f0800d3)
            mCurState=7 mStateSaved=false mStopped=false mDestroyed=false
    FragmentA{
    70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
        mFragmentId=#7f0800d3 mContainerId=#7f0800d3 mTag=null
        mState=7 mWho=e04b5bf9-9719-4629-a914-bf9c0ef11b54 mBackStackNesting=0
        mAdded=true mRemoving=false mFromLayout=false mInLayout=false
        mHidden=false mDetached=false mMenuVisible=true mHasMenu=false
        mRetainInstance=false mUserVisibleHint=true
        mFragmentManager=FragmentManager{
    90a3819 in HostCallbacks{
    2c7b0de}}}
        mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
        mPopDirection=false
        mContainer=androidx.fragment.app.FragmentContainerView{
    9cce02e V.E...... ........ 0,52-1080,313 #7f0800d3 app:id/fragment_container1}
        mView=android.widget.LinearLayout{
    a1da7cf V.E...... ........ 0,0-1080,261}
        Child FragmentManager{
    9e22bf in FragmentA{
    70fbb60}}}:
          Back Stack Index: 0
          FragmentManager misc state:
            mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
            mContainer=androidx.fragment.app.Fragment$4@a52d8c
            mParent=FragmentA{
    70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
            mCurState=7 mStateSaved=false mStopped=false mDestroyed=false
    Added Fragments:
      #0: FragmentA{70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
      #1: FragmentA{85b0d8} (d789ff6b-8df2-499b-a614-1e13d1496afa id=0x7f0800d3)
    Back Stack Index: 0
    FragmentManager misc state:
      mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
      mContainer=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
      mCurState=7 mStateSaved=false mStopped=false mDestroyed=false

可以看出,Added Fragments显示出当前有两个FragmentA,#0 代表第一次添加的Fragment,#1代表第二次添加的。

2.7 添加Fragment,并添加到BackStack,再命令查看

点击“添加Fragment并加入BackStack”按钮,再次输入命令 adb shell dumpsys activity fragment,结果如下:

Local FragmentActivity 480780e State:
      mCreated=true mResumed=true mStopped=false    Active Fragments:
    FragmentA{
    85b0d8} (d789ff6b-8df2-499b-a614-1e13d1496afa id=0x7f0800d3)
        mFragmentId=#7f0800d3 mContainerId=#7f0800d3 mTag=null
        mState=7 mWho=d789ff6b-8df2-499b-a614-1e13d1496afa mBackStackNesting=0
        mAdded=true mRemoving=false mFromLayout=false mInLayout=false
        mHidden=false mDetached=false mMenuVisible=true mHasMenu=false
        mRetainInstance=false mUserVisibleHint=true
        mFragmentManager=FragmentManager{
    90a3819 in HostCallbacks{
    2c7b0de}}}
        mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
        mPopDirection=false
        mContainer=androidx.fragment.app.FragmentContainerView{
    9cce02e V.E...... ........ 0,52-1080,313 #7f0800d3 app:id/fragment_container1}
        mView=android.widget.LinearLayout{
    14dc9b5 V.E...... ........ 0,0-1080,261}
        Child FragmentManager{
    3de4c31 in FragmentA{
    85b0d8}}}:
          Back Stack Index: 0
          FragmentManager misc state:
            mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
            mContainer=androidx.fragment.app.Fragment$4@fc38f16
            mParent=FragmentA{
    85b0d8} (d789ff6b-8df2-499b-a614-1e13d1496afa id=0x7f0800d3)
            mCurState=7 mStateSaved=false mStopped=false mDestroyed=false
    FragmentA{
    70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
        mFragmentId=#7f0800d3 mContainerId=#7f0800d3 mTag=null
        mState=7 mWho=e04b5bf9-9719-4629-a914-bf9c0ef11b54 mBackStackNesting=0
        mAdded=true mRemoving=false mFromLayout=false mInLayout=false
        mHidden=false mDetached=false mMenuVisible=true mHasMenu=false
        mRetainInstance=false mUserVisibleHint=true
        mFragmentManager=FragmentManager{
    90a3819 in HostCallbacks{
    2c7b0de}}}
        mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
        mPopDirection=false
        mContainer=androidx.fragment.app.FragmentContainerView{
    9cce02e V.E...... ........ 0,52-1080,313 #7f0800d3 app:id/fragment_container1}
        mView=android.widget.LinearLayout{
    a1da7cf V.E...... ........ 0,0-1080,261}
        Child FragmentManager{
    9e22bf in FragmentA{
    70fbb60}}}:
          Back Stack Index: 0
          FragmentManager misc state:
            mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
            mContainer=androidx.fragment.app.Fragment$4@a52d8c
            mParent=FragmentA{
    70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
            mCurState=7 mStateSaved=false mStopped=false mDestroyed=false
    FragmentA{
    80cf313} (48e80f6d-d9b2-4ba2-a1a0-203127bab718 id=0x7f0800d3)
        mFragmentId=#7f0800d3 mContainerId=#7f0800d3 mTag=null
        mState=7 mWho=48e80f6d-d9b2-4ba2-a1a0-203127bab718 mBackStackNesting=1
        mAdded=true mRemoving=false mFromLayout=false mInLayout=false
        mHidden=false mDetached=false mMenuVisible=true mHasMenu=false
        mRetainInstance=false mUserVisibleHint=true
        mFragmentManager=FragmentManager{
    90a3819 in HostCallbacks{
    2c7b0de}}}
        mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
        mPopDirection=false
        mContainer=androidx.fragment.app.FragmentContainerView{
    9cce02e V.E...... ........ 0,52-1080,313 #7f0800d3 app:id/fragment_container1}
        mView=android.widget.LinearLayout{
    7a812e4 V.E...... ........ 0,0-1080,261}
        Child FragmentManager{
    3457950 in FragmentA{
    80cf313}}}:
          Back Stack Index: 0
          FragmentManager misc state:
            mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
            mContainer=androidx.fragment.app.Fragment$4@36b3749
            mParent=FragmentA{
    80cf313} (48e80f6d-d9b2-4ba2-a1a0-203127bab718 id=0x7f0800d3)
            mCurState=7 mStateSaved=false mStopped=false mDestroyed=false
    Added Fragments:
      #0: FragmentA{70fbb60} (e04b5bf9-9719-4629-a914-bf9c0ef11b54 id=0x7f0800d3)
      #1: FragmentA{85b0d8} (d789ff6b-8df2-499b-a614-1e13d1496afa id=0x7f0800d3)
      #2: FragmentA{80cf313} (48e80f6d-d9b2-4ba2-a1a0-203127bab718 id=0x7f0800d3)
    Back Stack:
      #0: BackStackEntry{af4f84e #0 myBackStack}
        mName=myBackStack mIndex=0 mCommitted=true
        Operations:
          Op #0: ADD FragmentA{80cf313} (48e80f6d-d9b2-4ba2-a1a0-203127bab718 id=0x7f0800d3)
    Back Stack Index: 1
    FragmentManager misc state:
      mHost=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
      mContainer=androidx.fragment.app.FragmentActivity$HostCallbacks@2c7b0de
      mCurState=7 mStateSaved=false mStopped=false mDestroyed=false

可以看出,Added Framents处已经有三个添加记录了,正是对应了我们之前三次添加的操作,并且按照添加的顺序,先添加的序号小,后添加的序号大。
这次添加操作我们增加了addToBackStack("myBackStack"),将Fragment添加到容器View的同时,也添加到了BackStack。因此,注意到输出信息里Back Stack处也有了记录:

 Back Stack:
      #0: BackStackEntry{af4f84e #0 myBackStack}
        mName=myBackStack mIndex=0 mCommitted=true
        Operations:
          Op #0: ADD FragmentA{80cf313} (48e80f6d-d9b2-4ba2-a1a0-203127bab718 id=0x7f0800d3)
    Back Stack Index: 1

mName=myBackStack,对应了我们的addToBackStack("myBackStack")
Operations:里的#0: ADD FragmentA{80cf313},是添加到BackStack的Fragment记录。从 80cf313 可以看出和Added Fragments处的 #3 是同一个Fragment,也就是我们第三次添加的Fragment。这就证明了我们将Fragment添加到容器View的同时,也添加到了BackStack。

3. 总结

以上就是对adb命令查看Framgent的介绍,包括 adb命令 、 如何从大量输出结果里快速找到关键信息、如何从输出信息判断Fragment的状态。
本例只是用添加两三个Fragment作为简单演示,如果你想查看更加复杂的Fragment场景,可以结合上一篇文章Fragment的编辑-增删查替显示隐藏自己调用remove、replace等方法操作Fragment,然后用本文的方法查看Fragment状态,进一步加深对Fragment的理解。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fxjzzyo/article/details/122607681

智能推荐

jquery 加载显示loading图标_Vue实战:图片懒加载组件-程序员宅基地

文章浏览阅读257次。注意 : 文中 "加载区域" = 可视区域(父容器高度) * preload(用户使用时配置项中传入) = 可视区域(父容器高度) + 预加载区域 当访问页面时,如果一次性请求当前页面中的所有图片,会占用很大的资源。而图片懒加载所实现的功能,就是只加载用户加载区域的图片,而加载区域外的图片并不会进行资源请求,当页面滚动时会对当前加载区域的内容继续进行加载。其HTML加载过程如下: 已加载的图片为用..._jquery.alerts loading图标

Git团队开发流程_在git开发流程中,小组成员和小组长的开发流程是怎样的?-程序员宅基地

文章浏览阅读3.1k次,点赞3次,收藏8次。1.多人协助实现分为如下几个步骤:1.从裸服务器将版本库克隆至本地(git clone)2.本地常规操作克隆下来的版本库不允许在master分支上做修改,修改要切换到dev分支或者你自己新建的分支进行操作,切换分支操作git checkout 分支名、查看分支命令 git branch小组成员需要建立属于自己的分支,每个分支代表着开发不同的功能,一般线上每个版本maste..._在git开发流程中,小组成员和小组长的开发流程是怎样的?

小程序如何实现满屏播放视频效果?_小程序视频点击全屏怎么写-程序员宅基地

文章浏览阅读1.9k次。在小程序开发文档中,有个小程序页面配置,navigationStyle 有两个值,default默认样式custom自定义导航栏,只保留右上角胶囊按钮。可以参考文档具体说明https://developers.weixin.qq.com/miniprogram/dev/reference/configuration/page.html这个最好只在一级页面设置,如果当前是二级页面的话,设置满屏左上角就没有返回键了,这个要注意下。(完结)下面是我自己的小程序,不过我放在二级页面里面.._小程序视频点击全屏怎么写

CSS规范_媒体查询执行顺序-程序员宅基地

文章浏览阅读595次。CSS的代码规范_媒体查询执行顺序

超赞!《Java 编程思想》最新中文版开放下载-程序员宅基地

文章浏览阅读292次。随着 Java 8 的出现,这门语言在许多地方发生了翻天覆地的变化。在新的版本中,代码的运用和实现上与以往不尽相同。与几年前我们依赖印刷媒体相比,YouTube,博客和 StackOve..._java编程思想最新版下载

本科进了大厂拿高薪,为什么硕士和博士却要挤破头进高校?-程序员宅基地

文章浏览阅读731次,点赞2次,收藏4次。点击“开发者技术前线”,选择“星标????”让一部分开发者看到未来高赞回答一 作者:NYC-2009夫妻都是985的副教授。2019年度国家个人所得税的系统里面的税前是270k过一点(..._博士头衔在大厂重要么

随便推点

基于JSP+SSM+Springboot的毕业生信息招聘平台【毕业论文+源码】_基于ssm招聘网站论文-程序员宅基地

文章浏览阅读1.4k次。随着社会的快速发展,计算机的影响是全面且深入的。人们的生活水平不断提高,日常生活中毕业生对招聘平台方面的要求也在不断提高,需要招聘平台的人数更是不断增加,使得毕业生信息招聘平台的开发成为必需而且紧迫的事情。毕业生信息招聘平台主要是借助计算机,通过对毕业生信息招聘平台所需的信息管理,增加毕业生选择,同时也方便对广大招聘平台的及时查询、修改以及对毕业生信息的及时了解。毕业生信息招聘平台对毕业生带来了更多的便利, 该系统通过和数据库管理系统软件协作来满足毕业生的需求。_基于ssm招聘网站论文

像电影里黑客高手一样敲代码攻击入侵网站(模拟)_htt://hackcode.ishoulucom/blackmesa/-程序员宅基地

文章浏览阅读2.1w次,点赞6次,收藏16次。我们常常会在一些好莱坞电影大片里看到超级黑客高手,在电脑前轻松“黑”进别人的安全系统的场景。那纯熟自如地输入一大堆复杂的代码,不一下子就入侵/破解完成,其实这些网址就能帮你实现你的黑客演义梦http://hackcode.ishoulu.com/scp/http://hackcode.ishoulu.com/combine/http://hackcode.ishoulu.com/bla_htt://hackcode.ishoulucom/blackmesa/

华为最美小姐姐,被外派墨西哥后...-程序员宅基地

文章浏览阅读274次。点击“开发者技术前线”,选择“星标”让一部分开发者看到未来作者丨潘昱来源丨《华为人》、心声社区2018年,坐在UCLA大学教室里,我和华为进行了一场视频面试。去投行从事对冲基金业务,..._美元外派服务app

VBA 拷贝并粘贴内容_vba 输入框复制-程序员宅基地

文章浏览阅读5.5k次,点赞2次,收藏25次。由于有点学习得比较仓促,很多内容运用得不熟练,现在开始呢对部分问题试着自己解决一下,今天先来个简单的,后面慢慢加大难度。点击Sheet1里面的内容,自动显示Sheet2表格对应内容。sheet1功能:sheet2内容:解决思路:(1)用户点击Sheet1的B2到B6单元格时,触发SelectionChange事件,点击其他地方不触发;(2)根据sheet1点击的内容,筛选sheet2里面B列数据(3)把sheet2的数据复制到sheet1的显示区域。(4)把复._vba 输入框复制

经典嵌入式开发学习网站推荐_嵌入式学习的开发平台-程序员宅基地

文章浏览阅读1.9k次。1.EG3 关于嵌入式开发的站点,提供非常多关于嵌入式开发的资料。包括开发公司,技术文档,免费资源等等。版面包括busses & boards,embedded software,dsp,embedded systems,open source,rtos,embedded chi_嵌入式学习的开发平台

计算机中如何表示数字-04反码_为什么纯小数的反码不能表示-1-程序员宅基地

文章浏览阅读948次。反码的实质是一种特殊的补码,其特殊之处在于反码的模比补码的模小一个最低位上的1。反码的定义:ü 纯小数:0ü 纯整数:0根据反码的定义可得反码的求法:若x>=0,则使符号位为0,数值部分与x相同,即可得到x反;若x例4-1:已知x原码、x补码,求x反码。ü x原码=0.0101001 x原码>0,由定义反码为其自身,x反码=0.0_为什么纯小数的反码不能表示-1