2

这是我解决此问题的第二种方法,到目前为止还没有运气。

我有MainActivity哪个是启动器活动。

在其onCreate方法中,我检查是否static endpoints已初始化。

如果没有 -> 启动服务并注册接收器(显示加载器) ->onReceive显示一些片段

如果是 -> 显示一些片段

这部分效果很好。

那么有什么问题呢?

我有MainActivity一些片段。然后我把进程放到后台做

adb shell am kill com.myapp

PID被杀死。所以现在我想再次启动该应用程序。Android 尝试重新创建应用程序状态,这意味着触发:

(为简单起见,我们假设MainActivity在运行时只有一个片段可见)

MainActivity : onAttachFragment()
Fragment     : onAttach()
Fragment     : onCreate()
MainActivity : onCreate()
Fragment     : onCreateView()
...

问题是这样的:当MainActiviy.onCreate看到静态没有初始化时,它会调用一个调用Service并等待响应。这是一个正常的启动场景。但这一次Fragment也在重新创建,它的生命周期与MainActivity生命周期混合在一起。因为一切都是异步发生的,所以我无法阻止Fragment's onCreate(), onResume(), onStart(),onCreateView()触发..其中一些方法需要初始化静态变量(MainActivity尚未完成 init 进程),这会导致崩溃

所以我的问题是:如何防止Fragment在这种情况下被重新创建?所以这最好是一个干净的MainActivity开始。在这一点上的任何提示将不胜感激。

不可行的解决方案或“我试过了”解决方案:

  • 在手机上保存静态端点 -> 不可能发生,因为端点每 5 分钟动态更改一次

  • singleTop,singleTask对于MainActivity

4

3 回答 3

0

在片段 onCreate 中,检查静态变量是否已初始化。如果没有,则删除片段并启动服务调用。服务调用完成后,像往常一样添加片段。

于 2013-05-23T12:29:23.033 回答
0

在 MainActivity onCreate 方法中,检查是否savedInstanceState is null or not.

如果that is not null the don't start the service并创建片段。注意:您也不应该调用setContentView,因为这将丢弃视图甚至片段的已保存实例。

并且在每个individual Fragment save the state片段中,restore it如果 OnCreate 中的 saveInstance Bundle、onCreateView 和 onAttach 是not null.

于 2013-05-23T12:25:25.527 回答
0

我设法通过在内部做这样的事情来克服这个问题MainActivity.onCreate()

if(!MyStatics.isInitialized())
    super.onCreate(null);
else
    super.onCreate(savedInstanceState);

这会导致重新启动Activity而不重新创建片段

于 2013-05-24T07:40:18.160 回答