Activity:启动流程

mac2024-04-01  36

版本:27.1.1

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

流程图

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

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

程序的启动

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

结合下面的源码分析一起看理解效果更佳哦!

源码分析

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

main() public static void main(String[] args) { // ....省略N行代码 // 得到ActivityThread实例如并调用 attach方法 ActivityThread thread = new ActivityThread(); thread.attach(false); // ....省略N行代码 } 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

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

源码分析

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是利用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();

总结

分析过程中的核心点:

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

整体流程核心步骤:

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

完结! 点个赞吧

最新回复(0)