很多人提到Activity就知道其7大生命周期,以及各个方法的使用,但是Activity到底是怎么工作的呢?也许许多人都不知道。
本篇文章带你学习Activity到底是什么。
Activity相关Framework类
-
Context是什么?
Context在我们的Android开发之深入Context文章中已经介绍过
-
ActivityThread是什么?
ActivityThread不是一个线程,是应用的主线程,在Activity中有个
ActivityThread mMainThread;
ActivityThread有个main方法
-
ApplicationThread?
负责与AMS进行通信的一个帮助类
在ActivityThread中作为一个成员变量进行初始化
final ApplicationThread mAppThread = new ApplicationThread();
-
ActivityClientRecord
一个记录类,客户端负责记录Activity的各种信息
-
ActivityRecord
ActivityManagerService端负责记录每个注册过来的Activity的信息
Activity与其他类的区别
Activity作为整体框架,控制界面,有其生命周期,但是其生命周期的回调等都是由Framework控制
如果从本质上看,与普通的类没什么区别
Activity的生命方法是什么时候回调的
关键点:
-
Instrumentation (生命周期的管理,还可以启动Activity,创建Application)
-
ActivityManagerNative AMS的远程代理
-
ActivityThread中的final H mH = new H();这个handler类
public final class ActivityThread { private class H extends Handler { ... public void handleMessage(Message msg) { if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what)); switch (msg.what) { /*拿到启动avtivity的请求*/ 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); handleLaunchActivity(r, null, "LAUNCH_ACTIVITY"); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); } break; case RESUME_ACTIVITY: Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityResume"); SomeArgs args = (SomeArgs) msg.obj; handleResumeActivity((IBinder) args.arg1, true, args.argi1 != 0, true, args.argi3, "RESUME_ACTIVITY"); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); break; ... } } private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) { ... Activity a = performLaunchActivity(r, customIntent); ... } private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { // System.out.println("##### [" + System.currentTimeMillis() + "] ActivityThread.performLaunchActivity(" + r + ")"); /*创建application,整个应用程序就这个地方创建app * 里面会调用LoadedApk的 public Application makeApplication(boolean forceDefaultAppClass,Instrumentation instrumentation) ---->instrumentation.callApplicationOnCreate(app); ---->mActivityThread.mAllApplications.add(app); 回调application的oncreate方法*/ Application app = r.packageInfo.makeApplication(false, mInstrumentation); /*使用classloader创建class*/ java.lang.ClassLoader cl = r.packageInfo.getClassLoader(); activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent); /*使得activity与windows对象进行关联 同时对Activity初始化相关的内容 比如:ContextImpl,Theme,Configuration,title*/ activity.attach(appContext, this, getInstrumentation(), r.token, r.ident, app, r.intent, r.activityInfo, title, r.parent, r.embeddedID, r.lastNonConfigurationInstances, config, r.referrer, r.voiceInteractor, window); /*让mInstrumentation回掉自己的oncreate*/ if (r.isPersistable()) { mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState); } else { mInstrumentation.callActivityOnCreate(activity, r.state); } }
从上面我们看出Instrumentation是负责回掉activity生命周期的工具类,而ActivityThread是控制着这些执行的类。
总结
其实代码继续跟下去,最终会发现,我们的应用无非是在由前台的ActivityThread,ContextImpl,后台的ActivityManagerService,想要显示到界面上最后都是拿到WindowManager设置参数后addView来干的。
了解更多网络安全动态、干货、热点资讯,请关注微信公众号“e安在线”!
本文作者:Anderson/Jerey_Jobs
文/Anderson小码农(简书作者)
本文为头条号作者发布,不代表今日头条立场。