先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
正文
- 可达性分析法: 通过一系列被称为『GCRoots』的对象
作为起始点,从这些节点开始向下搜索,搜索所走过的
路径称为引用链,当一个对象到 GC Roots 没有任何引
用链相连时,则证明此对象是不可用的。其中可作为 GC
Roots 的对象:虚拟机栈中引用的对象,主要是指栈帧
中的本地变量*、本地方法栈中 Native 方法引用的对
象、方法区中类静态属性引用的对象、方法区中常量引
用的对象
GC 回收算法有以下四种:
- 分代收集算法: 是当前商业虚拟机都采用的一种算法,
根据对象存活周期的不同,将 Java 堆划分为新生代和老
年代,并根据各个年代的特点采用最适当的收集算法。 - 新生代: 大批对象死去,只有少量存活。使用『复制算
法』,只需复制少量存活对象即可。 - 复制算法: 把可用内存按容量划分为大小相等的
两块,每次只使用其中的一块。当这一块的内存
用尽后,把还存活着的对象『复制』到另外一块
上面,再将这一块内存空间一次清理掉。实现简单,运行高效。在对象存活率较高时就要进行较多的复制操作,效率将会变低 - 老年代: 对象存活率高。使用『标记—清理算法』或者
『标记—整理算法』,只需标记较少的回收对象即可。 - 标记-清除算法: 首先『标记』出所有需要回收
的对象,然后统一『清除』所有被标记的对象。
标记和清除两个过程的效率都不高,清除之后会
产生大量不连续的内存碎片,空间碎片太多可能
会导致以后在程序运行过程中需要分配较大对象
时,无法找到足够的连续内存而不得不提前触发
另一次垃圾收集动作。 - 标记-整理算法: 首先『标记』出所有需要回收
的对象,然后进行『整理』,使得存活的对象都
向一端移动,最后直接清理掉端边界以外的内
存。标记整理算法会将所有的存活对象移动到一
端,并对不存活对象进行处理,因此其不会产生
内存碎片
6、内存泄露和内存溢出的区别 ?AS 有什么工具可以检测内存泄露
- 内存溢出(out of memory): 是指程序在申请内存时,没有足
够的内存空间供其使用,出现 out of memory;比如申请了一
个 integer,但给它存了 long 才能存下的数,那就是内存溢
出。 - 内存泄露(memory leak): 是指程序在申请内存后,无法释放
已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露
堆积后果很严重,无论多少内存,迟早会被占光。memory leak
会最终会导致 out of memory! - 查找内存泄漏可以使用 Android Studio 自带的
AndroidProfiler
工具或 MAT
7、性能优化,怎么保证应用启动不卡顿? 黑白屏怎么处理?
-
应用启动速度,取决于你在 application 里面时候做了什么事
情,比如你集成了很多 sdk,并且 sdk 的 init 操作都需要在主
线程里实现所以会有卡顿的感觉。在非必要的情况下可以把加
载延后或则开启子线程处理 -
另外,影响界面卡顿的两大因素,分别是界面绘制和数据处
理。 -
布局优化(使用 include,merge 标签,复杂布局推荐使
用ConstraintLayout
等) -
onCreate()
中不执行耗时操作 把页面显示的 View 细
分一下,放在AsyncTask
里逐步显示,用Handler
更好。这样用户的看到的就是有层次有步骤的一个个的
View 的展示,不会是先看到一个黑屏,然后一下显示
所有 View。最好做成动画,效果更自然。 -
利用多线程的目的就是尽可能的减少
onCreate()
和
onReume()
的时间,使得用户能尽快看到页面,操作
页面。 -
减少主线程阻塞时间。
-
提高 Adapter 和
AdapterView
的效率。 -
黑白屏产生原因: 当我们在启动一个应用时,系统会去检查是
否已经存在这样一个进程,如果不存在,系统的服务会先检查
startActivity
中的 intent 的信息,然后在去创建进程,最后启
动Acitivy
,即冷启动。而启动出现白黑屏的问题,就是在这段
时间内产生的。系统在绘制页面加载布局之前,首先会初始化
窗口(Window),而在进行这一步操作时,系统会根据我们设
置的 Theme 来指定它的 Theme 主题颜色,我们在 Style 中的
设置就决定了显示的是白屏还是黑屏。 -
windowIsTranslucent
和windowNoTitle
,将这两个
属性都设置成 true (会有明显的卡顿体验,不推荐) -
如果启动页只是是一张图片,那么为启动页专一设置一
个新的主题,设置主题的
android:windowBackground
属性为启动页背景图即
可 -
使用 layer-list 制作一张图片 launcher_layer.xml,将其
设置为启动页专一主题的背景,并将其设置为启动页布
局的背景。
8、强引用置为 null,会不会被回收?
不会立即释放对象占用的内存。 如果对象的引用被置为 null,
只是断开了当前线程栈帧中对该对象的引用关系,而 垃圾收集
器是运行在后台的线程,只有当用户线程运行到安全点(safe
point)或者安全区域才会扫描对象引用关系,扫描到对象没有被
引用则会标记对象,这时候仍然不会立即释放该对象内存,因
为有些对象是可恢复的(在 finalize 方法中恢复引用 )。只有
确定了对象无法恢复引用的时候才会清除对象内存。
9、ListView 跟 RecyclerView 的区别
动画区别:
- 在
RecyclerView
中,内置有许多动画 API,例如:
notifyItemChanged()
,notifyDataInserted()
,
notifyItemMoved()
等等;如果需要自定义动画效果,
可以通过实现(RecyclerView.ItemAnimator
类)完成
自定义动画效果,然后调用
RecyclerView.setItemAnimator();
- 但是
ListView
并没有实现动画效果,但我们可以在
Adapter 自己实现 item 的动画效果;
刷新区别:
ListView
中通常刷新数据是用全局刷新
notifyDataSetChanged()
,这样一来就会非常消耗资
源;本身无法实现局部刷新,但是如果要在 ListView 实 现局部刷新,依然是可以实现的,当一个 item 数据刷新
时,我们可以在 Adapter 中,实现一个
onItemChanged()
方法,在方法里面获取到这个 item
的 position(可以通过getFirstVisiblePosition()
),然
后调用getView()
方法来刷新这个 item 的数据;RecyclerView
中可以实现局部刷新,例如:
notifyItemChanged();
缓存区别:
RecyclerView
比ListView
多两级缓存,支持多个离
ItemView
缓存,支持开发者自定义缓存处理逻辑,支
持所有RecyclerView
共用同一个
RecyclerViewPool
(缓存池)。ListView
和RecyclerView
缓存机制基本一致,但缓存
使用不同
10、ListView 的 adapter 是什么 adapter
BaseAdapter
:抽象类,实际开发中我们会继承这个类并且重
写相关方法,用得最多的一个适配器!ArrayAdapter
:支持泛型操作,最简单的一个适配器,只能展
现一行文字〜SimpleAdapter
:同样具有良好扩展性的一个适配器,可以自
定义多种效果!SimpleCursorAdapter
:用于显示简单文本类型的listView
,
一般在数据库那里会用到,不过有点过时,不推荐使用!
11、LinearLayout、FrameLayout、RelativeLayout 性能对比,为什么?
RelativeLayout
会让子 View 调用 2 次onMeasure
,
LinearLayout
在有 weight 时,也会调用子 View 2 次
onMeasure
RelativeLayout
的子 View 如果高度和RelativeLayout
不同,
则会引发效率问题,当子 View 很复杂时,这个问题会更加严
重。如果可以,尽量使用 padding 代替 margin。 o 在不影响层级深度的情况下,使用LinearLayout
和
FrameLayout
而不是RelativeLayout
。
请查看完整的PDF版
(更多完整项目下载。未完待续。源码。图文知识后续上传github。)
可以点击关于我联系我获取完整PDF
小结
有了这么多优秀的开发工具,可以做出更高质量的Android应用。
当然了,“打铁还需自身硬”,想要写出优秀的代码,最重要的一点还是自身的技术水平,不然用再好的工具也不能发挥出它的全部实力。
在这里我也分享一份大佬自己收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这些都是我闲暇还会反复翻阅的精品资料。在脑图中,每个知识点专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。
总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
统化的资料的朋友,可以添加V获取:vip204888 (备注Android)**
[外链图片转存中…(img-TukHKEOZ-1713336192256)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!