1.onAttach->onCreate.....->onDestroy->onDettachide
這條生命週期是一個完整的生命週期,onAttach表示從Actitivity附着,onDettach表示從Activity剝離,通常來講,調用add方法後悔有這條流程。優化
注意:在FragmentActivity中使用事務的方法attach和dettach並不會調用onAttach和onDettach,那會發生什麼變化呢,看第三條spa
2. onSaveInstanceState-->onStop ... onStart->onResume-->....設計
這條生命週期和Activity的onRestart有着必定的關聯。code
注意,Activity每次調用onRestart以後,Fragment就會執行這條生命週期,可是要注意的是,這條生命週期並不可靠,有時不會執行。生命週期
3.onDestroyView-> .... ->onCreateView ->onViewCreate事務
生命週期反了麼,答案是否認的。調用者條生命週期每每是使用了事務的方法dettach和attach。開發
注意:在這種流程中,能夠更好的管理Fragment的加載,也能夠解決疊加問題,生命週期循環問題。rem
4.重複onAttach->onCreate.....->onDestroy->onDettachget
這條生命週期是因爲每次都是用的是replace方法
5.持久態
在經歷了.onAttach->onCreate->onCreatView-->...->onResume以後,若是沒掉用replace,add,attach,dettach,而是使用了簡單的hide,show等方法
注意:這種可用於回退棧操做。
Android 3.0開始Fragment屢次受到普遍關注,是的頁面開發更加方便。
FragmetnManager+FragmentTransaction+Fragment+FragmentActivity是4個永遠離不開的組件。所以來講, 開發難度有所提高的同時,效率問題也成爲了重點考慮的。
開發時常常遇到的Fragment問題有:管理,事務,添加,移除,通訊,回退棧。Fragment的 效率問題發生的緣由是FragmentManager設計並不完美形成的。FragmentManager只作了一 半工做,剩下的一半管理工做須要由開發人員來實現。
開發Fragment須要注意一下幾點:
若是Fragment頁面只出現一次,相似歡迎界面的話 使用 replace+不斷新建Fragment方法便可
若是使用Fragment+BackStack,不要使用replace,應該使用add+remove+popBackStack+addToBackStack+hide+show
若是是作Tab頁面,確切的說你還須要定義至少一個List<Fragment> fragmentList。
將初始化完畢的全部Fragment加入fragmentlist,而後使用 add+attach+detattch方法進行管理,add負責添加,其餘2個方法負責切換,這樣效率特別好,防止了Fragment的疊加。
Fragment的內部優化,依據Fragment的生命週期,onCreateView和onDestroyView會被反覆調用,所以需定義一個全局的contenrView優化以下
private View contentView = null; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { if(contentView==null) { contentView = inflater.inflate(R.layout.testlayout, container,false } if(contentView!=null) { return contentView; } return super.onCreateView(inflater, container, savedInstanceState); } public void onViewCreated(View view, Bundle bundle) { if(view!=null) { TextView tv = view.findViewById(R.id.showTv); tv.setTextView("請在這裏初始化頁面數據"); } } @Override public void onDestroyView() { //移除當前視圖,防止重複加載相同視圖使得程序閃退 ((ViewGroup)contentView.getParent()).removeView(contentView); super.onDestroyView(); }
Try doing it!