Android之fragment生命周期

来源:互联网 发布:北京海洋馆客流量数据 编辑:程序博客网 时间:2024/06/05 18:33

在android的快速发展中,fragment(碎片化)已经成为主流,它不仅可以是viewpager的好搭档,也是性能提高的一种方式(减少activity的建立)。但是在实际运用中,总是因为它的生命周期导致程序不能达到预想的效果,在这里小编写了个测试程序,简要的说明fragment的生命周期。

主Activity的代码如下:

@Overrideprotected void onCreate(Bundle savedInstanceState) {    Log.d(TAG, "onCreate");    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    findViewByID();    initView();}@Overrideprotected void onResumeFragments() {    Log.d(TAG, "omResumeFragments");    super.onResumeFragments();}@Overrideprotected void onStart() {    Log.d(TAG, "onStart");    super.onStart();}@Overridepublic void startActivityForResult(Intent intent, int requestCode) {    Log.d(TAG, "startActivityForResult");    super.startActivityForResult(intent, requestCode);}@Overridepublic void onAttachFragment(android.support.v4.app.Fragment fragment) {    Log.d(TAG, "onAttachFragment");    super.onAttachFragment(fragment);}@Overridepublic void startActivity(Intent intent) {    Log.d(TAG, "startActivity");    super.startActivity(intent);}@Overridepublic void startActivityFromFragment(Fragment fragment, Intent intent, int requestCode) {    Log.d(TAG, "startActivityFromFragment");    super.startActivityFromFragment(fragment, intent, requestCode);}// 初始化视图private void initView() {    fragments = new Fragment[2];    fragments[0] = new Fragment1();    fragments[1] = new Fragment2();    fManager = getFragmentManager();    FragmentTransaction transition = fManager.beginTransaction();    transition.add(R.id.fram, fragments[0], "fragment1").hide(fragments[0]);    transition.addToBackStack("fragment1");    transition.add(R.id.fram, fragments[1], "fragment2").hide(fragments[1]);     transition.addToBackStack("fragment2");    transition.show(fragments[0]);    Log.d(TAG,"5454654645654656");    transition.commit();    bt.setOnClickListener(new MyClickChange());}//idprivate void findViewByID() {    bt = (Button) findViewById(R.id.bt1);    frameLayout = (FrameLayout) findViewById(R.id.fram);}@Overrideprotected void onStop() {    Log.d(TAG, "onStop");    super.onStop();}@Overrideprotected void onPostResume() {    Log.d(TAG, "onPostResume");    super.onPostResume();}@Overrideprotected void onDestroy() {    Log.d(TAG, "onDestroy");    super.onDestroy();}@Overrideprotected void onPause() {    Log.d(TAG, "onPause");    super.onPause();}@Overrideprotected void onResume() {    Log.d(TAG, "onResume");    super.onResume();}@Overrideprotected void onSaveInstanceState(Bundle outState) {    Log.d(TAG, "onSaveInstanceState");    super.onSaveInstanceState(outState);}@Overridepublic void startActivityFromFragment(android.support.v4.app.Fragment fragment, Intent intent, int requestCode) {    Log.d(TAG, "startActivityFromFargment");    super.startActivityFromFragment(fragment, intent, requestCode);}@Overrideprotected void onRestart() {    Log.d(TAG, "onRestart");    super.onRestart();}private class MyClickChange implements View.OnClickListener {    @Override    public void onClick(View v) {        switch (mflagfragment) {            case 0:                fManager.beginTransaction().hide(fragments[mflagfragment]).show(fragments[++mflagfragment]).commit();                break;            case 1:                fManager.beginTransaction().hide(fragments[mflagfragment]).show(fragments[0]).commit();                mflagfragment = 0;                break;        }    }}

fragment1的代码如下:

 @Override    public void onHiddenChanged(boolean hidden) {        Log.d(TAG,"onHiddenChanged");        super.onHiddenChanged(hidden);    }    /*    * 跳转activity    * 传入参数为intent*/    @Override    public void startActivity(Intent intent) {        Log.d(TAG,"startActivity");        super.startActivity(intent);    }    /*带返回数据返回activity    *传入数据后调用startActivityfromFragment    *但看源码中startActivityFromFragment并没有对options做任何处理,执行的还是startActivity方法.    * */    @Override    public void startActivity(Intent intent, Bundle options) {        Log.d(TAG,"startActivity");        super.startActivity(intent, options);    }    /*    * 启动的是startActivityForResult    * 都是继承的mhost(callback)*/    @Override    public void startActivityForResult(Intent intent, int requestCode) {        Log.d(TAG,"startActivityForResult");        super.startActivityForResult(intent, requestCode);    }    @Override    public void onCreate(Bundle savedInstanceState) {        Log.d(TAG,"onCreate");        super.onCreate(savedInstanceState);    }    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        Log.d(TAG,"onCreateView");        return super.onCreateView(inflater, container, savedInstanceState);    }    @Override    public void onViewCreated(View view, Bundle savedInstanceState) {        Log.d(TAG,"onViewCreated");        super.onViewCreated(view, savedInstanceState);    }/** 获取视图*/    @Nullable    @Override    public View getView() {        return super.getView();    }    @Override    public void onActivityCreated(Bundle savedInstanceState) {        Log.d(TAG,"onActivityCreated");        super.onActivityCreated(savedInstanceState);    }    @Override    public void onViewStateRestored(Bundle savedInstanceState) {        super.onViewStateRestored(savedInstanceState);    }    @Override    public void onStart() {        Log.d(TAG,"onStart");        super.onStart();    }    @Override    public void onResume() {        Log.d(TAG,"onResume");        super.onResume();    }    @Override    public void onSaveInstanceState(Bundle outState) {        Log.d(TAG,"onSaveInstanceState");        super.onSaveInstanceState(outState);    }    /*配置改变时调用*/    @Override    public void onConfigurationChanged(Configuration newConfig) {        Log.d(TAG,"onConfigurationChanged");        super.onConfigurationChanged(newConfig);    }    @Override    public void onPause() {        Log.d(TAG,"onPause");        super.onPause();    }    @Override    public void onStop() {        Log.d(TAG,"onStop");        super.onStop();    }    @Override    public void onLowMemory() {        Log.d(TAG,"onLoWMemory");        super.onLowMemory();    }    @Override    public void onTrimMemory(int level) {        Log.d(TAG,"onTrimMemory");        super.onTrimMemory(level);    }    @Override    public void onDestroyView() {        Log.d(TAG,"onDestroyView");        super.onDestroyView();    }    @Override    public void onDestroy() {        Log.d(TAG,"onDestroy");        super.onDestroy();    }    @Override    public void onDetach() {        Log.d(TAG,"onDetach");        super.onDetach();    }/*以下都是跟transition相关的方法*/    @Override    public boolean getAllowReturnTransitionOverlap() {        return super.getAllowReturnTransitionOverlap();    }    @Override    public void setAllowReturnTransitionOverlap(boolean allow) {        super.setAllowReturnTransitionOverlap(allow);    }    @Override    public boolean getAllowEnterTransitionOverlap() {        return super.getAllowEnterTransitionOverlap();    }    @Override    public void setAllowEnterTransitionOverlap(boolean allow) {        super.setAllowEnterTransitionOverlap(allow);    }    @Override    public Transition getSharedElementReturnTransition() {        return super.getSharedElementReturnTransition();    }    @Override    public void setSharedElementReturnTransition(Transition transition) {        super.setSharedElementReturnTransition(transition);    }    @Override    public Transition getSharedElementEnterTransition() {        return super.getSharedElementEnterTransition();    }    @Override    public void setSharedElementEnterTransition(Transition transition) {        super.setSharedElementEnterTransition(transition);    }    @Override    public Transition getReenterTransition() {        return super.getReenterTransition();    }    @Override    public void setReenterTransition(Transition transition) {        super.setReenterTransition(transition);    }    @Override    public Transition getExitTransition() {        return super.getExitTransition();    }    @Override    public void setExitTransition(Transition transition) {        super.setExitTransition(transition);    }    @Override    public Transition getReturnTransition() {        return super.getReturnTransition();    }    @Override    public void setReturnTransition(Transition transition) {        super.setReturnTransition(transition);    }    @Override    public Transition getEnterTransition() {        return super.getEnterTransition();    }    @Override    public void setEnterTransition(Transition transition) {        super.setEnterTransition(transition);    }}

fragment2与fragmetn1相识的代码,这里就不贴出了

运行结果log信息打印:

跳转到后台





重新返回程序


这是完整的生命周期图


在这里小编用的onhide的方式改变fragment,实现切换。如果用replace的话会重启调用,耗用性能,onhide相当于叠加而已,放置下一层!

从上logcat图中可以分析出:

fragment的启动生命周期如下:

onHiddenchanged->onCreate->onCreateView->onActivityCreated->onCstart->onResume

唤醒切换

onPause->onSaveInstanceState->onStop->onStart->onResume

加入activity的生命周期

退出时:(F代替frament A代替Activity)

F onpause -> A onPause ->A onSaveInstanState ->F onSaveInstanState ->F onStop ->A onStop

唤醒

A onRestart -> A onStart -> F onStart -> A onResume -> F onResume ->A onPostResume ->A onResumeFragments

以上是隐藏和唤醒fragment在activity的生命周期。猿友可以试试!

如有不清晰的地方欢迎留言!欢迎各位对小编的指导!

1 1
原创粉丝点击