Activity / Fragment 栈视图查看

一、接锅

在 Android 开发中,经常会接手完全陌生的项目和代码。接手后有一个很大的问题是由于对项目和代码不熟悉,不能快速找到和 UI 上对应的的 Activity 和 Fragment 类,我们俗称 “接锅”。鉴于多次接锅项目,被这个问题多次困扰,决定写个小工具来解决这个问题。

二、思路

鉴于是接手项目,所以不能对原项目做太多改动。思考几种方案后,采用如下方案:

1、采用 Application 监听 ActivityLifecycleCallbacks 来监听 Activity 的生命周期,并加入栈。
2、使用通知栏,避免对当前UI的改动。在通知栏里生成通知,点击通知后弹窗显示当前栈的 Actitivy 列表。

三、实现

1、监听 Activity 的生命周期

public class DebugStackHelper {
    // Activity 栈
    private static Stack<Activity> stack = new Stack<>();

    public static void init(Application application, boolean debug) {
        application.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
                stack.add(activity);
            }
            @Override
            public void onActivityDestroyed(@NonNull Activity activity) {
                stack.remove(activity);
            }
        });
    }
}
复制代码

2、生成通知栏
生成通知栏比较常规,点击通知栏后,获取当前栈中的最后个一个 Acitvity,并在这个 Activity 中弹窗显示 stack 中内容

    // 显示弹窗
    private static void show() {
        Activity activity = stack.lastElement();
        Dialog dialog = new Dialog(activity);
        View view = activity.getLayoutInflater().inflate(R.layout.layout_debug_stack, null);
        TextView tvStack = view.findViewById(R.id.tv_stack);
        addView(tvStack);
        dialog.setContentView(view, new ViewGroup.LayoutParams(w, h));
        dialog.show();
    }
复制代码
弹窗中显示 stack 的列表

遍历 stack ,取得其中 Acitvity 的 name ,和 Activity 中 Fragment 的对应的名称(只遍历了第二层的Fragmnet,更深入的层级没做处理)

    private static void addView(TextView tvStack) {
        StringBuilder sb = new StringBuilder();
        for (int i = stack.size() - 1; i >= 0; i--) {
            Activity activity = stack.get(i);
            sb.append("\n");
            sb.append("◉  ");
            sb.append(activity.getClass().getSimpleName());
            if (activity instanceof FragmentActivity) {
                FragmentManager manager = ((FragmentActivity) activity).getSupportFragmentManager();
                List<Fragment> fragments = manager.getFragments();
                for (int i1 = 0; i1 < fragments.size(); i1++) {
                    Fragment fm = fragments.get(i1);
                    String simpleName = fm.getClass().getSimpleName();
                    if (!"SupportRequestManagerFragment".equals(simpleName)) {
                        sb.append("\n");
                        sb.append("     *  ");
                        sb.append(simpleName);
                        List<Fragment> fragmentListChild = fm.getChildFragmentManager().getFragments();
                        if (fragmentListChild.size() != 0) {
                            for (int j = 0; j < fragmentListChild.size(); j++) {
                                Fragment fmChild = fragmentListChild.get(j);
                                String nameChild = fmChild.getClass().getSimpleName();
                                if (!"SupportRequestManagerFragment".equals(nameChild)) {
                                    sb.append("\n");
                                    sb.append("          *  ");
                                    sb.append(nameChild);
                                }
                            }
                        }
                    }
                }
            }
            sb.append("\n");
        }
        tvStack.setText(sb);
    }
复制代码

四、效果

WX20210527-115952@2x.png

五、源码

代码已封装成工具类上传到了 github

DebugStackHelper

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享