这是我解决这个问题的第二种方法,到目前为止还没有运气。
我有MainActivity
,这是一个启动器活动。
在它的onCreate
方法中,我检查static endpoints
是否初始化。
否->启动服务并注册接收器(show loader) -> 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
的onCreate()
, onResume()
, onStart()
, onCreateView()
从发射。其中一些方法需要初始化静态(MainActivity
还没有完成init进程),这会导致崩溃
所以我的问题是:我如何能防止Fragment
在这种情况下被重新创建?所以这是一个干净的MainActivity
开始。如有任何提示,我将不胜感激。
不可行的解决方案或"我试过了"的解决方案:
在手机上保存静态端点->不可能发生,因为端点每5分钟动态更改一次
singleTop
,singleTask
forMainActivity
在MainActivity onCreate方法中,检查savedInstanceState is null or not
.
如果that is not null the don't start the service
并创建片段。注意:你也不应该调用setContentView
,因为这将丢弃视图甚至片段的保存实例。
如果OnCreate, onCreateView和onAttach中的saveInstance Bundle是not null
,则在每个片段的individual Fragment save the state
和restore it
中。
在fragments onCreate中,检查静态变量是否初始化。如果没有,则删除该片段并启动服务调用。服务调用完成后,像往常一样添加片段。
我通过在MainActivity.onCreate()
中做这样的事情来克服这个问题:
if(!MyStatics.isInitialized())
super.onCreate(null);
else
super.onCreate(savedInstanceState);
这会导致重启Activity
而不重新创建片段