Android之fragment生命周期

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

主Activity的代码如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    Log.d(TAG, "onCreate");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    findViewByID();
    initView();
}

@Override
protected void onResumeFragments() {
    Log.d(TAG, "omResumeFragments");
    super.onResumeFragments();
}
@Override
protected void onStart() {
    Log.d(TAG, "onStart");
    super.onStart();
}

@Override
public void startActivityForResult(Intent intent, int requestCode) {
    Log.d(TAG, "startActivityForResult");
    super.startActivityForResult(intent, requestCode);
}

@Override
public void onAttachFragment(android.support.v4.app.Fragment fragment) {
    Log.d(TAG, "onAttachFragment");
    super.onAttachFragment(fragment);
}

@Override
public void startActivity(Intent intent) {
    Log.d(TAG, "startActivity");
    super.startActivity(intent);
}

@Override
public 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());
}

//id
private void findViewByID() {
    bt = (Button) findViewById(R.id.bt1);
    frameLayout = (FrameLayout) findViewById(R.id.fram);
}

@Override
protected void onStop() {
    Log.d(TAG, "onStop");
    super.onStop();
}

@Override
protected void onPostResume() {
    Log.d(TAG, "onPostResume");
    super.onPostResume();
}

@Override
protected void onDestroy() {
    Log.d(TAG, "onDestroy");
    super.onDestroy();
}

@Override
protected void onPause() {
    Log.d(TAG, "onPause");
    super.onPause();
}

@Override
protected void onResume() {
    Log.d(TAG, "onResume");
    super.onResume();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    Log.d(TAG, "onSaveInstanceState");
    super.onSaveInstanceState(outState);
}

@Override
public void startActivityFromFragment(android.support.v4.app.Fragment fragment, Intent intent, int requestCode) {
    Log.d(TAG, "startActivityFromFargment");
    super.startActivityFromFragment(fragment, intent, requestCode);
}

@Override
protected 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值