Android |在LogCat中打印活动任务堆栈

Android |在LogCat中打印活动任务堆栈,android,shell,android-activity,logcat,Android,Shell,Android Activity,Logcat,我想在LogCat上打印我的Android应用程序启动的所有任务以及其中的活动名称。SDK中是否有API可以为我提供此信息 p.s.我不能也不想使用adb shell命令,因为我想在LogCat中打印日志 注意:我已经搜索了很多次,找到的都是我无法使用的adb shell命令。回答时请记住这一点 更新: 下面是我想要的两个场景示例: 应用程序从活动A开始,我完成它并开始活动B。然后我 按下活动B上的按钮,启动活动C。现在是我的默认设置 任务希望C->B即,当我按下后退键时,我将看到活动 B按下“

我想在LogCat上打印我的Android应用程序启动的所有任务以及其中的活动名称。SDK中是否有API可以为我提供此信息

p.s.我不能也不想使用adb shell命令,因为我想在LogCat中打印日志

注意:我已经搜索了很多次,找到的都是我无法使用的adb shell命令。回答时请记住这一点

更新:

下面是我想要的两个场景示例:

  • 应用程序从活动A开始,我完成它并开始活动B。然后我 按下活动B上的按钮,启动活动C。现在是我的默认设置 任务希望
    C->B
    即,当我按下后退键时,我将看到活动 B按下“后退”按钮,应用程序将完成,发射器将启动 显示
  • 我连续打开活动A、B和C,然后启动 带有意图标志的活动X
    intent.FLAG\u活动\u新任务|
    意图。标记活动清除任务
    ,然后打开活动Y&Z 当前任务现在看起来像
    Z->Y->X
  • 所以,我想在logcat中打印这些:

  • 案例1中的
    C->B
  • 案例2中的
    Z->Y->X
  • 通常,应该使用Log.v()、Log.d()、Log.i()、Log.w()和Log.e()方法来编写日志。然后可以在logcat中查看日志

    更新 因为您想要跟踪活动,并且您知道活动周期是如何工作的。解决方案如下:

    @Override
    public void onPause(Bundle bundle){
        Log.v(TAG,"  activity A paused"); // or whatever 
    }
    
    Intent i = new Intent(ThisActivity.class,AnotherActivity.class);
    Log.v(TAG,"A->b");
    // Log.v(TAG,"Z -> Y -> X"); or what ever message you want to print
    startActivity(i);
    
    另一种解决方案是在
    startActivity
    大概是这样的:

    @Override
    public void onPause(Bundle bundle){
        Log.v(TAG,"  activity A paused"); // or whatever 
    }
    
    Intent i = new Intent(ThisActivity.class,AnotherActivity.class);
    Log.v(TAG,"A->b");
    // Log.v(TAG,"Z -> Y -> X"); or what ever message you want to print
    startActivity(i);
    
    第三种解决方案是,如果您不确定哪些活动将启动哪些意图,请提供一些信息

    在活动A中,在开始意图之前执行以下操作:

    intent.putExtra("UActivity", "From A");
    
    在活动B中,在创建时执行此操作:

    String from = getIntent().getStringExtra("UActivity");
    if("From A".equals(from){
        Log.v(TAG,"A->B");
    }else if("From C".equals(from){
        Log.v(TAG,"C->B");
    }// etc else if
    

    因此,只需跟进活动并以正确的方法打印正确的日志消息,就可以了。

    您似乎对记录应用程序的生命周期感兴趣(用于组件活动、片段、应用程序、服务、广播接收器等)。您可以通过创建一个超级类来实现这一点,并在其生命周期方法中将其扩展为打印日志,这样您就不必每次都打印它。您需要创建一个超级活动、超级片段等

    例如,每次应用程序由操作系统初始化时(由启动器、由BroadcastReceiver)都会记录以下内容

    你可能想看看这个

    到目前为止,我尝试在SDK中使用API做的事情还不可能开箱即用。更多信息可在此链接中找到:

    我的解决方案:

    我不得不在我的应用程序的基类中添加登录,用任务ID打印活动的名称来调试我面临的问题。下面是我的基本活动类的代码:

    public abstract class BaseAppActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.i("TESTING", "CREATED: " + getClass().getSimpleName() + " -- TASK ID: " + getTaskId());
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.i("TESTING", "DESTROYED: " + getClass().getSimpleName() + " -- TASK ID: " + getTaskId());
        }
    }
    

    您可以在Android Studio中生成活动状态报告。它为您提供当前(正在运行)的活动的状态和活动路线

    Android Monitor
    中找到
    System Information
    选项卡

    然后,
    活动管理器状态

    然后,它将生成一堆活动。查找活动(所有上限)


    希望它能有所帮助,尽管它不是日志方法。

    随着时间的推移,一些人可能已经转向(Kotlin和)一种“具有多个片段的单个活动”模式。我们可以记录哪些“倒退”:

    fun FragmentManager.printBackStack() {
            Log.d("TAG", "BackStackEntryCount = $backStackEntryCount")
            for (i in 0 until backStackEntryCount) {
                Log.d("TAG", "    #$i is ${getBackStackEntryAt(i)}")
            }
    }
    
    从活动中调用此函数的方式如下所示:

    supportFragmentManager.printPackStack()
    
    请记住,片段事务是异步工作的。 因此,以下代码将产生意外的结果:

    addSomeFragmentToBackStack("MyFragmentTag")
    printBackStack()
    // result doesn't include "MyFragmentTag"
    
    相反,您需要执行打印延迟:

    addSomeFragmentToBackStack("MyFragmentTag")
    Handler().postDelayed(
        { printBackStack() },
        500 // ms delay
    )
    

    此解决方案肯定不是完美的,但可以进行调试(例如,由于
    处理程序的原因,在循环中调用时会产生意外的结果)

    您尝试过吗?导入android.util.Log;Log.v(“hi”、“hi”);我知道如何记录,我要问的是,当我进行了多个活动并希望查看堆栈中当前的所有活动时,如何打印整个活动堆栈。为什么要这样做?我知道如何记录,我要问的是,当我已完成多个活动并希望查看堆栈中当前的所有活动时,如何打印整个活动堆栈。您所说的活动堆栈是什么意思?你是说什么时候活动不再活跃了?我只是用一个场景和一个我想要的例子更新了我的问题。那不是我真正想要的。我刚刚用一个场景和一个我想要的例子更新了我的问题。是的,这是一个很好的例子。我只想要logs解决方案,否则这和shell dumpsys解决方案是最好的。无论如何谢谢你!此功能来自AS 3:(