如何找出我的活动完成的原因?

时间:2015-08-23 21:57:07

标签: java android

上下文

我是开发一个非常庞大且非常复杂的项目的开发人员之一。项目的一半用JavaScript编写,另一半用Java编写,而且大约30%的基础产品是预编译的,所以我们无法完全查看内部或通过它进行调试。

问题

当我们的应用程序返回到前台时,活动堆栈将被销毁,并且只显示根活动。我无法追查原因。

到目前为止我尝试过的事情

  1. 在我发现的每个finish()调用上设置一个断点,没有一个被称为
  2. 将android:excludeFromRecents =“false”设置为每个活动
  3. 从AndroidManifest中删除android:launchMode =“singleTop”
  4. 我在onDestroy()方法中为第二个活动设置了一个断点,我可以看到“isFinishing()”方法被执行为“True”,所以我知道它不是破坏活动的操作系统,但是没有信息(据我所知)会指出我哪个类/属性/方法导致调用该方法。我在堆栈跟踪中看不到任何有用的东西。我在日志中看不到任何有用的东西。
  5. 我也尝试过询问我公司周围的人,但到目前为止还没有回答。
  6. 问题

    是否有任何策略可以找到导致某个生命周期方法被调用的原因?

    更新1

    感谢您在评论部分提出的重大问题和帮助。以下是更好地解释发生情况的序列图。

    1. 推出应用
    2. 活动A调用onCreate()
    3. 活动A调用onResume()
    4. 我启动了活动B
    5. 活动A调用onUserLeaveHint()
    6. 活动A调用onPause()
    7. 活动B调用onCreate()
    8. 活动B调用onResume()
    9. 活动A调用onStop()
    10. 我将应用程序置于后台
    11. 活动B调用onUserLeaveHint()
    12. 活动B调用onStop()
    13. 我将应用程序返回到前台
    14. 活动B调用onDestroy()
    15. 活动A调用onRestart()
    16. 活动A调用onResume()
    17. 更新2

      以下是内存使用情况的屏幕截图

      当我启动应用程序时 enter image description here

      当我启动活动B

      enter image description here

      当我将申请发送到后台时

      enter image description here

      当我回到前台时

      enter image description here

2 个答案:

答案 0 :(得分:2)

找到了解决方案!

原来我的root活动设置了以下属性:

android:clearTaskOnLaunch="true"

以下是documentation

的引用
  

机器人:clearTaskOnLaunch   是否所有活动都将是   除了根活动之外,每次都从任务中删除   从主屏幕重新启动 - 如果任务总是如此,则为“true”   剥离到它的根活动,如果不是,则“假”。默认   价值是“假”。此属性仅对活动有意义   开始一项新任务(根活动);所有其他人都忽略了它   任务中的活动。当值为“true”时,每次用户   再次启动任务,无论如何,它们都会被带到它的根活动   他们最后在任务中做了什么,而不管是否   他们使用Back或Home按钮离开它。当值是   “假”,在某些情况下可以清除任务中的任务(见   alwaysRetainTaskState属性),但并非总是如此。

     

例如,假设有人从家中启动活动P.   屏幕,从那里去活动Q.用户接下来按Home,   然后返回活动P.通常,用户会看到活动   问:因为这是他们上次在P的任务中做的事情。但是,如果P   将此标志设置为“true”,将所有活动设置在其上(Q在此   当用户按下Home并且任务转到了   背景。因此用户在返回任务时只看到P.

     

如果此属性和allowTaskReparenting都是“true”,则为any   可以重新制作父母的活动将移动到他们共享的任务中   亲和力;如上所述,其余的活动随后被删除   上方。

这是一篇很棒的文章,帮助我找到它:http://developer.android.com/guide/components/tasks-and-back-stack.html

答案 1 :(得分:1)

不确定这是否有效:

@Override
public void finish() {
   super.finish();
   Log.d("derp", "who is calling me?", new RuntimeException());
}