Android Activity启动上层、底层简单总结

Activity.startActivityForResult中Instrumentation.execStartActivity

调用AMS.startActivity

会调用到Activity.resumeTopActivityUncheckedLocked

会调用到ASS.startSpecificActivityLocked

会调用到ASS.realStartActivityLocked中的关键代码

app.thread.scheduleLaunchActivity(newIntent(r.intent), r.appToken,

       System.identityHashCode(r), r.info,

       // TODO: Have this take the merged configuration instead of separateglobal and

       // override configs.

       mergedConfiguration.getGlobalConfiguration(),

       mergedConfiguration.getOverrideConfiguration(), r.compat,

       r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,

       r.persistentState, results, newIntents, !andResume,

       mService.isNextTransitionForward(), profilerInfo);

 

app.thread的实现者是ApplicationThread

发送H.LAUNCH_ACTIVITY,record

消息处理中会调用到handleLaunchActivity,如下

Activity a = performLaunchActivity(r,customIntent);

   if (a != null) {

       r.createdConfig = new Configuration(mConfiguration);

       reportSizeConfigurations(r);

       Bundle oldState = r.state;

       handleResumeActivity(r.token, false, r.isForward,

 

performLaunchActivity完成了5件事

1. ActivityClientRecord中获取Activity信息

2. Instrumentation.newActivity使用类加载器创建Activity

3.Loadapk.makeApplication中通过Instrumentation创建Application对象并onCreate

4.创建ContextImpl对象并通过Activity.attach进行重要数据初始化,建立关联,还创建Window也建立关联。

5. Instrumentation调用onCreate

 

底层


总结:

1.运行在调用者所在进程,如果是从桌面进入,那么调用者进程就是launcher,launcher利用ActivityManagerProxy作为Binder client,进入system_server进程(AMS所在进程)。

2.会调用到resolveActivity(),借助PackageManager来查询系统中所有符合要求的Activity,当存在多个满足条件的Activity,会弹窗,让用户来选择。

3.创建ActivityRecord对象,并检查是否需要App切换,然后再处理mPendingActivityLaunches中的Activity。

4.为Activity找到或者创建新的Task对象,设置flags信息。

5.当没有处于非finishing状态的Activity,直接回到桌面;否则,当mResumedActivity不为空时,则暂停该Activity

6.如果进程不存在,需要创建进程。

7.system_server进程利用ATP(Binder client),通过Binder,进入目标进程

8.运行在目标进程,通过Handler,该进程中的Binder线程向主线程发送H.LAUNCH_ACTIVITY,最终通过反射创建Activity,进入生命周期。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值