Android Activity相关的一些点

记录给健忘的自己

生命周期

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的各种添加删除等操作。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容