记录给健忘的自己
生命周期
Activity的生命周期就是那七个,俩俩对应,以及每个周期内要干什么,网上随便都能查到,一般开发者也是光速咏唱倒背如流。
需要注意的一些点:
- 注意在onCreate或者onRestoreInstanceState处理activity重建的问题。这里又涉及onSaveInstanceState方法何时调用的问题。
- 注意区分activity的是否可见状态和是否能够交互的状态。相关内容是A启动B时或者A中弹窗时走的生命周期流程。
- 注意横竖屏切换的生命周期变化(android:configChange=”orientation“配置项和onConfigurationChange()方法的调用)
启动模式
四种启动模式,仨名字带single,回想一下具体的名字以及具体的作用。
需要注意的一些点:
- 注意的onNewIntent()方法被调用的条件。(single系)
- singleTask会将activity标记为可在新栈中创建,并不代表一定会在新栈中创建,可以通过配置taskAffinity(默认是包名)来指定activity的栈名
- tag FLAG_ACTIVITY_NEW_TASK的作用和singleTask相同,其实就是配置了singleTask的activity会被系统打上FLAG_ACTIVITY_NEW_TASK的tag
- 通过配置taskAffinity可以让两个不同的app的activity存放到同一个任务栈中(这是一个比较有趣的点)
- singleInstance不仅全局唯一,也独占一个任务栈,被它启动的activity会被打上FLAG_ACTIVITY_NEW_TASK的tag
Activity启动过程
源码基于Android10,可能和一些较老的文章有内容上的出入,主要是源码方面以被修改,但大致流程不会发生改变
参考地址,记录防丢
- 调用startActivity最终的实现是Activity类的startActivityForResult,其中调用了instrumentation.execStartActivity方法。
- execStartActivity方法中又会调用AMS.startActivity方法
- AMS.startActivty方法中又直接调用了startActivityAsUser,这里需要注意ActivityStartController的返回了一个ActivityStarter对象,具体逻辑在ActivityStarter的execute方法中,然后就是startActivityMayWait方法。
- 之后有好几个同名的startActivity方法,涉及处理intent信息、权限检查等
- 一连串startActivity之后会调用startActivityUnchecked,此处有处理启动模式,然后跟进ActivityStackSupervisor.resumeFocusedStackTopActivityLocked方法,这里就涉及栈的调整。
- 再进一步有ActivityStack.resumeTopActivityUncheckedLocked->ActivityStack.resumeTopActivityInnerLocked->ActivityStackSupervisor.startSpecificActivityLocked
- startSpecificActivityLocked中会判断activity的application是否在运行。然后进入realStartActivityLocked方法
- 最后会通过ClientTransaction对象调用AT.scheduleTransaction方法(Android9之后ClientTransaction接管了activity生命周期分配),至此,AMS的行为已经结束,逻辑回到了AT
- scheduleTransaction方法发送了一个EXECUTE_TRANSACTION的消息
- AT中的类H会处理收到的消息,会调用TransactionExecutor.execute,钻进去核心是executeLifecycleState,其中的ActivityLifecycleItem是抽象类,具体的实现有LaunchActivityItem、ResumeActivityItem等。调用ActivityLifecycleItem.execute方法。
- ActivityLifecycleItem.execute方法中最终调用了ClientTransactionHandler.handleLaunchActivity,而ClientTransactionHandler的真面目就是ActivityThread
- 在AT.handleLaunchActivity中出现了创建activity的核心方法performLaunchActivity
- 在performLaunchActivity中获取了ContextImpl,获取了classloader,通过Instrumentation创建了activity,然后还会检测application是否存在,不存在则新建一个。然后执行activity的attach方法,以及通过instrumentation回调activity的onCreate方法。完成activity的启动。
Activity中的window和view
- 在创建activity的过程中,AT.performLaunchActivity中调用了activity的attach方法。该方法中创建了一个PhoneWindow,然后通过上下文获取了一个WINDOW_SERVICE的系统服务新建了这个phonewindow的WindowManagerImpl,最后又赋值到activity的mWindowManager对象中。mWindowManager负责与WindowManagerService通信。
- 然后再看activity的setContentView方法(注:AppCompatActivity的该方法的内部调用已经交给代理类,和Activity的实现不一致),其中调用了phoneWindow.setContentView方法。
- phoneWindow.setContentView中核心是installDecor(),DecorView是一个FrameLayout,是界面最底层的布局。这一步只是创建了而已,还并没有进行关联
- 在AT.handleResumeActivity方法中进行往WindowManager中添加DecorView,然后调用了activity.makeVisible显示DecorView。
- WindowManager添加DecorView的方法实现在WindowManagerImpl中,其中又调用了WindowManagerGlobal.addView()
- 其中创建了ViewRootImpl对象,负责处理view的各种添加删除等操作。
网友评论