Android四大组件之Activity(一)—— 启动过程综述

1、使用的是Android 7.1.2的源代码:

https://pan.baidu.com/s/1XcVD68cC_2wKtm8jJkdNQA
przv

2、感谢IT先森的系列博客:

Android应用进程创建流程大揭秘
Android四大组件之bindService源码实现详解
Android四大组件之Activity启动流程源码实现详解概要
Activity启动流程(一)发起端进程请求启动目标Activity
Activity启动流程(二)system_server进程处理启动Activity请求
Activity启动流程(三)-Activity Task调度算法复盘分析
Activity启动流程(四)-Pause前台显示Activity,Resume目标Activity
Activity启动流程(五)请求并创建目标Activity进程
Activity启动流程(六)注册目标Activity进程到system_server进程以及创建目标Activity进程Application
Activity启动流程(七)初始化目标Activity并执行相关生命周期流程

伪代码:

发起端进程发起启动Activity请求
	Activity.startActivity(...)
	  Activity.startActivityForResult(...) //mTocken是Activity中的
	    mInstrumentation.execStartActivity(...)
		  AMP.startActivity(...)//通过AMS代理端向AMS发起启动Activity的Binder IPC请求
		  mInstrumentation.checkStartActivityResult(...)//检测启动是否成功
		mMainThread.sendActivityResult(...)


system_server进程端
AMS解析Intent	  
	AMS.startActivity(...)
	 ActivityStarter.startActivityMayWait(...)
	   ResolveInfo rInfo = ASS.resolveIntent(...)//收集Intent所指向的Activity信息, 当存在多个可供选择的Activity,则直接向用户弹出resolveActivity
	     IPackageManager.Stub.resolveIntent(...)//通过PKMS实体查询
		   PKMS.resolveIntent(...)
			 PKMS.queryIntentActivitiesInternal(...)
			 PKMS.chooseBestActivity(...)
	   ActivityInfo aInfo = ASS.resolveActivity(...) //根据获取的rInfo信息重新组装intent和设置启动的参数信息
	   //创建目的端Activity的ActivityRecord
	   ActivityStarter.startActivityLocked(...)
		  ActivityRecord r = new ActivityRecord(callerApp,intent,aInfo,mSupervisor,...)
			appToken = new Token(this, _intent);
			  设置state为INITIALIZING
		  ActivityStarter.startActivityUnchecked(...) 
           //包括两方面内容:
           //1、AMS对于Activity比较复杂的部分即Task任务栈和Stack的处理,其中会把目标Activity放置到栈顶端
           //2、resumed相关操作 
           // 目标Activity所属Stack栈存在Resume状态的Activity时会执行其onPause方法,否则执行的就是其它Stack栈中的了
           // 错误说法:启动一个Activity的时候最先被执行的是栈顶的Activity的onPause方法       
    		ActivityStackSupervisor.resumeFocusedStackTopActivityLocked
    			ActivityStack.resumeTopActivityUncheckedLocked
    				ActivityStack.resumeTopActivityInnerLocked
    					ActivityStack.startPausingLocked
    						ApplicationThreadProxy.schedulePauseActivity
          
	               
发起端进程处理schedulePauseActivity
   ActivityThread.ApplicationThread.schedulePauseActivity
        ActivityThread.H.handleMessage(case PAUSE_ACTIVITY)
             ActivityThread.handlePauseActivity //1.指定前台Activity的onPause();2.通过AMP回调activityPaused()通知AMS
             	ActivityThread.performPauseActivity
              		ActivityThread.performPauseActivityIfNeeded
              			Instrumentation.callActivityOnPause
              				Activity.performPause
              					Activity.onPause()
                ActivityManagerNative.getDefault().activityPaused(token);


system_server进程端
    AMS.activityPaused
    	ActivityStack.activityPausedLocked
    		ActivityStack.completePauseLocked
    			ActivityStackSupervisor.resumeFocusedStackTopActivityLocked  //又调用了resumeFocusedStackTopActivityLocked
    				ActivityStack.resumeTopActivityUncheckedLocked
    					ActivityStack.resumeTopActivityInnerLocked
    						ActivityStackSupervisor.startSpecificActivityLocked
    							AMS.startProcessLocked
    								AMS.startProcessLocked
    									AMS.newProcessRecordLocked
    										addProcessNameLocked(r);//将ProcessRecord信息在AMS中存储起来
    									AMS.startProcessLocked
                                     		//final String entryPoint = "android.app.ActivityThread";
                                   	 		Process.start(entryPoint, ··· ···)
                                       		Process.startViaZygote()	
                                       	 		Process.zygot
                                            eSendArgsAndGetResult(openZygoteSocketIfNeeded(
                                       abi), argsForZygote);


//======Zygote进程======    
ZygoteInit.main
    //1
    ZygoteInit.registerZygoteSocket  //创建zygote通信服务端,LocalServerSocket实例对象sServerSocket
    //2
    ZygoteInit.runSelectLoop  //进入无限死循环,等待客户端的请求;会抛出MethodAndArgsCaller异常
    	Os.poll
    	ZygoteInit.acceptCommandPeer //创建ZygoteConnection对象,即创建Socket通道ZygoteConnection
    		ZygoteConnection.ZygoteConnection
    	ZygoteConnection.runOnce
    		Zygote.forkAndSpecialize
                    ZygoteHooks.preFork
                        Daemons.stop
                        ZygoteHooks.nativePreFork
                            dalvik_system_ZygoteHooks.ZygoteHooks_nativePreFork
                                Runtime::PreZygoteFork
                                    heap_->PreZygoteFork()
                    Zygote.nativeForkAndSpecialize
                        com_android_internal_os_Zygote.ForkAndSpecializeCommon
                            fork()
                            Zygote.callPostForkChildHooks
                                ZygoteHooks.postForkChild
                                    dalvik_system_ZygoteHooks.nativePostForkChild
                                        Runtime::DidForkFromZygote
                    ZygoteHooks.postForkCommon
                        Daemons.start
                                            
	//======子进程======                                        
             ZygoteConnection.handleChildProc
                    RuntimeInit.zygoteInit
                        RuntimeInit.commonInit
                        RuntimeInit.nativeZygoteInit
                        RuntimeInit.applicationInit
                            RuntimeInit.invokeStaticMain  //抛出异常:MethodAndArgsCaller 
    MethodAndArgsCaller.run() //runSelectLoop中抛出异常
    	ActivityThread.main                                        
                                            
    //3		
    ZygoteInit.closeServerSocket //关闭通信socket通信通道 


//新建的子进程
ZygoteConnection.handleChildProc
    Activity.main()  //反射调用
    	Looper.prepareMainLooper();
    	ActivityThread thread = new ActivityThread();
			final ApplicationThread mAppThread = new ApplicationThread();
			final H mH = new H();
		thread.attach(false);
			RuntimeInit.setApplicationObject(mAppThread.asBinder())
			AMN.getDefault().attachApplication(mAppThread) //mAppThread为匿名Binder
		Looper.loop();


//system_server进程
AMS.attachApplication(ApplicationThread thread)
	thread.bindApplication  //向目标Activity进程发起跨进程Binder调用,将进程名、ApplicationInfo等相关信息传递给应用进程
	ActivityStackSupervisor.attachApplicationLocked(ProcessRecord app)  //检查有没有待启动的Activity
		app.thread.scheduleLaunchActivity  
		··· ···

//新建的子进程
ActivityThread.ApplicationThread.scheduleLaunchActivity
	sendMessage(H.LAUNCH_ACTIVITY, r) 
	ActivityThread.H.handleMessage
		ActivityThread.handleLaunchActivity
			Activity a = performLaunchActivity
				mInstrumentation.callActivityOnCreate
					Activity.performCreate
						Activity.onCreate()
				Activity.performStart
					mInstrumentation.callActivityOnStart
						Activity.onStart	
			ActivityThread.handleResumeActivity
				performResumeActivity
					Activity.performResume
						mInstrumentation.callActivityOnResume
							Activity.onResume	

在这里插入图片描述
流程图(visio):
链接:https://pan.baidu.com/s/1Q42yd7Hkj53403NQNP3kIA
提取码:kwca

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值