Android关于Activity和Fragment生命周期的笔
1、两个Activity相互跳转,ActivityA设置一个button跳转到ActivityB
一开始程序运行时是首先调用第1个activity的onCreate(),onStart(),onResume()函数,然后按下button后,调用第1个activity的onPause(),和第2个activity的onCreate(),onStart(),onResume()函数,然后接着调用第1个activity的onStop(),当按下系统返回键时,这时会调用第2个activity的onPause(),接着是第1个activity的onRestart(),onStart(),onResume(), 最后是调用第2个的onStop()和onDestroy().
2、activity的FragmentManager负责调用队列中fragment的生命周期方法。添加fragment供FragmentManager管理时,onAttach(Activity)、onCreate(Bundle)以及onCreateView(...)方法会被调用。托管activity的onCreate(...)方法执行后,onActivityCreated(...)方法也会被调用。因为我们正向Activity.onCreate(...)方法添加Fragment,所以fragment被添加后,该方法会被调用。
在activity处于停止,暂停或运行状态下时,FragmentManager立即驱使fragment快速跟上activity的步伐,直到与activity的最新状态保持同步。例如,向处于运行状态的activity中添加fragment时,以下fragment生命周期方法会被依次调用:onAttach(Activity)、onCreate(Bundle)、onCreateView(...)、onActivityCreated(Bundle)、onStart(),以及onResume()方法。
只要fragment的状态与activity的状态保持了同步,托管activity的FragmentManager便会继续调用其他生命周期方法以继续保持fragment与activity的状态一致。
3、Activity的管理同样是基于C/S架构的,所有的activity管理都在server端进行。在Server端对每个activity进行调度的同时,Client端负责响应各个生命周期的函数。
在Client端,对activity各个生命周期的响应都是在ActivityThread里进行操作。ActivityThread提供给Server端的调度接口全都以schedule为前缀,如scheduleResumeActivity(),并且所有接口都是往主线程的handler里发送了命令消息之后立刻返回。这样所有的操作都会被转移到主线程上来。对应每一个schedule***函数,都有一个响应操作的handle***函数。在handle***函数里,会根据需要把操作进一步分解成几个动作,真正面向activity的操作统一命名为perform***。在perform***函数的内部,才会真正调用activity的生命周期函数(其实是通过Insturmentation来间接调用)。所以我们可以把所有的接口和方法进行分层:schedule->handle->perform->activity/Insturmation。
在scheduleLaunchActivity中,会往主线程handler发送一个“LAUNCH_ACTIVITY”消息,然后调用handleLaunchActivity。在handleLaunchActivity内部分解成两个动作:
a) performLaunchActivity
在这里完成了activity对象的创建和activity生存环境的创建。比如application对象的生成。接着调用activity.attach()完成Window和WindowManager的创建,并且记录了activity的环境变量如mToken、mActivityInfo等。到此为止,一个具有完整功能的Activity对象已经完成了初始化,接着会调用mInstrumentation.callActivityOnCreate()和activity.performStart()分别响应属于activity生命周期的onCreate()方法和onStart()方法。
b) handleResumeActivity
这个方法属于“handle层”的另一个方法,主要完成onStart()和onResume()的响应。
2.ScheduleResumeActivity
顾名思义,此方法的作用是把一个activity置于resume状态。相应的,所有操作被转移到handleResumeActivity()中。对于handleResumeActivity,有两种情况会调用此方法:scheduleResumeActivity发送“RESUME_ACTIVITY”消息;handleLaunchActivity中的第二步。
在handleResumeActivity中也进一步分解成了两个动:
a) performResumeActivity
调用activity.performResume()方法,在activity.performResume()中会默认先调用performRestart(),performRestart()的作用是先检查activity是否处于stopped状态,如果是则调用performRestart()再调用performStart()。最后再响应activity的生命周期方法onResume()。
所以,新打开一个activity的响应流程是:
onCreate()->onStart()->onResume()
而返回一个后台activity的响应流程是:
onRestart()->onStart()->onResume()
b) 完成了第一步对activity生命周期的响应之后,在第二步这里主要是处理窗口的添加动作:把DecorView添加到WindowManager中。完成第二步操作之后,activity的内容便显示到了屏幕上。