此篇文章主要是想讲明白Activity从启动到页面正真显示的调用过程(即调用startActivity---->onResume)
先列出一些我在看源码和博客时存在的疑惑,先在最前面列出来我认为比较难懂概念.
App与AMS通过Binder进行IPC通信,AMS(SystemServer进程)与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 {}
```java
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
*/
}
```
```java
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
*/
}
```
```java
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方法
}
```
```java
//回调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方法中
}
```