代码之家  ›  专栏  ›  技术社区  ›  MiaN KhaLiD

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

  •  3
  • MiaN KhaLiD  · 技术社区  · 7 年前

    .

    注: 我搜索了很多,发现的都是我无法使用的adb shell命令。回答时请记住这一点。

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

    1. 应用程序从活动A开始,我完成它并开始活动B。然后我 任务想要 C -> B i、 e.当我按下后退键时,我将看到活动 显示。
    2. Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK 然后打开活动Y&Z、 The Z -> Y -> X .

    1. C->B
    2. Z->Y->十、 在案例2中
    5 回复  |  直到 7 年前
        1
  •  4
  •   MiaN KhaLiD    7 年前

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

    How to get a list of my app's tasks and the stack of their Activities?

    我不得不在我的应用程序的基类中添加登录,用它的任务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());
        }
    }
    
        2
  •  2
  •   Niraj Niroula    7 年前

    查找 System Information Android Monitor .

    enter image description here

    Activity Manager State .

    enter image description here

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

    enter image description here 希望它能有所帮助,尽管它不是log方法。

        3
  •  1
  •   m.reiter    3 年前

    随着时间的推移,一些人可能已经转向(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
    )
    

    这个解决方案肯定不是完美的,但可以进行调试(例如,由于 Handler )

        4
  •  0
  •   Gufran Khurshid    7 年前

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

    例如,下面将记录每次应用程序由操作系统初始化时的日志(由启动器、广播接收器)

       public class LifeCycleApp extends Application {
    
            String TAG = "GUFRAN " + LifeCycleApp.class.getName();
    
            public LifeCycleApp() {
              Log.d(TAG, "LifeCycleApp: constructor");
            }
    
            @Override
            public void onCreate() {
              super.onCreate();
              Log.d(TAG, "onCreate: ");
            }
    
            // Called by the system when the device configuration changes while your component is running.
            // Overriding this method is totally optional!
            @Override
            public void onConfigurationChanged(Configuration newConfig) {
              super.onConfigurationChanged(newConfig);
            }
    
            // This is called when the overall system is running low on memory,
            // and would like actively running processes to tighten their belts.
            // Overriding this method is totally optional!
            //Called when the overall system is running low on memory, and actively running processes should trim their memory usage
            @Override
            public void onLowMemory() {
              super.onLowMemory();
            }
    
            @Override
            protected void finalize() throws Throwable {
              super.finalize();
              Log.d(TAG, "finalize: ");
            }
        }
    

    https://github.com/guffyWave/LifeCycle

        5
  •  0
  •   Yamen Nassif    7 年前

    根据 Android Developers

    通常,您应该使用日志。v(),日志。d(),日志。i(),日志。w(),并记录。e()方法来写入日志。然后可以在logcat中查看日志。

    import android.util.Log;
    public class MyActivity extends Activity{
        private static final String TAG = "MyActivity";
        @Override
        public void onCreate(Bundle bundle){
            Log.v(TAG, "on create");
        }
    }
    

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

    @Override
    public void onPause(Bundle bundle){
        Log.v(TAG,"  activity A paused"); // or whatever 
    }
    

    另一种解决方案是在 startActivity 类似这样:

    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中,在 onCreate :

    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
    

    lifecycle