activity 创建到显示过程源码分析

Activity生命周期

activity在Android系统中代表的就是一个屏幕,一个App就是由许多个不同的Acitivty组成的,并且不同进程之间的Activity是可以相互调用的。

  • protected void onCreate(Bundle savedInstanceState);
  • protected void onRestart();
  • protected void onStart();
  • protected void onResume();
  • protected void onPause();
  • protected void onStop();
  • protected void onDestory();
    以上为Activity生命周期中的各个时期的回调方法,在不同的方法中我们可以执行不同的逻辑。

Activity如何创建

Activity的创建都在对应应用程序进程ActivityThread类中完成。Activity类的创建完成之后会调用Activity#attach方法

当需要创建一个activity时候,ActivityThread的H类(一个handler)会收到一个LAUNCH_ACTIVITY的消息

 public void handleMessage(Message msg) {
            if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
            switch (msg.what) {
                case LAUNCH_ACTIVITY: {
                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
                    final ActivityClientRecord r = (ActivityClientRecord) msg.obj;

                    r.packageInfo = getPackageInfoNoCheck(
                            r.activityInfo.applicationInfo, r.compatInfo);
                    // activity 真正的创建
                    handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
                } break;
    ... //省略后面的代码
  }

上面的handleMessage是ActivityThread的H类里面的方法,处理发送过来的各种handler消息。上面截取的代码是收到一个LAUNCH_ACTIVITY的message,执行handleLaunchActivity。

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
        // 调用performLaunchActivity获得一个Activity 
        Activity a = performLaunchActivity(r, customIntent);

        if (a != null) {
            r.createdConfig = new Configuration(mConfiguration);
            Bundle oldState = r.state;
        //调用Activity 的Resume
            handleResumeActivity(r.token, false, r.isForward,
                    !r.activity.mFinished && !r.startsNotResumed);


        }
        ...
    }

上面的通过performLaunchActivity获取到一个activity,并调用了handleResumeActivity。再去进去performLaunchActivity看看。

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
        ...

Activity activity = null;
        try {
            java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
//通过反射获取一个activity 
            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);
            }
        } catch (Exception e) {
            if (!mInstrumentation.onException(activity, e)) {
                throw new RuntimeException(
                    "Unable to instantiate activity " + component
                    + ": " + e.toString(), e);
            }
        }
        ...

        activity.mCalled = false;
        if (r.isPersistable()) {
// 调用activity的OnCreate方法
           mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
        } else {
           mInstrumentation.callActivityOnCreate(activity, r.state);
        }
        ...
        if (!r.activity.mFinished) {
// 调用activity的OnStart方法
                    activity.performStart();
                    r.stopped = false;
                }
        ...
        return activity;
    }

可以发现这里我们需要的Activity对象终于是创建出来了,而且他是以反射的机制创建的,然后在代码中其调用Instrumentation的callActivityOnCreate方法。

一 几个类功能说明

ActivityThread

思考:

  • ActivityThread结构是什么样的,里面有那重要的属性,方法,内部类?
  • ActivityThread主要功能是做什么?
  • ActivityThread里面重要方法说明

ApplicationThread

ApplicationThread类结构.png
  • 继承结构
ApplicationThreadNative 类结构.png

远程代理ApplicationThreadProxy


ApplicationThreadProxy类结构.png

ApplicationThread 继承 ApplicationThreadNative 继承 Binder
继承binder接口的一个类和AMS远程通信的类

  • 做什么功能

  • ApplicationThread 、ApplicationThreadNative、ApplicationThreadProxy之间调用联系方式

  • 主要属性方法

H类

ActivityManagerNative

ActivityManagerService

ActivityManagerProxy

ActivityClientRecord

Activity类

Instrumentation

Window

PhoneWindow

WindowManager

WindowManagerImp

WindowManagerGlobal

ViewManager

ViewRootImp

DecorView

Inflater LayoutInflater

你可能感兴趣的:(activity 创建到显示过程源码分析)