Android Activity startActivity流程简介

本文详细介绍了Android Activity的启动流程,包括Instrumentation的作用,ActivityManagerService如何管理Activity,以及ActivityStack的功能。还提及了Android应用程序从Launcher启动的过程,强调了在启动MainActivity时新进程的创建。同时,文章讨论了ProcessRecord和IApplicationThread接口在AMS与Application之间的交互作用。
摘要由CSDN通过智能技术生成

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

1. 基本概念

1.1 Instrumentation是什么?

      顾名思义,仪器仪表,用于在应用程序中进行“测量”和“管理”工作。一个应用程序中只有一个Instrumentation实例对象,且每个Activity都有此对象的引用。Instrumentation将在任何应用程序运行前初始化,可以通过它监测系统与应用程序之间的所有交互,即类似于在系统与应用程序之间安装了个“窃听器”。

      当ActivityThread 创建(callActivityOnCreate)、暂停、恢复某个Activity时,通过调用此对象的方法来实现,如:

         1) 创建: callActivityOnCreate 

         2) 暂停: callActivityOnPause

         3) 恢复: callActivityOnResume

     Instrumentation和ActivityThread的关系,类似于老板与经理的关系,老板负责对外交流(如与Activity Manager Service<AMS>),Instrumentation负责管理并完成老板交待的任务。

     它通过以下两个成员变量来对当前应用进程中的Activity进行管理:

    private List<ActivityWaiter> mWaitingActivities;    private List<ActivityMonitor> mActivityMonitors;

    其功能函数下表所示:

功能 函数
增加删除Monitor addMonitor(ActivityMonitor monitor)
removeMonitor(ActivityMonitor monitor)
Application与Activity生命周期控制 newApplication(Class<?> clazz, Context context)
newActivity(ClassLoader cl, String className,Intent intent)
callActivityOnCreate(Activity activity, Bundle icicle)
callActivityOnDestroy(Activity activity)
callActivityOnStart(Activity activity)
callActivityOnRestart(Activity activity)
callActivityOnResume(Activity activity)
callActivityOnStop(Activity activity)
callActivityOnPause(Activity activity)
Instrumentation生命周期控制 onCreate(Bundle arguments)
start()
onStart()
finish(int resultCode, Bundle results)
onDestroy()
发送用户操控信息到当前窗口 sendCharacterSync(int keyCode)
sendPointerSync(MotionEvent event)
sendTrackballEventSync(MotionEvent event)
sendTrackballEventSync(MotionEvent event)
同步操作 startActivitySync(Intent intent) //它调用Context.startActivity
runOnMainSync(Runnable runner)
waitForIdle()


2. Android应用程序启动过程(MainActivity)

     即MainActivity的启动过程,在此过程中,将创建一个新的进程来执行此MainActivity。

     Android应用程序从Launcher启动流程如下所示:

/***************************************************************** * Launcher通过Binder告诉ActivityManagerService, * 它将要启动一个新的Activity; ****************************************************************/Launcher.startActivitySafely->  Launcher.startActivity->   //要求在新的Task中启动此Activity   //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)   Activity.startActivity->   Activity.startActivityForResult->   Instrumentation.execStartActivity->    // ActivityManagerNative.getDefault()返回AMS Proxy接口    ActivityManagerNative.getDefault().startActivity->    ActivityManagerProxy.startActivity->       ActivityManagerService.startActivity-> (AMS)     ActivityManagerService.startActivityAsUser->         ActivityStack.startActivityMayWait->      ActivityStack.resolveActivity(获取ActivityInfo)        //aInfo.name为main Activity,如:com.my.test.MainActivity        //aInfo.applicationInfo.packageName为包名,如com.my.test      ActivityStack.startActivityLocked->        //ProcessRecord callerApp; 调用者即Launcher信息        //ActivityRecord sourceRecord; Launcher Activity相关信息        //ActivityRecord r=new ActivityRecord(...),将要创建的Activity相关信息        ActivityStack.startActivityUncheckedLocked->       //Activity启动方式:ActivityInfo.LAUNCH_MULTIPLE/LAUNCH_SINGLE_INSTANCE/       //             ActivityInfo.LAUNCH_SINGLE_TASK/LAUNCH_SINGLE_TOP)       // 创建一个新的task,即TaskRecord,并保存在ActivityRecord.task中       //r.setTask(new TaskRecord(mService.mCurTask, r.info, intent), null, true)       // 把新创建的Activity放在栈顶          ActivityStack.startActivityLocked->       ActivityStack.resumeTopActivityLocked->       ActivityStack.startPausingLocked (使Launcher进入Paused状态)->         /*****************************************************************      * AMS通过Binder通知Launcher进入Paused状态      ****************************************************************/      ApplicationThreadProxy.schedulePauseActivity->         //private class ApplicationThread extends ApplicationThreadNative        ApplicationThread.schedulePauseActivity->           ActivityThread.queueOrSendMessage->            // 调用Activity.onUserLeaveHint         // 调用Activity.onPause         // 通知activity manager我进入了pause状态         ActivityThread.handlePauseActivity->         /*****************************************************************        * Launcher通过Binder告诉AMS,它已经进入Paused状态        ****************************************************************/       ActivityManagerProxy.activityPaused->         ActivityManagerService.activityPaused->         ActivityStack.activityPaused->(把Activity状态修改为PAUSED)         ActivityStack.completePauseLocked->             // 参数为代表Launcher这个Activity的ActivityRecord         // 使用栈顶的Activity进入RESUME状态         ActivityStack.resumeTopActivityLokced->           //topRunningActivityLocked将刚创建的放于栈顶的activity取回来           // 即在ActivityStack.startActivityUncheckedLocked中创建的         /*****************************************************************        * AMS创建一个新的进程,用来启动一个ActivityThread实例,        * 即将要启动的Activity就是在这个ActivityThread实例中运行        ****************************************************************/       ActivityStack.startSpecificActivityLocked->            // 创建对应的ProcessRecord          ActivityManagerService.startProcessLocked->                     // 启动一个新的进程           // 新的进程会导入android.app.ActivityThread类,并且执行它的main函数,           // 即实例化ActivityThread, 每个应用有且仅有一个ActivityThread实例           Process.start("android.app.ActivityThread",...)->           // 通过zygote机制创建一个新的进程           Process.startViaZygote->               // 这个函数在进程中创建一个ActivityThread实例,然后调用           // 它的attach函数,接着就进入消息循环           ActivityThread.main->           /*****************************************************************          * ActivityThread通过Binder将一个ApplicationThread类的Binder对象          * 传递给AMS,以便AMS通过此Binder对象来控制Activity整个生命周期          ****************************************************************/         ActivityThread.attach->           IActivityManager.attachApplication(mAppThread)->           ActivityManagerProxy.attachApplication->           ActivityManagerService.attachApplication->             // 把在ActivityManagerService.startProcessLocked中创建的ProcessRecord取出来           ActivityManagerService.attachApplicationLocked->           /*****************************************************************          * AMS通过Binder通知ActivityThread一切准备OK,它可以真正启动新的Activity了          ****************************************************************/                     // 真正启动Activity           ActivityStack.realStartActivityLocked->           ApplicationThreadProxy.scheduleLaunchActivity->           ApplicationThread.scheduleLaunchActivity->           ActivityThread.handleLaunchActivity->             // 加载新的Activity类,并执行它的onCreate             ActivityThread.performLaunchActivity              /*1) Instrumentation.newActivity: 加载新类,即创建Activity对象;               2) ActivityClientRecord.packageInfo.makeApplication:创建Application对象;                  <LoadedApk.makeApplication>               3) Activity.attach(Context context, ActivityThread aThread,                     Instrumentation instr, IBinder token, int ident,                     Application application, Intent intent, ActivityInfo info,                     CharSequence title, Activity parent, String id,                     NonConfigurationInstances lastNonConfigurationInstances,                     Configuration config):把Application attach到Activity, 即把Activtiy                                            相关信息设置到新创建的Activity中               4) Instrumentation.callActivityOnCreate:调用onCreate;*/                 // 使用Activity进入RESUMED状态,并调用onResume             ActivityThread.handleResumeActivity  


3. ActivityManagerService

3.1 类中关键信息

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值