这是我解决这个问题的第二种方法,到目前为止没有运气。
我有MainActivity
这是一个启动器活动。
在onCreate
方法中,我检查static endpoints
是否已初始化。
如果没有 - >启动服务并注册接收器(show loader) - > onReceive
显示一些片段
如果是 - >显示一些片段
这部分效果很好。
那么问题是什么?
我有一些片段MainActivity
。然后我将流程放入后台并执行
adb shell am kill com.myapp
PID被杀了。所以现在我想再次启动应用程序。 Android尝试重新创建app状态意味着触发:
(为简单起见,我们假设MainActivity
在运行时只有一个片段可见
MainActivity : onAttachFragment()
Fragment : onAttach()
Fragment : onCreate()
MainActivity : onCreate()
Fragment : onCreateView()
...
问题在于:当MainActiviy.onCreate
看到静态未初始化时,它会调用Service
并等待响应。 这是一个正常的开始场景。但是这次正在重建Fragment
,其生命周期与MainActivity
生命周期混合在一起。所有这一切都发生异步我无法阻止Fragment
的{{1}},onCreate()
,onResume()
,onStart()
被解雇..而且其中一些方法需要静态被初始化(onCreateView()
没有完成初始化过程)导致崩溃
所以我的问题是:我如何阻止在这种情况下重新创建MainActivity
?所以这最好是一个干净的Fragment
开始。此时的任何提示都将受到赞赏。
不可行解决方案或“我试过”解决方案:
在手机上保存静态端点 - >不可能发生,因为端点每5分钟动态变化
MainActivity
,singleTop
singleTask
答案 0 :(得分: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
。
答案 1 :(得分:0)
在片段onCreate中,检查静态变量是否已初始化。如果没有,则删除该片段并启动服务调用。服务调用完成后,像往常一样添加片段。
答案 2 :(得分:0)
我设法在MainActivity.onCreate()
内做了类似的事情来克服这个问题:
if(!MyStatics.isInitialized())
super.onCreate(null);
else
super.onCreate(savedInstanceState);
这会导致重新启动Activity
而不重新创建片段