我该如何追踪我的应用程序为什么会被关闭?

9

背景

我是一个参与一个相当大且非常复杂项目的开发人员。该项目的一半采用JavaScript编写,另一半采用Java编写,此外,约30%的基础产品预编译,因此我们无法准确地查看或调试其中的内容。

问题

当我们的应用程序返回前台时,活动堆栈会被销毁,只有根活动会被显示。我不能追踪为什么会这样。

迄今为止我尝试过的事情

  1. 在我能找到的每个finish()调用上设置断点,但没有一个被调用
  2. 将android:excludeFromRecents =“false”设置为每个活动
  3. 从AndroidManifest中删除android:launchMode =“singleTop”
  4. 我在第二个活动的onDestroy()方法中设置了断点,并且我可以看到“isFinishing()”方法执行为“True”,因此我知道不是操作系统正在销毁活动,但没有信息(据我所见)指出是哪个类/属性/方法导致调用该方法。在堆栈跟踪中没有有用的信息。在日志中没有有用的信息。
  5. 我也试图向公司周围的人询问,但到目前为止没有答案。

问题

有没有找出哪个生命周期方法被调用的策略?

更新1

感谢评论部分的细心提问和帮助。以下是序列图,以更好地解释正在发生的事情。

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

更新2

这里是内存使用情况的屏幕截图

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

当我启动Activity B时

enter image description here

当我把应用程序发送到后台时

输入图像说明

当我回到前台

输入图像说明


你尝试过使用 https://github.com/square/leakcanary 来跟踪内存泄漏吗? - Gatunox
@Gatunox,感谢您的建议。我还没有研究内存泄漏。行为非常一致,所以我怀疑这不是内存泄漏。每次应用程序返回前台时,活动都会被销毁。 - Allan Spreys
我几乎可以确定在某个我看不到的地方有一个“finish()”调用。 - Allan Spreys
1
请检查以下方法是否存在:onPause(),onStop(),onDestroy(),onUserLeaveHint(),onRestart()。您可能会注意到其中有一些问题...另外,如果您确定在整个项目中某处调用了finish()函数,请尝试搜索它。这可能会有所帮助。 - Hussein El Feky
那么我的另一个想法是检查内存,你知道应用程序使用了多少内存吗?在调试时,你是否在DDMS上进行了检查? - Gatunox
显示剩余8条评论
2个回答

2

解决方案已找到!

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

android:clearTaskOnLaunch="true"

这里是来自文档的一段引用:
android:clearTaskOnLaunch 是否在每次从主屏幕重新启动时除了根活动以外清除任务中的所有活动,"true"表示任务总是被削减到其根活动,"false"则不会。默认值为"false"。此属性仅适用于启动新任务(根活动)的活动;对于任务中的其他所有活动,此属性都将被忽略。当值为"true"时,用户每次重新启动任务时,他们都将被带到其根活动,无论他们在任务中最后做什么或者无论他们是否使用“返回”或“主屏幕”按钮离开它。当值为"false"时,在某些情况下可以清除任务中的活动(请参阅alwaysRetainTaskState属性),但并非总是如此。
例如,假设有人从主屏幕启动活动P,并从那里转到活动Q。用户接下来按Home键,然后返回到活动P。通常,用户会看到活动Q,因为这是他们在P的任务中最后执行的操作。然而,如果P将此标志设置为"true",则当用户按Home键并将任务移到后台时,覆盖它的所有活动(在此情况下为Q)都将被删除。因此,当用户返回任务时,只会看到P。
如果此属性和allowTaskReparenting属性均为"true",则可重新父项的任何活动都将移动到它们与之共享关联的任务中;其余活动将按上述方式被丢弃。
这是一个帮助我找到它的好文章:http://developer.android.com/guide/components/tasks-and-back-stack.html

1
不确定这是否有效:

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

啊,这是个聪明的技巧!不幸的是,finish() 没有被调用。如果我在活动内按下返回按钮,那么 "finish()" 就会被调用,但当我将应用程序带回前台时却没有。 - Allan Spreys
有趣,我想这意味着没有显式调用finish()方法。那么它是什么? :) - Allan Spreys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接