Activity从StartActivity到onResume的过程

此篇文章主要是想讲明白Activity从启动到页面正真显示的调用过程(即调用startActivity---->onResume)

先列出一些我在看源码和博客时存在的疑惑,先在最前面列出来我认为比较难懂概念.

App与AMS通过Binder进行IPC通信,AMS(ActivityManagerService进程)与zygote通过Socket进行IPC通信。
ActivityManagerNative.getDefault返回的就是ActivityManagerService的远程接口,即ActivityManagerProxy

ActivityManagerProxy =>Binder驱动=> ActivityManagerService
class ActivityManagerProxy implements IActivityManager{}
public abstract class ActivityManagerNative extends Binder implements IActivityManager{}
public final class ActivityManagerService extends ActivityManagerNative{}

ApplicationThread <=Binder驱动<= ApplicationThreadProxy
class ApplicationThreadProxy implements IApplicationThread {}
public abstract class ApplicationThreadNative extends Binder implements IApplicationThread{}
private class ApplicationThread extends ApplicationThreadNative {}

ContextImpl.java
		startActivity()
Instrumentation.java
		execStartActivity(ActivityManagerNative.getDefault().startActivity())
					 private static final Singleton<IActivityManager> gDefault 
					 = new Singleton<IActivityManager>() {
						protected IActivityManager create() {
						IBinder b = ServiceManager.getService("activity");
						if (false) {
							Log.v("ActivityManager", "default service binder = " + b);
						}
						IActivityManager am = asInterface(b);
						if (false) {
							Log.v("ActivityManager", "default service = " + am);
						}
						return am;
					}
				};
				static public IActivityManager asInterface(IBinder obj) {
						if (obj == null) {
							return null;
						}
						IActivityManager in =
							(IActivityManager)obj.queryLocalInterface(descriptor);
						if (in != null) {
							return in;
						}	
                    
return new ActivityManagerProxy(obj);
/*这里返回是一个ActivityManagerProxy代理对象,
通过binder将发送到了Service端,即ActivityManagerNative,而ActivityManagerNative的实现类为	ActivityManagerService.所以最终调用的是ActivityManagerService的startActivity方法
即完成了一次binder通信
ActivityManagerProxy =====>Binder驱动=====> ActivityManagerService
*/
				}
ActivityManagerService.java
		startActivity()
		startActivityAsUser()
		
ActivityStackSupervisor.java
		startActivityMayWait()
		startActivityLocked()
		startActivityUncheckedLocked()

ActivityStack.java
		startActivityLocked()
		
ActivityStackSupervisor.java
		resumeTopActivitiesLocked()
		
ActivityStack.java
		resumeTopActivityLocked()
		resumeTopActivityInnerLocked()

ActivityStackSupervisor.java	
		startSpecificActivityLocked()
		{	//判断是否是当前app中的activity
			if (app != null && app.thread != null) {
					realStarActivityLocked();//启动当前应用中的Activity
					return ;
				}
				mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
                "activity", r.intent.getComponent(), false, false, true);
	/*startProcessLocked 方法会通过zyoget去启动一个新的进程,打开另外一个应用的对应Activity
    即通过zygote去启动新的进程,进而打开Activity
    */
        }
	realStarActivityLocked()
	{
		app.thread.scheduleLaunchActivity()
		/*即ApplicationThreadProxy.scheduleLaunchActivity()
		thread的实现类是ApplicationThreadProxy//这里也是binder的客户端,
		紧接着他会发送到ApplicationThreadNative.onTransact方法中
		的case SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION:
		而ApplicationThreadNative的实现类为ApplicationThread.java是一个内部类在					ActivityThread.java中
		ApplicationThread.scheduleLaunchActivity()
		通过Handler.调用handleLaunchActivity
		在这里其实也完成了一次binder通信 即
		ApplicationThread <=====Binder驱动<===== ApplicationThreadProxy
		*/
			
	}

ApplicationThreadProxy.java
		scheduleLaunchActivity()
		
ActivityThread的内部类ApplicationThread extends ApplicationThreadNative.java
		scheduleLaunchActivity()
		sendMessage(H.LAUNCH_ACTIVITY, r)
		handleLaunchActivity()
		performLaunchActivity()
		{		//通过classLoader加载出目标Activity	
				java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
				activity = mInstrumentation.newActivity(
						cl, component.getClassName(), r.intent);
				StrictMode.incrementExpectedActivityCount(activity.getClass());
				r.intent.setExtrasClassLoader(cl);
				r.intent.prepareToEnterProcess();
				if (r.state != null) {
					r.state.setClassLoader(cl);
				}
		//开始回调onCreate()方法
		mInstrumentation.callActivityOnCreate();
					Instrumentation.java
						callActivityOnCreate()
							Activity.java	
								performCreate(icicle, persistentState)
									Activity.java
										onCreate(icicle, persistentState)回调onCreat方法
		//开始回调onStart()方法							
		activity.performStart();				
			Activity.java
				performStart()
					Instrumentation.java
						callActivityOnStart()
							Activity.java
								activity.onStart()回调onStart方法
   		}             

	//回调onResume()方法
	handleResumeActivity()
	{
						performResumeActivity()
                            r.activity.performResume()
								mInstrumentation.callActivityOnResume()
									Instrumentation.java
										callActivityOnResume()
											activity.onResume()
												Activity.java
													onResume()回调onResume方法
        分析下下面代码
          /*	if (r.window == null && !a.mFinished && willBeVisible) {
                r.window = r.activity.getWindow();
                View decor = r.window.getDecorView();
                decor.setVisibility(View.INVISIBLE);//在addview之前decorview是隐藏的
                ViewManager wm = a.getWindowManager();
                WindowManager.LayoutParams l = r.window.getAttributes();
                a.mDecor = decor;
                l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
                l.softInputMode |= forwardBit;
                if (a.mVisibleFromClient) {
                    a.mWindowAdded = true;
                    wm.addView(decor, l);//decorView这里才开始add
                } 
                r.activity.makeVisible();这个方法中才会调用	
          	  mDecor.setVisibility(View.VISIBLE);//decorView才开始设为显示
          */
        //所以当一个Activity的正真显示界面在是onResume方法中,
        //所以要动态的改变控件的大小时,应该在onResume之后,至少是在onResume方法中                    
													
		}								

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值