一、接锅
在 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);
}
复制代码
四、效果
五、源码
代码已封装成工具类上传到了 github
DebugStackHelper
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END