先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
正文
那么我们分别来跟踪这2种情况:
启动自己的Activity
我们可以找到这段代码的关键逻辑,我们先分析下 app.thread
是什么。跟踪进去会发现是一个 IApplicationThread
, 可以发现这里又是一个 aidl, 最后我们可以找到 ApplicationThread
,
private class ApplicationThread extends IApplicationThread.Stub
这是 ActivityThread
的一个静态内部类,ActivtyThread和启动Activity 相关,那么这个类就应该是和 Application 启动相关。
我们会发现最后其实发了一个message 到消息队列中,找到 H
这个 handler 的 handleMessage
方法
case LAUNCH_ACTIVITY: {
final ActivityClientRecord r = (ActivityClientRecord) msg.obj;
r.packageInfo = getPackageInfoNoCheck(
r.activityInfo.applicationInfo, r.compatInfo);
handleLaunchActivity(r, null, “LAUNCH_ACTIVITY”);
} break;
查看 handleLaunchActivity
方法
Activity a = performLaunchActivity(r, customIntent);
在performLaunchActivity
方法中可以看到
java.lang.ClassLoader cl = appContext.getClassLoader();
activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
这里,我们发现这里通过 Insteumentation
new 了一个 Activity
通过以上代码,我们还可以发现 new 出 Activity 后的几个步骤
- attach Activity, 目测会有初始化 window 的流程
- 设置 theme
- Activity 的
onCreate
流程 - Activity 如果已经销毁,会去执行
onRestoreInstance
,我们可以在这里做数据恢复的操作 - Activity 在
onCreate
完成后的一些操作
到这里,我们的 Activity 就启动成功了
启动新的进程
下面来分析我们的第二种情况,我们可以跟踪到 ActivityManagerService
的 `startProcessLocked 方法, 这个方法最终会走到自己的重载方法:
如果我们启动的是一个 webview service, 则会走到 startWebView
,这里我们不考虑,所以我们分析的是 Process.start
这种初始化一个普通进程的情况。
这个方法最后调用了 ZygoteProcess
的 start
方法
这里我们也可以大致分析出来,这里就是在通过 socket 通信请求 Zygote
进程 fork 一个子进程,作为新的 APP 进程,具体流程本篇文章暂时不做深究。
最终我们会启动 ActivityThread
的 main
方法,继续走到 attach
方法
这里我们能看到启动主线程的 Looper, 创建系统 Context 等工作,最终我们走到 ApplicationThread
的 bindApplication
, 代码这里就不贴了,这里负责了 Application 在初始化的时候的各种工作。包括 LoadedAPK
的 makeApplication
过程。
if (normalMode) {
try {
if (mStackSupervisor.attachApplicationLocked(app)) {
didSomething = true;
}
} catch (Exception e) {
Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
badApp = true;
}
}
这里会发现,正常模式下,我们走到了 ActivityStackSupervisor
的 attachApplicationLocked
方法,后面就又会和第一部分介绍的一样,走到 realStartActivityLocked
方法,去创建并执行 Activity 的生命周期。
总结
到这里,Activity 的启动流程就大致梳理出来了。基本就是,Instrumentation
负责 Activity 的创建和中转, ActivityStackSupervisor
负责 Activity的 栈管理。Activity 都通过了 ActviityServerManager
来进行管理。
大概的关系如下图所示:
后续
这里我只是对Activity的启动流程做了一个简单的梳理。我们会发现每个模块和细节都有几百几百行的代码。完全吃透还得自己下功夫,看源码,尽管这个过程很痛苦。一遍看不懂就再来一遍,跟着博客思路看了不下十遍,努力总会有收获的。
最近收集到一份阿里大神整理的内部资料,包含**【Android开发核心知识笔记+2020大厂最新面试题及解析+源码笔记】**。如果你是卡在缺少学习资源的瓶颈上,那么刚刚好我能帮到你。
朋友们如果有需要,可以我的【Github】阅读下载.
最后送给大家一句话:行动是老子、知识是儿子、创造是孙子。祝愿大家能找到各自的方法,实现人生的持续突破。
总结
最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
相信它会给大家带来很多收获:
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
(备注Android)**
[外链图片转存中…(img-xsHGlVK8-1713388424876)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!