屏幕关闭时不调用片段回调

时间:2014-12-18 14:16:46

标签: android android-activity android-fragments

我在Android应用上遇到了一个涉及我的片段回调流的奇怪问题。这是问题所在:

我收到一个消息列表,其中一些是读取的,另一些是新的,我分开然后将未读的消息放入未读消息列表中,其余的放在一个单独的选项卡中,所有选项卡都是由片段组成,未读的列表片段和每个读取消息的详细片段。

因此,当我收到列表并尝试重新安装我的标签时,当屏幕开启和关闭时,应用程序的行为会有所不同。我已经在我的流程的每个重要调用中记录了一个Log,这是我描述的两个场景:

屏幕开启:

12-18 12:07:09.704: D/MainActivity(14178): oncreate
12-18 12:07:10.134: D/MainActivity(14178): refreshListAfterPush
12-18 12:07:10.395: D/MainActivity(14178): refresh
12-18 12:07:10.445: D/MainActivity(14178): onStart
12-18 12:07:10.445: D/MainActivity(14178): onResume
12-18 12:07:10.875: D/JOBLIST(14178):      onAttach
12-18 12:07:10.875: D/JOBLIST(14178):      onCreate: joblist created
12-18 12:07:10.885: D/JOBLIST(14178):      FINISHED ON CREATE
12-18 12:07:10.905: D/JOBLIST(14178):      onCreateView JobListFragment
12-18 12:07:10.915: D/JOBLIST(14178):      FINISHED ON CREATE VIEW
12-18 12:07:10.915: D/JOBLIST(14178):      ONRESUME
12-18 12:07:15.449: D/MainActivity(14178): adding new itens to list

所以我的所有片段都正确地添加到列表中,一切正常,这是理想的行为。

当屏幕关闭且我的活动因GCM推送而收到意图时:

12-18 12:11:26.504: D/MainActivity(14353): oncreate
12-18 12:11:26.865: D/MainActivity(14353): refreshListAfterPush
12-18 12:11:27.175: D/MainActivity(14353): refresh
12-18 12:11:27.255: D/MainActivity(14353): onStart
12-18 12:11:27.255: D/MainActivity(14353): onResume
12-18 12:11:27.315: D/MainActivity(14353): onPause
12-18 12:11:27.315: D/MainActivity(14353): elapsed between resume and pause: 0
12-18 12:11:32.190: D/MainActivity(14353): adding new itens to list
12-18 12:11:32.200: D/JOBLIST(14353):      UPDATE LIST JOB

出于某种原因,当屏幕关闭时,片段的onCreate和onCreateView没有被调用,所以当我尝试更新它时,一些对象没有被初始化,导致崩溃。

Fragment在MainActivity的onCreate中创建并添加,在两种情况下都会调用,如日志中所示。

我错过的是,当屏幕可见时和不显示时,活动初始化之间有什么区别吗?

修改

在应用程序的旧版本中,活动的onCreate在活动调用onResume回调后立即调用,一切正常。在这种回调流程中是否有任何异步性?

注意:

我使用FragmentStatePagerAdapter来提供一些SherlockFragment。

提前致谢

2 个答案:

答案 0 :(得分:0)

这是预期的行为。想一想。如果没有人愿意,你不需要更新屏幕视图,消耗能量和时间。这是几乎每个移动设备中的哲学(节省电池)的一部分。

在你的情况下,片段没有附加,因为片段在某种程度上是一种视图。

答案 1 :(得分:0)

首先,我所做的是错的,我知道。将模型放在视图中(片段代码)是不正确的,我不应该期望它以这种方式工作。

但它确实在我的应用程序的早期版本中有效。

我最终发现,根据所选的Android API目标,回调的行为是不同的,并且在早期版本的Android中有点不对。

当我构建针对Android 4.0的应用时,即使屏幕上没有显示,也会调用片段的onCreate回调。在Android 4.4中(我在问这个问题时使用的),行为更正确,但它破坏了我期望的功能,导致了一堆NullPointerExceptions。

好吧,我没有找到任何关于这方面的官方文件,所以我只是张贴告诉我发现了什么,以防其他人处于相同的情况。