互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。
**另外本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **
下面有部分截图希望能对大家有所帮助。
本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录
需要这份系统化的资料的朋友,可以点击这里获取
1) 正在发送的广播不会脱离应用程序,比用担心app的数据泄露;
2) 其他的程序无法发送到我的应用程序内部,不担心安全漏洞。(比如:如何做一个杀不死的服务—监听火的app 比如微信、友盟、极光的广播,来启动自己。)
3) 发送本地广播比发送全局的广播高效。(全局广播要维护的广播集合表 效率更低。全局广播,意味着可以跨进程,就需要底层的支持。)
本地广播不能用静态注册。----静态注册:可以做到程序停止后还能监听。
使用:
- 注册:
, - 取消注册:
3.是否使用过 IntentService,作用是什么, AIDL 解决了什么问题?
如果有一个任务,可以分成很多个子任务,需要按照顺序来完成,如果需要放到一个服务中完成,那么使用是最好的选择。
一般我们所使用的Service是运行在主线程当中的,所以在service里面编写耗时的操作代码,则会卡主线程会。为了解决这样的问题,谷歌引入了.
的优点:
(1) 它创建一个独立的工作线程来处理所有一个一个intent。
(2) 创建了一个工作队列,来逐个发送intent给
(3) 不需要主动调用来结束服务,因为源码里面自己实现了自动关闭。
(4) 默认实现了返回的null。
(5) 默认实现的的目的是将intent插入到工作队列。
总结: 使用的好处有哪些。首先,省去了手动开线程的麻烦;第二,不用手动停止service;第三,由于设计了工作队列,可以启动多次—,但是只有一个service实例和一个工作线程。一个一个熟悉怒执行。
AIDL 解决了什么问题?
AIDL的全称:Android Interface Definition Language,安卓接口定义语言。
由于Android系统中的进程之间不能共享内存,所以需要提供一些机制在不同的进程之间进行数据通信。
远程过程调用: RPC—Remote Procedure Call。 安卓就是提供了一种的解决方案来公开自己的服务接口。AIDL:可以理解为双方的一个协议合同。双方都要持有这份协议—文本协议 文件(安卓内部编译的时候会将协议翻译生成一个xxx.java文件—代理模式:Binder驱动有关的,Linux底层通讯有关的。)
在系统源码里面有大量用到aidl,比如系统服务。
电视机顶盒系统开发。你的服务要暴露给别的开发者来使用。
讲解Binder机制。
4.Activity、 Window、 View 三者的差别, fragment 的特点?
Activity、 Window、 View 三者如何协同显示界面的。—考点:显示的过程(view 绘制流程)源码的熟悉度。
Activity剪窗花的人(控制的);Window窗户(承载的一个模型);View窗花(要显示的视图View);剪刀—将布局(图纸)剪成窗花。
(Alt+方向箭头)
fragment 的特点?(你用fragment有没有领略到一些乐趣,或者有没有踩过什么坑?)
fragment的设计主要是把Activity界面包括其逻辑打碎成很多个独立的模块,这样便于模块的重用和更灵活地组装呈现多样的界面。
- Fragment可以作为Activity界面的一个部分组成;
- 可以在一个Activity里面出现多个Fragment,并且一个fragment可以在多个Activity中使用;
- 在Activity运行中,可以动态地添加、删除、替换Fragment。
- Fragment有自己的生命周期的,可以响应输入事件。
踩过的坑:
- 重叠;
- 注解(兼容包解决);
- 初始化数据;
- 不能在…()方法后,commit;
- 入栈出栈问题; --事务。像Activity跳转一样的效果,同时返回的时候还能回到之前的页面(fragment)并且状态都还在。replace(f1,f2)严重影响生命周期:add()+show+hide
5. 低版本 SDK 实现高版本 api
几种情况:
1) 一般很多高版本的新的API都会在兼容包里面找到替代的实现。比如fragment。
Notification,在v4兼容包里面有类。5.0+出现的,小于5.0的话会包检测错误,v4兼容包类。
2) 没有替代实现就自己手动实现。比如:控件的水波纹效果—第三方实现。
或者直接在低版本去除这个效果。
3)补充: 如果设置了但是代码里面使用了高版本的API,会出现检测错误。需要在代码里面使用声明编译检测策略,比如:和注解提示编译器编译的规则。是忽略检测;,会根据你函数里面使用的API,严格地匹配版本,给出相应的编译错误提示。
**4)**为了避免位置的错误,最好不要使用废弃api。(一般情况下不会有兼容性问题,后面可能会随时删除这个API方法;性能方面的问题。)
6. launch mode 应用场景
栈:先进后出
标准模式
:使用场景:浏览器的书签;通讯消息聊天界面。
:使用场景:某个Activity当做主界面的时候。
:使用场景:比如浏览器很耗内存,很多app都会要调用它,这样就可以把该Activity设置成单例模式。比如:闹钟闹铃。
7.view 绘制流程
Measure: 测量,测量自己。如果是就需要测量里面的所有.
测量的结果怎么办?设置自己的大小。
Layout: 摆放,把自己摆放在哪个位置。如果是就需要发放里面的所有.
怎么去具体摆放呢?
Draw:绘制
8. 什么情况导致内存泄漏
1) 什么是内存泄漏:最好解释清楚GC垃圾回收机制以及概念GC Root。
2) 为什么会有内存泄漏:因为内存泄漏是属于人为的失误造成的。而且面向对象开发关系复杂、多线程的关系,很容易出现引用层级关系很深以及很混乱。
3) 什么情况容易导致内存泄漏:
4) 如何解决内存泄漏
9. ANR 定位和修正
可以通过查看/data/anr/traces.txt查看ANR信息。
根本原因是:主线程被卡了,导致应用在5秒时间未响应用户的输入事件。
很多种ANR错误出现的场景:
- 主线程当中执行IO/网络操作,容易阻塞。
- 主线程当中执行了耗时的计算。----自定义控件的时候onDraw方法里面经常这么做。
(同时聊一聊自定义控件的性能优化:在里面创建对象容易导致内存抖动—绘制动作会大量不断调用,产生大量垃圾对象导致GC很频繁就造成了内存抖动。)内存抖动就容易造成UI出现掉帧卡顿的问题 - 没有在10秒内完成处理。
- 的代码中也要尽量减少耗时的操作,建议使用处理。
- Service执行了耗时的操作,因为service也是在主线程当中执行的,所以耗时操作应该在service里面开启子线程来做。
- 使用处理耗时的IO等操作。
- 使用Thread或者时,使用或者设置优先级为后台优先级,这样可以让其他的多线程并发消耗CPU的时间会减少,有利于主线程的处理。
- Activity的和回调中尽量耗时的操作。
10.什么情况导致 oom
OOM产生的原因:内存不足,
android系统为每一个应用程序都设置了一个硬性的条件:最大阀值.如果你的应用程序内存占用接近这个阀值,此时如果再尝试内存分配的时候就会造成OOM。
- 内存泄露多了就容易导致OOM
- 大图的处理。压缩图片。平时开发就要注意对象的频繁创建和回收。
- 可以适当的检测:可以用来查询当前应用的阀值。可以通过命名查看。
如何避免内存泄露:
1)减小对象的内存占用:
- 使用更加轻量级的数据结构:
考虑适当的情况下替代等传统数据结构而使用安卓专门为手机研发的数据结构类更加高效。
会导致一些没必要的自动装箱和拆箱。 - 适当的避免在android中使用枚举,替代使用普通的static常量。(一般还是提倡多用枚举—软件的架构设计方面;如果碰到这个枚举需要大量使用的时候就应该更加倾向于解决性能问题。)。
- 较少Bitmap对象的内存占用。
使用: 计算图片压缩比例进行图片压缩,可以避免大图加载造成
:图片的解码格式选择,,还可以使用。 - 使用更小的图片
资源图片里面,是否存在还可以继续压缩的空间。
2)内存对象的重复利用:
使用对象池技术,
两种:
自己写;
利用系统既有的对象池机制。比如算法。
- a.源码可以看到重用的情况的复用。中源码。
- b.Bitmap的复用
等要显示大量图片。需要使用缓存机制来复用图片。 - c. 避免在方法里面执行对象的创建,要复用。避免内存抖动。
- **d ** 常见的java基础问题—等
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 区别与联系
方法: 会导致调用Measure()方法和layout()。将会根据标志位判断是否需要;
**:**摆放里面的子控件
**:**绘制视图本身;(还需要绘制里面的所有子控件)
总体来说,如果你想转行从事程序员的工作,Java开发一定可以作为你的第一选择。但是不管你选择什么编程语言,提升自己的硬件实力才是拿高薪的唯一手段。
如果你以这份学习路线来学习,你会有一个比较系统化的知识网络,也不至于把知识学习得很零散。我个人是完全不建议刚开始就看《Java编程思想》、《Java核心技术》这些书籍,看完你肯定会放弃学习。建议可以看一些视频来学习,当自己能上手再买这些书看又是非常有收获的事了。
本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录
需要这份系统化的资料的朋友,可以点击这里获取
心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**