使用adb命令行查看当前Fragment情况

本文介绍如何使用adb命令查看Android应用中的Fragment状态,包括Fragment的数量、层级关系及BackStack情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


为了更好的了解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的理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子林Android

感谢老板,老板大气!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值