Android框架源码(API 26之前) 之启动Activity流程简单描述

启动Activity有情况,从系统应用界面点击进入和在应用内部启动新Actvity

前者调用Launcher类的startActivitySafely方法,Launcher类继承Activity类,startActivitySafely方法中调用Activity类实现的startActivity方法。

后者就直接调用Activity类实现的startActivity方法。

startActivity实现很简单,它调用startActivityForResult来进一步处理。

在startActivityForResult中调用Intrumentation的execStartActivity方法,其中mInstrumentation对象为Activity的成员变量,Instrumentation(直译过来意思是仪器仪表),主要作用是用来监控应用程序和系统的交互。

在execStartActivity中通过ActivityManagerNative.getDefault()获取ActivityManagerService的远程接口ActivityManagerProxy(注意:API 26之后更新了),调用ActivityManagerProxy接口的startActivity方法。

ActivityManagerProxy的startActivity通过Binder驱动程序就进入到ActivityManagerServicestartActivity函数

ActivityManagerService的startActivity中简单地将操作转发给成员变量mMainStack的startActivityMayWait函数,这里的mMainStack的类型为ActivityStack

在startActivityMayWait中调用ActivityStack的startActivityLocked方法进一步处理。

在startActivityLocked中,通过参数caller获取调用者的进程信息,并保存在ProcessRecord类型的callerApp变量中。并通过参数resultTo获得这个Activity的相关信息保存在ActivityRecord类型的sourceRecord变量中,resultTo参数一开始是Activity类的成员变量mToken传入的,它是一个Binder对象的远程接口。然后将即将要启动的Activity的相关信息,并保存在ActivityRecord类型的r变量中。最后调用ActivityStack的startActivityUncheckedLocked函数进行下一步操作。

startActivityUncheckedLocked方法做了很多我们熟悉的工作。其中有判断Activity的启动模式,判断Activity是否在栈顶,判断是否要新创建一个Task等等工作,如果新增了Task就调用mService.addRecentTaskLocked(r.task),即在ActivityManagerService中新增Task,最后调用ActivityStack的startActivityLocked(r, newTask, doResume)进一步处理。

startActivityLocked(r, newTask, doResume)中将即将启动的Activity信息ActivityRecord r添加到ActivityStack的成员变量mHistory制定位置addPos,doResume参数为true,进而调用ActivityStack的resumeTopActivityLocked进一步操作。

resumeTopActivityLocked中如果mResumedActivity(当前正被执行的Activity)不为空,调用 ActivityStack的startPausingLocked把当前执行的Activity推入Paused状态去。

startPausingLocked方法对ActivityStack的几个成员变量进行重新赋值,将mResumedActivity当前Activity赋值给mPausingActivitymLastPausedActivity,再将其置空,将当前Activity的状态设为ActivityState.PAUSING,最后调用

prev.app.thread.schedulePauseActivity(prev, prev.finishing, userLeaving, prev.configChangeFlags)

把当前Activity进程中的ApplicationThread对象取出来,通过它来通知这个Activity它要进入Paused状态了。这里的prev.app.thread是一个ApplicationThread对象的远程接口ApplicationThreadProxy,通过调用这个远程接口的schedulePauseActivity来通知当前Activity进入Paused状态。

ApplicationThreadProxy的schedulePauseActivity通过Binder进程间通信机制进入到ApplicationThread.schedulePauseActivity函数中。

ApplicationThread是ActivityThread的内部类,schedulePauseActivity方法中调用ActivityThread的成员函数queueOrSendMessage。

queueOrSendMessage将执行任务标记(H.PAUSE_ACTIVITY_FINISHING或H.PAUSE_ACTIVITY)以及被执行的Activity的IBinder对象等信息封装到Message对象,通过ActivityThread的成员变量mH(类型是H,继承于Handler类,是ActivityThread的内部类)发送此消息。

发送完消息在H的handleMessage接收,如果是PAUSE_ACTIVITY,则调用ActivityThread的handlePauseActivity方法处理。

handlePauseActivity方法先判断userLeaving是否为true,如果为true,调用performUserLeavingActivity方法,在Activity中的onUserLeaveHint中回调,通知是用户要离开当前Activity。然后调用performPauseActivity,在Activity的onPause中回调,performPauseActivity方法返回Bundle类型的state对象。最后调用ActivityManagerNative.getDefault().activityPaused(token, state)来告诉ActivityManagerService当前Activity已经进入Paused状态,可以启动新Activity了。

ActivityManagerProxy的activityPaused通过Binder进程间通信机制就进入到ActivityManagerService.activityPaused方法。

ActivityManagerService的activityPaused中用mMainStack调用activityPaused再次进入到ActivityStack类中,执行activityPaused方法。

ActivityStack的activityPaused中先通过参数token找到在mHistory列表中对应的ActivityRecord类型的r,如果r与ActivityStack的成员变量mPausingActivity指向用一个Activity执行completePauseLocked方法。

ActivityStack的completePauseLocked将mPausingActivity置为空,然后调用resumeTopActivityLokced进一步操作,resumeTopActivityLokced传入的参数即为当前Pause的Activity的ActivityRecord对象。

ActivityStack的resumeTopActivityLokced先通过topRunningActivityLocked获取即将启动的Activity的ActivityRecord保存在next,满足一定条件后调用startSpecificActivityLocked(next, true, true)。

ActivityStack的startSpecificActivityLocked使用mServicegetProcessRecordLocked获取ProcessRecord保存于app,判断app是否为空,不为空则调用ActivityStack的realStartActivityLocked。如果app为空,需要启动新的进程,则用mService(ActivityManagerService调用startProcessLocked。

ActivityManagerService的startProcessLocked再次判断是否已经有以process + uid命名的进程存在,如何为空,则创建并保存到ActivityManagerService中ProcessRecord类型的成员变量mProcessNames中,最后,调用另一个startProcessLocked函数进一步操作。

ActivityManagerService的startProcessLocked主要调用了Process.start方法来创建一个新的进程,新的进程会导入android.app.ActivityThread类,并且执行它的main函数。每一个应用程序都有一个ActivityThread实例来对应。

在ActivityThread的main函数中创建ActivityThread对象,调用它的attach方法,接着就进入消息循环了,直到最后进程退出。attach方法通过ActivityManagerNative.getDefault()调用了ActivityManagerService的远程接口ActivityManagerProxy的attachApplication函数,传入的参数是mAppThread,这是一个ApplicationThread类型的Binder对象,它的作用是用来进行进程间通信的。

ActivityManagerProxy的attachApplication中通过Binder驱动程序,最后进入ActivityManagerService的attachApplication函数中。

ActivityManagerService的attachApplication将操作转发给attachApplicationLocked方法。

ActivityManagerService的attachApplicationLocked取回已经创建的ProcessRecord存入app变量并初始化其他app的成员变量,然后调用mMainStack.topRunningActivityLocked(null)从栈顶取回即将启动的Activity存入hr,最后调用mMainStack.realStartActivityLocked执行真正的Activity启动操作,hr和app作为参数传入realStartActivityLocked方法。

ActivityStack的realStartActivityLocked最终通过app.thread调用ApplicationThreadProxyscheduleLaunchActivity方法。

ApplicationThreadProxy的scheduleLaunchActivity最终通过Binder驱动程序进入到ApplicationThreadscheduleLaunchActivity函数中。

ApplicationThread的scheduleLaunchActivity中先创建一个ActivityClientRecord对象r,初始化r的成员变量,调用queueOrSendMessage(H.LAUNCH_ACTIVITY, r)。

ApplicationThread的queueOrSendMessage将执行任务标记(H.LAUNCH_ACTIVITY)以及被执行的Activity的ActivityClientRecord对象等信息封装到Message对象,通过ActivityThread的成员变量mH发送此消息。

在H类handleMessage中接收消息,在case LAUNCH_ACTIVITY下调用handleLaunchActivity处理即将启动的Activity。

ActivityThread的handleLaunchActivity首先调用performLaunchActivity来加载即将启动的Activity类,然后调用它的onCreate方法,完成后回到handleLaunchActivity再调用handleResumeActivity进入Activity的onResume方法,遵循Activity的生命周期的。

ActivityThread的performLaunchActivity首先收集要启动的Activity的主要packagecomponent信息,调用mInstrumentation.newActivity通过ClassLoader加载Activity类,然后调用makeApplication创建Application对象,通过activity.attach方法将这些上下文信息设置到启动Activity中去,调用mInstrumentation.callActivityOnCreate间接调用启动Activity的onCreate方法,mInstrumentation在这里的作用是监控Activity与系统的交互操作,相当于是系统运行日志。

到此为止Activity已经完成启动!

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值