Android开发之从源码深入Activity

Android开发之从源码深入Activity

CaptainAndroid.png

很多人提到Activity就知道其7大生命周期,以及各个方法的使用,但是Activity到底是怎么工作的呢?也许许多人都不知道。

本篇文章带你学习Activity到底是什么。

Activity相关Framework类

  • Context是什么?

    Context在我们的Android开发之深入Context文章中已经介绍过

  • ActivityThread是什么?

    ActivityThread不是一个线程,是应用的主线程,在Activity中有个

    ActivityThread mMainThread;

    ActivityThread有个main方法

Android开发之从源码深入Activity

  • ApplicationThread?

    负责与AMS进行通信的一个帮助类

    在ActivityThread中作为一个成员变量进行初始化

final ApplicationThread mAppThread = new ApplicationThread();
  • ActivityClientRecord

    一个记录类,客户端负责记录Activity的各种信息

  • ActivityRecord

    ActivityManagerService端负责记录每个注册过来的Activity的信息


Activity与其他类的区别

Activity作为整体框架,控制界面,有其生命周期,但是其生命周期的回调等都是由Framework控制

如果从本质上看,与普通的类没什么区别


Activity的生命方法是什么时候回调的

关键点:

  1. Instrumentation (生命周期的管理,还可以启动Activity,创建Application)

  2. ActivityManagerNative AMS的远程代理

  3. 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小码农(简书作者)

本文为头条号作者发布,不代表今日头条立场。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值