【问题标题】:Fragment callbacks are not called when screen is OFF屏幕关闭时不调用片段回调
【发布时间】:2014-12-18 14:16:45
【问题描述】:

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

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

因此,当我完成接收列表并尝试重新安装标签时,应用程序在屏幕打开和关闭时的行为会有所不同。我在流程的每个重要调用中都添加了一个日志,以下是我描述的两个场景:

屏幕开启:

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

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

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

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

编辑:

在旧版本的应用程序中,活动的 onCreate 会在活动调用其 onResume 回调之后调用,并且一切正常。在这个回调流程中是否存在任何异步性?

注意:

我正在使用 FragmentStatePagerAdapter 来提供一些 SherlockFragment。

提前致谢

【问题讨论】:

    标签: android android-activity android-fragments


    【解决方案1】:

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

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

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

    当我构建面向 Android 4.0 的应用时,会调用片段的 onCreate 回调,即使它在屏幕上不可见。在 Android 4.4(我在问这个问题时使用的那个)中,这种行为更正确,但它破坏了我所期望的功能,导致一堆 NullPointerExceptions。

    好吧,我没有找到任何有关此的官方文档,所以我只是发布我发现的内容,以防其他人处于同样的情况。

    【讨论】:

      【解决方案2】:

      这是预期的行为。想想看。如果没有人会看到它,您不需要更新屏幕视图,耗费精力和时间。这是几乎所有移动设备的哲学(节省电池)的一部分。

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

      【讨论】:

      • 如果在应用程序已经运行的情况下调用它不起作用,我会说得通,因为在这种情况下,行为是正确的
      猜你喜欢
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多