Activity和Fragment之间的联系和区别
来源:互联网 发布:淘宝图片空间协议手机 编辑:程序博客网 时间:2024/06/03 11:02
Android开发中,Acitivity是四大组件中用得非常多的一个组件,也是UI和业务逻辑的一个重要的纽带,那么它和与它很类似的Fragment有哪些联系和区别呢?现在主要从生命周期来谈谈自己的看法。另外也顺便看看onSaveInstanceState这个方法大体是怎么保存状态并在onCreate中恢复状态的。
图1、Activity的生命周期
首先看Activity的生命周期,有:
onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()、onRestart()
其中:
onCreate()和onDestroy()是成对关系
onStart()和onStop()是成对关系
onResume()和onPause()是成对关系
然后看Activity的几种状态:
运行状态、暂停状态、停止状态、销毁状态
Activity的几种生存期:
完整生存期、可见生存期、前台生存期
根据生命周期、状态、生存期对Activity做一个解释分析
运行状态:当一个活动位于返回栈的栈顶时该活动就是处于运行状态
暂停状态:当一个活动不处于栈顶位置但仍然可见时,活动处于暂停状态(比如在对话框后面的activity)
停止状态:当一个活动不再处于栈顶位置并且完全不可见时,活动处于停止状态
销毁状态:当一个活动从返回栈中移除后就变成了销毁状态
完整生存期:活动从onCreate()到onDestroy()之间经历的就是完整生存周期
可见生存期:活动在onStart()到onStop()之间经历的就是可见生存期。此时活动可见,即便可能不能与用户交互。
前台生存期:活动在onResume()到onPause之间经历的就是前台生存期。此时活动可见并且能与用户交互。
Activity之间的生命周期状态转换:
当另一个活动来到前台,此活动onPause()方法执行;此活动重新返回前台,此活动onResume()方法执行。
当此活动不可见,此活动onStop()方法执行;此活动重新可见返回前台,onStart()方法执行。
当此活动不处于前台甚至不可见时,一个优先级更高的线程需要内存,当前活动被kill掉,重新返回该活动时,onCreate()方法执行。
图2、Fragment的生命周期
然后再看看Fragment的生命周期
因为Fragment和Activity是可以通信的,Fragment是一种控制器对象,Activity可以委派它完成一个任务,这些任务通常就是管理用户界面(Activity通过findFragmetById获得Fragment的一个实例,Fragment通过getActivy获得Activity的实例和Context)。
Activity知道如何管理Fragment,因此Fragment的使用需要Activity的支持,使得Fragment的生命周期和Activity的生命周期非常像,很多方法名称都和Activity是一样的。
Fragment的运行状态:
运行状态:当fragment可见,并且它关联的activity处于运行状态,此fragment也处于运行状态。
暂停状态:当一个activity进入暂停状态(比如对话框等未占满屏幕的activity进入栈顶),fragment也进入到暂停状态
停止状态:当一个activity进入停止状态,与之关联的fragment也进入停止状态;或者通过fragment事务的remove和replace方法将fragment移除。如果在事务commit之前调用了addToBackStack()方法,这时的fragment也会停止
销毁状态:Fragment依附Activity存在,当activity被销毁,与之关联的fragment也被销毁。或者通过fragment事务的remove和replace方法将fragment移除。如果在事务commit之前没有调用addToBackStack()方法,这时的fragment也会销毁
Fragment相对Activity添加的回调方法
onAttach():当fragment和activity建立关联的时候调用
onCreateView():为fragment创建视图调用,在onCreate之后
onActivityCreated():确保与fragment相关联的activity一定已经创建完毕的时候调用
onDestroyView():当与fragment关联的视图被移除的时候调用
onDetach():当fragment与activity解除关联时调用
onAttach()与onDetach()是一组
onCreateView()与onDestroyView()是一组
顺便讲讲状态保存于状态恢复的源码:
这是onSaveInstanceState(保存状态)方法的源码
protected void onSaveInstanceState(Bundle outState) { outState.putBundle(WINDOW_HIERARCHY_TAG, mWindow.saveHierarchyState()); Parcelable p = mFragments.saveAllState(); if (p != null) { outState.putParcelable(FRAGMENTS_TAG, p); } getApplication().dispatchActivitySaveInstanceState(this, outState);}
这是onCreate的源码
protected void onCreate(@Nullable Bundle savedInstanceState) { if (DEBUG_LIFECYCLE) Slog.v(TAG, "onCreate " + this + ": " + savedInstanceState); if (mLastNonConfigurationInstances != null) { mFragments.restoreLoaderNonConfig(mLastNonConfigurationInstances.loaders); } if (mActivityInfo.parentActivityName != null) { if (mActionBar == null) { mEnableDefaultActionBarUp = true; } else { mActionBar.setDefaultDisplayHomeAsUpEnabled(true); } } if (savedInstanceState != null) { Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG); mFragments.restoreAllState(p, mLastNonConfigurationInstances != null ? mLastNonConfigurationInstances.fragments : null); } mFragments.dispatchCreate(); getApplication().dispatchActivityCreated(this, savedInstanceState); if (mVoiceInteractor != null) { mVoiceInteractor.attachActivity(this); } mCalled = true;}
onSaveInstanceState方法中的大意是:保存Window的State信息,保存所有Fragment的信息(通过Parcelable将所有的状态打包存入一个名为 FRAGMENTS_TAG 的对象中),获取当前应用环境使用dispatchActivitySaveInstanceState(this, outState)方法保存outState到当前Context中。
onCreate方法就是对保存的状态依次作解析。
更具体的分析可以查看一些大神的解释,如有侵权请联系删除。
【Android面试】(二):你不能不知道的view—加id和不加id的区别?
Android中SaveState原理分析
- Activity和Fragment之间的联系和区别
- fragment和activity之间的区别
- fragment和activity之间的区别
- Android下Context、Application、Activity之间的联系和区别
- Fragment和Activity的区别
- Fragment和Activity之间的相互通信
- Fragment和Activity之间的接口
- fragment和activity之间的数据传递
- Fragment和Activity之间的数据传递
- Activity和Fragment之间的传值
- Fragment和Activity之间的相互通信
- Activity和Fragment之间的通信
- Fragment和Activity之间的传参
- Fragment和Activity之间的交互
- 外部Activity和fragment之间的切换
- Activity和Fragment之间的数据传递
- Fragment和Activity之间的交互
- Fragment和Activity之间的通信
- 登录界面的实现
- HNOI2016 网络 [树链剖分]
- 二叉查找树和二叉堆的分析小结
- React Native之打包
- git 命令 (gnu interactive tools)
- Activity和Fragment之间的联系和区别
- twisted开发分布式任务调度爬虫
- 异常
- Android4.4 wpa_supplicant深入分析之wpa_supplicant初始化流程续
- C++第四次上机实验-穷举法
- C#通用类Helper整理
- 使用腾讯云发布项目后360浏览器通过ip公网访问项目css样式不完整
- 设置zookeeper开机自启动
- Selenium 2.0的由来及设计架构