Activity:启动流程

版本:27.1.1

  1. Activity:启动流程
  2. Activity:xml如何通过加载到UI界面

流程图

本文只做一个主线的分析。
先上activity启动的流程总图,分两大块分析:

  1. 程序启动做了哪些事情?
  2. Activity加载以及完成它的声明周期

Activity:启动流程_第1张图片

程序的启动

相关类 ActivityThrea、ActivityManager的主线流程图

结合下面的源码分析一起看理解效果更佳哦!
Activity:启动流程_第2张图片

源码分析

有看过源码的android 朋友都应该熟悉,ActivityThread中的main方法是启动点。下面看下main方法里究竟做了什么?

  1. main()

    public static void main(String[] args) {
       // ....省略N行代码

		// 得到ActivityThread实例如并调用 attach方法
        ActivityThread thread = new ActivityThread();
        thread.attach(false);

        // ....省略N行代码
    }

  1. attach()
private void attach(boolean system) {
        sCurrentActivityThread = this;
        mSystemThread = system;
        if (!system) {// true代表系统,false:应用
            // ....省略N行代码

			// 获取了 IActivityManager管理类   getService()请看  分析->getService()
            final IActivityManager mgr = ActivityManager.getService();
            try {
            // 关联ApplicationThread    分析->ApplicationThread
                mgr.attachApplication(mAppThread);
            } catch (RemoteException ex) {
                throw ex.rethrowFromSystemServer();
            }
            // ....省略N行代码
        } else {
        // ....省略N行代码
        }
    }


   // 分析->ApplicationThread
    // 初始化ApplicationThread,存放activity的信息,以及提供一些有关activity声明周期的方法
ApplicationThread mAppThread = new ApplicationThread() 
// 这里不带贴具体源码,会在activity加载以及完成生命周期的分析中贴出



// 分析->getService()
 /**
     * @hide
     */
    public static IActivityManager getService() {
        return IActivityManagerSingleton.get();
    }

    private static final Singleton<IActivityManager> IActivityManagerSingleton =
            new Singleton<IActivityManager>() {
                @Override
                protected IActivityManager create() {
                //  获取binder对象。可以看出使用了binder通信机制
                    final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                    // 根据binder找到IActivityManager。结合上一行代码可以看出ActivityManager是用系由统服务调用管理的
                    final IActivityManager am = IActivityManager.Stub.asInterface(b);
                    return am;
                }
            };

小结: 通过以上源码可以确定,源码中用到了binder通信机制,由此可知ActivityManager管理类是由系统服务调用管理。这里我们可以知道Activity是跨进程访问的

最后会通过 mgr.attachApplication(mAppThread)关联ApplicationThread

到这里主要的启动已经完成,我们需要去关注ApplicationThread做了什么?
请看下面分析!

Activity加载以及完成它的声明周期

流程图

相关类:ActivityThread内部类(ApplicationThread 、H)、Instrumentation、Activity

  1. ApplicationThred提供Acivity的信息、启动方法、发送消息
  2. H负责处理与activity相关启动方法、相关生命周期的完成方法
  3. Instrumentation负责回调callActivityOnCreate() -> Activity的performCreate()->onCreat()方法
    请结合下图和对应的源码分析
    Activity:启动流程_第3张图片

源码分析

  1. ApplicationThread
    源码很多有关生命周期的方法,这里只贴出一个启动activity的方法
    private class ApplicationThread extends IApplicationThread.Stub {
      
     // ....省略N行代码
     //  启动Activity的方法
        @Override
        public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
                ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
                CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
                int procState, Bundle state, PersistableBundle persistentState,
                List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
                boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) {

           // ....省略N行代码
			// 发送启动activity消息
            sendMessage(H.LAUNCH_ACTIVITY, r);
        }
     // ....省略N行代码
      
    }

由启动方法的流程可知:
当Activity状态发生变化时,会调用到这里,有这里发送Message消息进行通知状态的的更新。
2. H
Activity:启动流程_第4张图片
小结:由上面源码可以看出,这里启动Activity是利用Handler通信机制完成

分析->handleLaunchActivity()

 private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {
      	// ...省略N行代码
        Activity a = performLaunchActivity(r, customIntent);
           // ...省略N行代码
       
    }

分析->performLaunchActivity()
相信看到这里就可以知道整个activity的启动流程了


private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
      // ...省略N行代码
                activity.mCalled = false;
                
                if (r.isPersistable()) {
                
                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
                } else {
                    mInstrumentation.callActivityOnCreate(activity, r.state);
                }
              // ...省略N行代码
        return activity;
    }

后面就不再分析贴源码了,后面的流程:callActivityOnCreate() -> activity.performCreate() -> onCreate();

总结

分析过程中的核心点:

  1. activity启动使用了Binder通信机制
  2. 启动时以及activity的状态发生变化时使用了handler消息机制

整体流程核心步骤:

  1. 在ActivityThread的main方法里,new出ActivityThread实例,然后调用attach去获取IActivityManager管理类,然后调用attachApplication实现IActivityManager与ApplicationThread的绑定
  2. IActivityManager的获取:通过 ServiceManager.getService(Context.ACTIVITY_SERVICE)得到一个Binder接口,根据binder获取返回的IActivityManager
  3. 根据ApplicationThread中相关activity的相关启动方法、生命周期完成方法,完成调用
  4. ApplicationThread中相关方法调用时,通过Handler机制去通知相关activity状态的更新
  5. 会在H类中的handleMessage去处理这些消息,完成响应的操作

完结! 点个赞吧

你可能感兴趣的:(源码分析)