Android非UI片段的使用

25

我正在阅读关于Fragments的Android文档。定义Fragment的用户界面的布局可以在Activity的布局中、在一个单独的.xml文件中或者不定义。

根据文档

您还可以使用片段为活动提供后台行为而无需呈现其他 UI。

为什么我需要使用另一个Fragment来为Activity添加功能,而不是在Activity中定义更多函数?这样的非UI Fragment是否仅用于模块化的缘故?采用这种方法的另一个原因是什么?我希望能举一个适用于使用非UI Fragment的例子。

感谢您提前的帮助。


5
其中一个原因是,即使主机活动被销毁(例如旋转屏幕),片段仍然可以存在,所以如果任务位于片段内且片段没有被销毁,则管理后台任务会更加简单。 - Blackbelt
看一下这个:https://dev59.com/Jmgu5IYBdhLWcg3wK0Cr - Francesco verheye
如果您需要后台任务,请使用服务、AsyncTask或由某个全局类生成的Runnable。当已经存在这样的机制时,您使用片段执行后台任务的论点似乎并没有得到证明。 - Johann
@AndroidDev中的服务和可运行对象在UI线程上运行。它们不是后台任务。 - Blackbelt
1个回答

30

我想这是关于保留片段的,您可以在片段中调用setRetainedInstance(true),这样您的片段在配置更改期间将不会被重新创建。通常情况下,当您旋转设备时,所有片段都将被重新创建。如果在onCreate()中调用setRetainedInstance(true),则您的片段实例将不会被重新创建。

它的作用是什么?-您可以将一些数据、数组等放入片段中,并且在配置更改期间它们不会被销毁。您也可以将异步任务放入这样的片段中,在主活动旋转后,片段中的异步任务仍然能够传递其结果。

片段的另一个有用功能是,您可以轻松地在多个活动中重复使用它们。这意味着您可以在非UI片段中放置一些公共逻辑。您可以使用基类为您的活动完成它,但您只能扩展一个类。

来自Google的简单示例(实际上在保留片段中使用线程):

https://android.googlesource.com/platform/development/+/master/samples/ApiDemos/src/com/example/android/apis/app/FragmentRetainInstance.java


为了完整起见,除了旋转之外,您能想到任何其他配置更改,保留片段会证明有用吗? - anna
只是为了完善答案:我开发了另一个用例。该片段具有带有collapseActionView的菜单,可以触发搜索任务,显示自动完成建议并将新片段触发到主UI。我猜这可以在活动中完成,但是拥有SearchBarFragment.java并仅在我想要的任何活动上实例化它会更加有组织和模块化。 - Budius
2
@alig 屏幕旋转是您最常遇到的问题,完整列表请参见此处:http://developer.android.com/guide/topics/manifest/activity-element.html#config - marcinj
但是还有另外两种存储活动数据的方法,在屏幕旋转期间在屏幕销毁后使其可用...
  1. 通过创建一个类并在Application类中创建其对象,您还可以在屏幕旋转期间保持活动状态。
  2. 您可以使用Activity的onSavedInstanceState()和onRestoreInstanceState()方法来保持状态。
- Imran Khan Saifi
@ImranKhanSaifi,使用1时需要小心,如果系统决定终止您的应用程序(因为内存不足),那么当它重新创建时,存储在应用程序对象中的对象将不再存在。使用onSaveInstanceState是更好的解决方案。 - marcinj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接