這個東西有顧名思義是碎片,和之前的Activity對應(yīng)???:一般情況都會想當(dāng)然的以為進(jìn)程被殺掉之后,F(xiàn)ragment也會被回收其實(shí),F(xiàn)ragment有自己的生命周期,有自己的管理器(FragmentManager),也即:包含F(xiàn)ragment的進(jìn)程被干掉,F(xiàn)ragment不一定會被回收,而是由FragmentManager來決定生死。Q:如何驗(yàn)證上面的說法?A:如果是一般正常的流程“打開-關(guān)閉”軟件,F(xiàn)ragment的確被回收了。但是如果使用“騰訊手機(jī)管家”之類的內(nèi)存清理工具,清理內(nèi)存(實(shí)際上是殺死進(jìn)程),會發(fā)現(xiàn)Fragment沒有被回收,一直緩存著。驗(yàn)證方法如下:緩存Fragment的Tag到本地數(shù)據(jù)庫(可以是xml/sqlite等),然后用FragmentManager.findFragmentByTag(...)是否為Null來驗(yàn)證Framgent是否被回收了。有個奇怪的現(xiàn)狀是:在上面藍(lán)色的情況發(fā)生后,F(xiàn)ramgent和包含他的Activity的生命周期順序都亂套了,原本是:Activity.onCreate-->Fragment.onCreate-->Fragment.onCreateView變成:Fragment.onCreate-->Activity.onCreate-->Fragment.onCreateView猜測是因?yàn)橹苯佑玫腇rament緩存,其onCreate先于父Activity.onCreate執(zhí)行了???:添加Fragment注意事項(xiàng),配置(Configuration?)改變是Android應(yīng)用生命周期的一部分,如果發(fā)生了該事件(屏幕從橫屏換行為豎屏),就會導(dǎo)致Activity被銷毀然后重新創(chuàng)建。就算您在配置文件中設(shè)定Activity為豎屏顯示的 也無法避免,應(yīng)為Android應(yīng)用配置改變的情況有很多種。如果發(fā)生了這種情況,F(xiàn)ragment也會被銷毀然后重新創(chuàng)建。如果您是在運(yùn)行時(在Java代碼中添加Fragment到Activity,不是在Activity的布局文件中聲明的)創(chuàng)建的,則需要額外小心:當(dāng)Activity第一次創(chuàng)建的時候,您需要添加Fragment;當(dāng)由于配置條件改變導(dǎo)致Activity被重新創(chuàng)建則無需再次添加Fragment(系統(tǒng)會自動添加Fragment)。所以問題來了,您如何知道何時應(yīng)該在onCreate函數(shù)中添加Fragment呢??判斷的方法就是檢查?savedInstanceState??參數(shù),如果該參數(shù)為null說明是第一次創(chuàng)建,需要添加Fragment;如果不是null則無需添加。代碼如下:public?class?MyActivity?extends?Activity?{
????@Override
????protected?void?onCreate(Bundle?savedInstanceState)?{????????super.onCreate(savedInstnaceState);????????//?Only?add?fragment?if?this?is?the?initial?Activity?creation
????????if?(savedInstanceState?==?null)?{
????????????FragmentManager?fragmentManager?=
?????????????????????getFragmentManager()
????????????FragmentTransaction?fragmentTransaction?=
?????????????????????fragmentManager.beginTransaction();
????????????ExampleFragment?fragment?=?new?ExampleFragment();
????????????fragmentTransaction.add(R.id.fragment_container,?fragment);
????????????fragmentTransaction.commit();
????????}?else?{????????????//?Don't?add?the?fragment!
????????????//?(and?use?savedInstanceState?to?restore?Activity?state)
????????}
????}
}如果您沒有按照上面的方式添加Fragment,則您的應(yīng)用可能會出現(xiàn)一種奇怪的現(xiàn)象,同樣的Fragment添加了多次。
【Android開發(fā)坑系列】之Fragment
慕課網(wǎng)android學(xué)習(xí)小組
2014-11-28 15:17:07