美文网首页Android系统方面那些事
Activity从StartActivity到onResume的

Activity从StartActivity到onResume的

作者: javac | 来源:发表于2019-08-18 23:10 被阅读1次

    此篇文章主要是想讲明白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方法中                   

    }

    ```

    相关文章

      网友评论

        本文标题:Activity从StartActivity到onResume的

        本文链接:https://www.haomeiwen.com/subject/qvhqlqtx.html