出于调试目的,我希望能够记录返回堆栈中的活动,但我没有看到任何 API 可以做到这一点,也没有在搜索时看到它被提及。有办法吗?
将此代码放入 MainActivity 的 onCreate 中
getSupportFragmentManager().addOnBackStackChangedListener(
new FragmentManager.OnBackStackChangedListener() {
public void onBackStackChanged() {
for (int i = 0; i < getSupportFragmentManager().getBackStackEntryCount(); i++)
System.out.println(getSupportFragmentManager().getBackStackEntryAt(i).getName());
}
});
打印的名称是在调用 addToBackStack 时定义的:
...
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
...
ft.addToBackStack(name);
...
您可以在logcat中看到输出。
其实我也很纠结这个问题。不幸的是没有。让我们想想为什么?
Java 到达我们手中 :
1) 注释 - 使用 DI 的方式。(反射方式)就像ButterKnife
2) 登录后台的父类。
public class MainActivity extends LogActivity //for ex
3) 与
Thread.currentThread().getStackTrace()
但你应该检查你现在呆在哪里,你现在检查的线程和其他日常工作。
可以使用以下命令
adb shell dumpsys activity
它会打印很多东西,包括开头的返回堆栈:
Running activities (most recent first):
TaskRecord{45168b4 #2194 A=com.example.myapp U=0 StackId=22 sz=3}
Run #2: ActivityRecord{a05a1af u0 com.example.myapp/com.example.myapp.activity.MyActivity t2194}
Run #1: ActivityRecord{5c017cd u0 com.example.myapp/com.example.myapp.activity.MySecondActivity t2194}
Run #0: ActivityRecord{6fe38b2 u0 com.example.myapp/com.example.myapp.activity.MyThirdActivity t2194}
另一个解决方案是首先输入
adb shell
并按 Enter 键,然后输入 dumpsys activity | grep -i run
。这只会显示返回堆栈,不会显示其他内容,但需要两个命令。
使用 Kotlin,您可以通过以下方式实现:
fragmentManager.addOnBackStackChangedListener {
for (i in 0 until fragmentManager.backStackEntryCount) Log.d("Backstack",
fragmentManager.getBackStackEntryAt(i).name ?: "No name entry"
)
}
请记住,无论fragmentManager 位于何处,您都必须使用此代码片段。它通常位于 MainActivity 上,但也可以是拥有显示在 FragmentContainerView 上的其他片段的 Fragment。
在这种情况下,您需要在片段的 OnCreate 中使用
childFragmentManager
。像这样:
childFragmentManager.addOnBackStackChangedListener {
for (i in 0 until childFragmentManager.backStackEntryCount) Log.d("Backstack",
childFragmentManager.getBackStackEntryAt(i).name ?: "No name entry"
)
}
这也可以与子片段中的
parentFragmentManager
一起使用。
使用 Log.d 可以更轻松地在 Logcat 中识别这些调试消息,并且可以通过在 Android Studio 上的过滤器文本框中使用
tag=:Backstack
(或使用的任何标签)进行过滤,以避免在记录的所有其他内容中遗漏某些内容。