先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
正文
}
2.Activity.startActivity
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks {
…
@Override
public void startActivity(Intent intent) {
startActivityForResult(intent, -1);
}
…
}
3.Activity.startActivityForResult
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks {
…
public void startActivityForResult(Intent intent, int requestCode) {
if (mParent == null) {
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode);
…
} else {
…
}
…
}
4.Instrumentation.execStartActivity
public class Instrumentation {
…
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode) {
IApplicationThread whoThread = (IApplicationThread) contextThread;
if (mActivityMonitors != null) {
…
}
try {
int result = ActivityManagerNative.getDefault()
.startActivity(whoThread, intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
null, 0, token, target != null ? target.mEmbeddedID : null,
requestCode, false, false);
…
} catch (RemoteException e) {
}
return null;
}
…
}
这里的ActivityManagerNative.getDefault返回ActivityManagerService的远程接口,即ActivityManagerProxy接口
5.ActivityManagerProxy.startActivity
class ActivityManagerProxy implements IActivityManager
{
…
public int startActivity(IApplicationThread caller, Intent intent,
String resolvedType, Uri[] grantedUriPermissions, int grantedMode,
IBinder resultTo, String resultWho,
int requestCode, boolean onlyIfNeeded,
boolean debug) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeStrongBinder(caller != null ? caller.asBinder() : null);
intent.writeToParcel(data, 0);
data.writeString(resolvedType);
data.writeTypedArray(grantedUriPermissions, 0);
data.writeInt(grantedMode);
data.writeStrongBinder(resultTo);
data.writeString(resultWho);
data.writeInt(requestCode);
data.writeInt(onlyIfNeeded ? 1 : 0);
data.writeInt(debug ? 1 : 0);
mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);
reply.readException();
int result = reply.readInt();
reply.recycle();
data.recycle();
return result;
}
…
}
6.ActivityManagerService.startActivity
Context
Context是一个抽象基类,翻译为上下文,也可以理解为环境,提供一些程序运行基础信息。
Context有两个子类,ContextWrapper是上下文功能的封装类,而 ContextImpl 则是上下文功能的实现类。而 ContextWrapper 又有三个直接的子类, ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一个带主题的封装类,而它有一个直接子类就是Activity,所以Activity和Service以及Application的Context是不一样的,只有Activity需要主题,Service不需要主题。Context一共有三种类型,分别是Application、Activity和Service。这三个类虽然分别各种承担着不同的作用,但它们都属于Context的一种,而它们具体Context的功能则是由ContextImpl类去实现的,因此在绝大多数场景下,Activity、Service和Application这三种类型的Context都是可以通用的。不过有几种场景比较特殊,比如启动Activity,还有弹出Dialog。出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。
Activity、Window、View三者之间的关系
-
Activity 构造的时候会初始化一个Window( PhoneWindw )
-
PhoneWindow 有一个 RootView ,这个RootView 是一个ViewGroup,是最初始的根视图
-
RootView 通过 addView 方法来一个个添加 View
View的绘制流程
View的绘制流程:onMeasure -> onLayout -> onDraw
第一步:onMeasure 测量视图大小,从顶层父View到子View递归调用 measure 方法,measure 方法又回调 onMeasure方法。
第二步:onLayout 确定View位置,进行页面布局。从顶层父View向子View递归调用 layout 方法的过程,即父View根据上一步 measure 得到的布局大小和布局参数,将子View放在合适的位置上。
第三步:onDraw 绘制视图。主要步骤为①:绘制背景,②:绘制自己,③:绘制子View,④:绘制滚动条
View、ViewGroup事件分发
ViewGroup 包含 dispatchTouchEvent 、onInterceptTouchEvent 、onTouchEvent三个相关方法,View包含 dispatchTouchEvent、onTouchEvent两个相关方法。
1.当 Activity 接收到Touch事件时,将遍历子View进行Down事件分发,分发的目的是为了找到真正处理本次完整触摸事件的View,这个View会在 onTouchEvent 返回true。
2.当某个子View返回true时,就终止事件分发,并同时在ViewGroup中记录该View,接下来的move事件跟up事件都由该子View直接进行处理。
3.当ViewGroup所有子View都不捕获Down事件时,将触发ViewGroup自身的 onTouchEvent 事件。触发的方式是调用 super.dispatchTouchEvent函数,即调用父View的dispatchTouchEvent方法。
Handler实现原理
Android的主线程不能进行耗时操作,子线程不能进行更新UI,所以就有了Handler,它的作用就是实现线程之间的通信。
Handler整个流程中主要有四个对象:Handler、Message、MessageQueue、Looper。通过将要传递的消息放在Message中,Handler通过 sendMessage 方法将消息放入 MessageQueue 中,Looper 对象会不断的调用loop() 方法不断从 MessageQueue 中取出 Message 交给 Handler进行处理。
Android内存泄露
1.内存泄漏跟内存溢出的区别:
-
内存泄漏:指程序在申请内存后,无法释放已经申请的内存空间
-
内存溢出:指程序在申请内存时,没有足够的内存空间供其使用
2.内存泄漏的原因:
- Handler引起的内存泄漏:
将Handler声明为静态内部类,就不会持有外部类的引用,其生命周期就跟外部类无关。如果Handler内部要使用Context,则可以使用弱引用的方式。
- 单例模式引起的内存泄漏:
Context是ApplicationCotnext,ApplicationCotnext的生命周期与app一致,不会导致内存泄漏.
- 非静态内部类创建实例引起的:
创建为静态实例
- 非静态匿名内部类引起的:
将匿名内部类修改为静态的
- 注册/反注册未成对使用引起的内存泄漏
注册广播接受器、EventBus等,记得解绑
- 资源对象没有关闭引起的内存泄漏
在这些资源不使用的时候,记得调用相应的类似close()、destroy()、recycler()、release()等方法释放
最后
感觉现在好多人都在说什么安卓快凉了,工作越来越难找了。又是说什么程序员中年危机啥的,为啥我这年近30的老农根本没有这种感觉,反倒觉得那些贩卖焦虑的都是瞎j8扯谈。当然,职业危机意识确实是要有的,但根本没到那种草木皆兵的地步好吗?
Android凉了都是弱者的借口和说辞。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
所以,最后这里放上我耗时两个月,将自己8年Android开发的知识笔记整理成的Android开发者必知必会系统学习资料笔记,上述知识点在笔记中都有详细的解读,里面还包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。
以上全套学习笔记面试宝典,吃透一半保你可以吊打面试官,只有自己真正强大了,有核心竞争力,你才有拒绝offer的权力,所以,奋斗吧!骚年们!千里之行,始于足下。种下一颗树最好的时间是十年前,其次,就是现在。
最后,赠与大家一句诗,共勉!
不驰于空想,不骛于虚声。不忘初心,方得始终。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
6403)]
以上全套学习笔记面试宝典,吃透一半保你可以吊打面试官,只有自己真正强大了,有核心竞争力,你才有拒绝offer的权力,所以,奋斗吧!骚年们!千里之行,始于足下。种下一颗树最好的时间是十年前,其次,就是现在。
最后,赠与大家一句诗,共勉!
不驰于空想,不骛于虚声。不忘初心,方得始终。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-ZSD11BsG-1713046706404)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!