美文网首页
Android Activity相关的一些点

Android Activity相关的一些点

作者: 三月三儿三 | 来源:发表于2020-04-20 00:58 被阅读0次

    记录给健忘的自己

    生命周期

    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,可能和一些较老的文章有内容上的出入,主要是源码方面以被修改,但大致流程不会发生改变
    参考地址,记录防丢

    1. 调用startActivity最终的实现是Activity类的startActivityForResult,其中调用了instrumentation.execStartActivity方法。
    2. execStartActivity方法中又会调用AMS.startActivity方法
    3. AMS.startActivty方法中又直接调用了startActivityAsUser,这里需要注意ActivityStartController的返回了一个ActivityStarter对象,具体逻辑在ActivityStarter的execute方法中,然后就是startActivityMayWait方法。
    4. 之后有好几个同名的startActivity方法,涉及处理intent信息、权限检查等
    5. 一连串startActivity之后会调用startActivityUnchecked,此处有处理启动模式,然后跟进ActivityStackSupervisor.resumeFocusedStackTopActivityLocked方法,这里就涉及栈的调整。
    6. 再进一步有ActivityStack.resumeTopActivityUncheckedLocked->ActivityStack.resumeTopActivityInnerLocked->ActivityStackSupervisor.startSpecificActivityLocked
    7. startSpecificActivityLocked中会判断activity的application是否在运行。然后进入realStartActivityLocked方法
    8. 最后会通过ClientTransaction对象调用AT.scheduleTransaction方法(Android9之后ClientTransaction接管了activity生命周期分配),至此,AMS的行为已经结束,逻辑回到了AT
    9. scheduleTransaction方法发送了一个EXECUTE_TRANSACTION的消息
    10. AT中的类H会处理收到的消息,会调用TransactionExecutor.execute,钻进去核心是executeLifecycleState,其中的ActivityLifecycleItem是抽象类,具体的实现有LaunchActivityItem、ResumeActivityItem等。调用ActivityLifecycleItem.execute方法。
    11. ActivityLifecycleItem.execute方法中最终调用了ClientTransactionHandler.handleLaunchActivity,而ClientTransactionHandler的真面目就是ActivityThread
    12. 在AT.handleLaunchActivity中出现了创建activity的核心方法performLaunchActivity
    13. 在performLaunchActivity中获取了ContextImpl,获取了classloader,通过Instrumentation创建了activity,然后还会检测application是否存在,不存在则新建一个。然后执行activity的attach方法,以及通过instrumentation回调activity的onCreate方法。完成activity的启动。

    Activity中的window和view

    参考地址,记录防丢

    1. 在创建activity的过程中,AT.performLaunchActivity中调用了activity的attach方法。该方法中创建了一个PhoneWindow,然后通过上下文获取了一个WINDOW_SERVICE的系统服务新建了这个phonewindow的WindowManagerImpl,最后又赋值到activity的mWindowManager对象中。mWindowManager负责与WindowManagerService通信。
    2. 然后再看activity的setContentView方法(注:AppCompatActivity的该方法的内部调用已经交给代理类,和Activity的实现不一致),其中调用了phoneWindow.setContentView方法。
    3. phoneWindow.setContentView中核心是installDecor(),DecorView是一个FrameLayout,是界面最底层的布局。这一步只是创建了而已,还并没有进行关联
    4. 在AT.handleResumeActivity方法中进行往WindowManager中添加DecorView,然后调用了activity.makeVisible显示DecorView。
    5. WindowManager添加DecorView的方法实现在WindowManagerImpl中,其中又调用了WindowManagerGlobal.addView()
    6. 其中创建了ViewRootImpl对象,负责处理view的各种添加删除等操作。

    相关文章

      网友评论

          本文标题:Android Activity相关的一些点

          本文链接:https://www.haomeiwen.com/subject/qvlovhtx.html