首先,我想说,我已经为这个问题寻找了三天的解决方案,这可能意味着我问的问题不对,或者没有使用好的方法。如果有的话,请指引我正确的方向。
这是一个场景:我有一个Activity
和一个绑定的Service
。Service
保存一些数据并根据需要进行处理,同时发布带有一些信息的持久(正在进行的)通知。Activity
在显示由Service
处理的数据的ViewPager
内具有三个Fragments
。
Fragments
是显示可用活动数据项的列表片段、显示每个数据的详细信息的Details片段和用户可以修改数据处理方式的参数片段。
[服务]<->([Activity]->[ViewPager([List],[Details],[Parameters])])
一切都很好。我的Activity
绑定到Service
,然后创建ViewPager
,然后Fragments
通过Interface
获取信息。
有趣的部分来了。。。屏幕旋转!
由于Service
异步绑定,当用户旋转屏幕时,Fragments
不再具有数据,因为Activity
正在绑定服务,而它们已经存在,并且由于ViewPager
而没有重新创建。
我一直在努力解决这个问题,但似乎我没有解决这个问题的知识。我尝试过对碎片进行静态引用,在服务反弹之前进行设置,但我无法获得稳定的解决方案。
我会在清单中使用android:configChanges
,但每个方向都有不同的布局。
再说一遍,如果我用的方法不好,请引导我!
当我不知道你的代码但大声思考时,很难提出建议。。。。
你能有一个从未显示(即无头)并设置了setRetainInstance(true)的"工作片段"吗?这样它就不会丢失你设置的任何状态。
您的工作片段将绑定到服务而不是活动,并维护对它的引用。
如果您需要与"活动"进行沟通,可以通过回调来完成。
您的其他片段可以与工作者而不是"活动"进行通信。
这个过程基本上将使活动只不过是一个shell,其余组件都托管在其中。旋转不会损失任何东西,因为所有数据都保存在保留的片段中。
在屏幕旋转过程中,活动被完全破坏,不鼓励使用android:congfigChange。但您可以覆盖saveInstanceState(bundle)方法,在该方法中,您可以在系统响应屏幕旋转而销毁活动时保存活动中存在的数据。然后在系统将bundle传递给activities onCreate(bundle)方法或从restoreInstanceState(bundle)方法获取时接收它。