Android之fragment生命周期
2016-02-16 13:45
501 查看
在android的快速发展中,fragment(碎片化)已经成为主流,它不仅可以是viewpager的好搭档,也是性能提高的一种方式(减少activity的建立)。但是在实际运用中,总是因为它的生命周期导致程序不能达到预想的效果,在这里小编写了个测试程序,简要的说明fragment的生命周期。
主Activity的代码如下:
fragment1的代码如下:
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的生命周期。猿友可以试试!
如有不清晰的地方欢迎留言!欢迎各位对小编的指导!
主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的生命周期。猿友可以试试!
如有不清晰的地方欢迎留言!欢迎各位对小编的指导!
相关文章推荐
- Android Volley框架的使用(2)
- android 百度地图SDK 3.7.0 周边雷达-Radar 周边搜索-PoiSearch
- AsyncTask和Handler两种异步方式的实现和区别比较
- android Activity类中的finish()、onDestory()和System.exit(0) 三者的区别
- Android java.lang.NoClassDefFoundError的一种解决方法
- android 实现带圆角边框
- android:launchMode
- android的listView如何添加一个ViewPager
- Android小技巧
- Android 图片缓存之内存缓存技术LruCache,软引用
- 一个现代化的JSON库Moshi针对Android和Java
- Android NDK打印日志
- ANDROID_MARS学习笔记_S01原始版_015_Socket
- Android数据库操作
- Android 部分内容设置颜色、字体、超链接、图片
- Android 系统下模拟触点击的功能与权限
- Android模仿QQ空间图片上传——原理
- ThinkAndroid框架
- 使用内部(com.android.internal)和隐藏(@hide)API手记
- Android AutoCompleteTextView连接数据库自动提示的方法(附demo源码下载)