先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
正文
3. 是否使用过 IntentService,作用是什么, AIDL 解决了什么问 题? (小米)
如果有一个任务,可以分成很多个子任务,需要按照顺序来完成,如果需要放到一个服 务中完成,那么使用 IntentService 是最好的选择。
一般我们所使用的 Service 是运行在主线程当中的,所以在 service 里面编写耗时的操 作代码,则会卡主线程会 ANR。为了解决这样的问题,谷歌引入了 IntentService. IntentService 的优点:
(1) 它创建一个独立的工作线程来处理所有一个一个 intent。
(2) 创建了一个工作队列,来逐个发送 intent 给 onHandleIntent()
(3) 不需要主动调用 stopSelf()来结束服务,因为源码里面自己实现了自动关闭。
(4) 默认实现了 onBind()返回的 null。
(5) 默认实现的 onStartCommand()的目的是将 intent 插入到工作队列。
总结:使用 IntentService 的好处有哪些。首先,省去了手动开线程的麻烦;第二,不 用手动停止 service;第三,由于设计了工作队列,可以启动多次—startService(), 但是只有一个 service 实例和一个工作线程。一个一个熟悉怒执行。
AIDL 解决了什么问题?
AIDL 的全称:Android Interface Definition Language,安卓接口定义语言。 由于 Android 系统中的进程之间不能共享内存,所以需要提供一些机制在不同的进程之 间进行数据通信。
远程过程调用:RPC—Remote Procedure Call。 安卓就是提供了一种 IDL 的解决方案 来公开自己的服务接口。AIDL:可以理解为双方的一个协议合同。双方都要持有这份协 议—文本协议 xxx.aidl 文件(安卓内部编译的时候会将 aidl 协议翻译生成一个 xxx.java 文件—代理模式:Binder 驱动有关的,Linux 底层通讯有关的。)
在系统源码里面有大量用到 aidl,比如系统服务。
电视机顶盒系统开发。你的服务要暴露给别的开发者来使用。 讲解 Binder 机制
4. Activity、 Window、 View 三者的差别, fragment 的特点? (360)
Activity、 Window、 View 三者如何协同显示界面的。—考点:显示的过程(view 绘 制流程)源码的熟悉度。
Activity 剪窗花的人(控制的);Window 窗户(承载的一个模型);View 窗花(要显示 的视图 View);LayoutInflater 剪刀—将布局(图纸)剪成窗花。 (Alt+方向箭头)
fragment 的特点?(你用 fragment 有没有领略到一些乐趣,或者有没有踩过什么坑?)
fragment 的设计主要是把 Activity 界面包括其逻辑打碎成很多个独立的模块,这样便 于模块的重用和更灵活地组装呈现多样的界面。
1) Fragment 可以作为 Activity 界面的一个部分组成;
2) 可以在一个 Activity 里面出现多个 Fragment,并且一个 fragment 可以在多个 Activity 中使用;
3) 在 Activity 运行中,可以动态地添加、删除、替换 Fragment。
4) Fragment 有自己的生命周期的,可以响应输入事件。
踩过的坑:
-
重叠;
-
注解 newAPI(兼容包解决);
-
Setarguement()初始化数据;
-
不 能在 onsave…()方法后,commit;
-
入栈出栈问题; --事务。
像 Activity 跳转 一样的效果,同时返回的时候还能回到之前的页面(fragment)并且状态都还在。 replace(f1,f2)严重影响生命周期:add()+show+hide
5. 低版本 SDK 实现高版本 api(小米)
两种情况:
1) 一般很多高版本的新的 API 都会在兼容包里面找到替代的实现。比如 fragment。 Notification , 在 v4 兼 容 包 里 面 有 NotificationCompat 类 。 5.0+ 出 现 的 backgroundTint,minSdk 小于 5.0 的话会包检测错误,v4 兼容包 DrawableCompat 类。
2) 没有替代实现就自己手动实现。比如:控件的水波纹效果—第三方实现。 或者直接在低版本去除这个效果。
3) 补充:如果设置了 minSDK 但是代码里面使用了高版本的 API,会出现检测错误。需 要在代码里面使用声明编译检测策略,比如:@SuppressLint 和@TargetApi 注解提 示编译器编译的规则。@SuppressLint 是忽略检测;@TargetApi=23,会根据你函数 里面使用的 API,严格地匹配 SDK 版本,给出相应的编译错误提示。
4) 为了避免位置的错误,最好不要使用废弃 api。(一般情况下不会有兼容性问题,后 面可能会随时删除这个 API 方法;性能方面的问题。)
6. launch mode 应用场景(百度、小米、乐视)
栈:先进后出
标准模式
SingleTop:使用场景:浏览器的书签;通讯消息聊天界面。
SingleTask:使用场景:某个 Activity 当做主界面的时候。
SingleInstance:使用场景:比如浏览器 BrowserActivity 很耗内存,很多 app 都会要调用 它,这样就可以把该 Activity 设置成单例模式。比如:闹钟闹铃。
7. view 绘制流程(百度)
Measure:测量,测量自己。如果是 ViewGroup 就需要测量里面的所有 childview.
测 量 的 结 果 怎 么 办 ? setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState), heightSizeAndState);设置自己的大小。
Layout: 摆放,把自己摆放在哪个位置。如果是 ViewGroup 就需要发放里面的所有 childview.
怎么去具体摆放呢?
Draw:绘制
/*
-
Draw traversal performs several drawing steps which must be executed
-
in the appropriate order:
-
- Draw the background
-
- If necessary, save the canvas’ layers to prepare for fading
-
- Draw view’s content
-
- Draw children
-
- If necessary, draw the fading edges and restore layers
-
- Draw decorations (scrollbars for instance) */
8. 什么情况导致内存泄漏(美团)
1)什么是内存泄漏:最好解释清楚 GC 垃圾回收机制以及概念 GC Root。
2)为什么会有内存泄漏:因为内存泄漏是属于人为的失误造成的。而且面向对象开发 关系复杂、多线程的关系,很容易出现引用层级关系很深以及很混乱。
3)什么情况容易导致内存泄漏;
4)如何解决内存泄漏;
9. ANR 定位和修正
可以通过查看/data/anr/traces.txt 查看 ANR 信息。
根本原因是:主线程被卡了,导致应用在 5 秒时间未响应用户的输入事件。
很多种 ANR 错误出现的场景:
1) 主线程当中执行 IO/网络操作,容易阻塞。
2) 主线程当中执行了耗时的计算。----自定义控件的时候 onDraw 方法里面经常这么 做。(同时聊一聊自定义控件的性能优化:在 onDraw 里面创建对象容易导致内存抖动 —绘制动作会大量不断调用,产生大量垃圾对象导致 GC 很频繁就造成了内存抖动。)内存抖动就容易造成 UI 出现掉帧卡顿的问题。
3) BroadCastReceiver 没有在 10 秒内完成处理。
4) BroadCastReceiver 的 onReceived 代码中也要尽量减少耗时的操作,建议使用 IntentService 处理。
5) Service 执行了耗时的操作,因为 service 也是在主线程当中执行的,所以耗时操 作应该在 service 里面开启子线程来做。
6) 使用 AsyncTask 处理耗时的 IO 等操作。
7) 使 用 Thread 或 者 HandlerThread 时 , 使用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND) 或 者 java.lang.Thread.setPriority (int priority)设置优先级为后台优先级,这 样可以让其他的多线程并发消耗 CPU 的时间会减少,有利于主线程的处理。
8) Activity 的 onCreate 和 onResume 回调中尽量耗时的操作。
10. 什么情况导致 oom(乐视、美团)
OOM 产生的原因:内存不足,android 系统为每一个应用程序都设置了一个硬性的条件: DalvikHeapSize 最大阀值 64M/48M/24M.如果你的应用程序内存占用接近这个阀值,此时如 果再尝试内存分配的时候就会造成 OOM。
1)内存泄露多了就容易导致 OOM
2)大图的处理。压缩图片。平时开发就要注意对象的频繁创建和回收。
3)可以适当的检测:ActivityManager.getMemoryClass()可以用来查询当前应用的 HeapSize 阀值。可以通过命名 adb shellgetProp | grep dalvik.vm.heapxxxlimit 查看。
如何避免内存泄露:
1) 减小对象的内存占用:
a) 使用更加轻量级的数据结构: 考虑适当的情况下替代 HashMap 等传统数据结构而使用安卓专门为手机研发 的 数 据 结 构 类 ArrayMap/SparseArray 。 SparseLongMap/SparseIntMap/SparseBoolMap 更加高效。 HashMap.put(string,Object);Object o = map.get(string);会导致一些没必 要的自动装箱和拆箱。
b) 适当的避免在 android 中使用 Enum 枚举,替代使用普通的 static 常量。(一 般还是提倡多用枚举—软件的架构设计方面;如果碰到这个枚举需要大量使 用的时候就应该更加倾向于解决性能问题。)。
c) 较少 Bitmap 对象的内存占用。 使用 inSampleSize:计算图片压缩比例进行图片压缩,可以避免大图加载造成 OOM; decodeformat : 图 片 的 解 码 格 式 选 择 , ARGB_8888/RGB_565/ARGB_4444/ALPHA_8,还可以使用 WebP。
d) 使用更小的图片 资源图片里面,是否存在还可以继续压缩的空间。
2) 内存对象的重复利用: 使用对象池技术,两种:
1.自己写;
2.利用系统既有的对象池机制。比如 LRU(Last Recently Use)算法。
a) ListView/GridView 源 码 可 以 看 到 重 用 的 情 况 ConvertView 的 复 用 。RecyclerView 中 Recycler 源码。
b) Bitmap 的复用 Listview 等要显示大量图片。需要使用 LRU 缓存机制来复用图片。
c) 避免在 onDraw 方法里面执行对象的创建,要复用。避免内存抖动。
d) 常见的 java 基础问题—StringBuilder 等
3) 避免对象的内存泄露;
4) 使用一些内存的优化策略: 看文档
11. Android Service 与 Activity 之间通信的几种方式
1)通过 Binder
2)通过广播
12. Android 各个版本 API 的区别
把几个关键版本的特性记住:3.0/4.0、4.4、5.0、6.0/7.0……
13. Requestlayout, onlayout, onDraw, DrawChild 区别与 联系(猎豹)
RequestLayout()方法:会导致调用 Measure()方法和 layout()。将会根据标志位判断是否 需要 onDraw();
onLayout():摆放 viewGroup 里面的子控件
onDraw():绘制视图本身;(ViewGroup 还需要绘制里面的所有子控件)
drawChild(): 重 新 回 调 每 一 个 子 视 图 的 draw 方 法 。 child.draw(canvas, this, drawingTime);
14. invalidate()和 postInvalidate() 的区别及使用(百度)
最后
对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
以下是今天给大家分享的一些独家干货:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
以下是今天给大家分享的一些独家干货:
[外链图片转存中…(img-01TgPEAL-1713438458036)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-zpVYHrmN-1713438458037)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!