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原理分析

0 0
原创粉丝点击