您的位置:首页 > 移动开发 > Android开发

Android之fragment生命周期

2016-02-16 13:45 501 查看
在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的生命周期。猿友可以试试!

如有不清晰的地方欢迎留言!欢迎各位对小编的指导!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: