突如其来的电话面试 和 公司的 Android团队负责人 聊了37 分钟
以下问题回答了 半点 只能使用别人文章的链接进行知识的加强
java基础
集合相关
集合有多少种类型
https://blog.csdn.net/zhangqunshuai/article/details/80660974
ArrayList 的初始大小
https://blog.csdn.net/shmily_lsl/article/details/84141353
ArrayList如何扩容
https://blog.csdn.net/zymx14/article/details/78324464
重载和重写
https://blog.csdn.net/wintershii/article/details/80558739
线程池
https://www.jianshu.com/p/0d9ef81aaa26
软件工程相关问题
因为我软件工程专业的 而且开了软件工程导论 面试官就想问问我 软件工程的思想
即使之前学过了 但是还不是很理解软件工程到底是什么鬼 只能百度百科找些定义了 要是被邓酩老师知道 那挺惨的 哈哈
定义
软件工程一直以来都缺乏一个统一的定义,很多学者、组织机构都分别给出了自己认可的定义:[
BarryBoehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。
1.将系统化的、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件;
2.在1中所述方法的研究
FritzBauer:在NATO会议上给出的定义:建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。
《计算机科学技术百科全书》:软件工程是应用计算机科学、数学、逻辑学及管理科学等原理,开发软件的工程。软件工程借鉴传统工程的原则、方法,以提高质量、降低成本和改进算法。其中,计算机科学、数学用于构建模型与算法,工程科学用于制定规范、设计范型(paradigm)、评估成本及确定权衡,管理科学用于计划、资源、质量、成本等管理。
比较认可的一种定义认为:软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件,以及如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。
ISO 9000对软件工程过程的定义是:软件工程过程是输入转化为输出的一组彼此相关的资源和活动。 [2]
其它定义:1.运行时,能够提供所要求功能和性能的指令或计算机程序集合。
2.程序能够满意地处理信息的数据结构。
3.描述程序功能需求以及程序如何操作和使用所要求的文档。以开发语言作为描述语言,可以认为:软件=程序+数据+文档。
内涵
一、软件工程过程是指为获得软件产品,在软件工具的支持下由软件工程师完成的一系列软件工程活动,包括以下四个方面:
1、P(Plan)——软件规格说明。规定软件的功能及其运行时的限制。
2、D(DO)——软件开发。开发出满足规格说明的软件。
3、C(Check)——软件确认。确认开发的软件能够满足用户的需求。
4、A(Action)——软件演进。软件在运行过程中不断改进以满足客户新的需求。
二、从软件开发的观点看,它就是使用适当的资源(包括人员,软硬件资源,时间等),为开发软件进行的一组开发活动,在活动结束时输入(即用户的需求)转化为输出(最终符合用户需求的软件产品)。
三个阶段:定义阶段:可行性研究初步项目计划、需求分析;开发阶段:概要设计、详细设计、实现、测试;运行和维护阶段:运行、维护、废弃
原则:1、抽象;2、信息隐蔽;3、模块化;4、局部化;5、确定性;6,一致性;7、完备性;8、可验证性
Android相关
布局相关
https://www.cnblogs.com/wuziyue/p/5371925.html
线性布局和相对布局性的区别
http://blog.sina.com.cn/s/blog_68580ed90100t3rp.html
线性布局和相对布局性能对比
https://www.cnblogs.com/hellsong/p/4613426.html
View的一些基本工作原理
先通过几个问题,简单的了解写android中View的工作原理吧。 (1)View是什么? 简单来说,View是Android系统在屏幕上的视觉呈现,也就是说你在手机屏幕上看到的东西都是View。 (2)View是怎么绘制出来的? View的绘制流程是从ViewRoot的performTraversals()方法开始,依次经过measure(),layout()和draw()三个过程才最终将一个View绘制出来。 (3)View是怎么呈现在界面上的? Android中的视图都是通过Window来呈现的,不管Activity、Dialog还是Toast它们都有一个Window,然后通过WindowManager来管理View。Window和顶级View——DecorView的通信是依赖ViewRoot完成的。 (4)View和ViewGroup什么区别? 不管简单的Button和TextView还是复杂的RelativeLayout和ListView,他们的共同基类都是View。所以说,View是一种界面层控件的抽象,他代表了一个控件。那ViewGroup是什么东西,它可以被翻译成控件组,即一组View。ViewGroup也是继承View,这就意味着View本身可以是单个控件,也可以是多个控件组成的控件组。根据这个理论,Button显然是个View,而RelativeLayout不但是一个View还可以是一个ViewGroup,而ViewGroup内部是可以有子View的,这个子View同样也可能是ViewGroup,以此类推。
RelativeLayout和LinearLayout性能PK
基于以上原理和大背景,我们要探讨的性能问题,说的简单明了一点就是:当RelativeLayout和LinearLayout分别作为ViewGroup,表达相同布局时绘制在屏幕上时谁更快一点。上面已经简单说了View的绘制,从ViewRoot的performTraversals()方法开始依次调用perfromMeasure、performLayout和performDraw这三个方法。这三个方法分别完成顶级View的measure、layout和draw三大流程,其中perfromMeasure会调用measure,measure又会调用onMeasure,在onMeasure方法中则会对所有子元素进行measure,这个时候measure流程就从父容器传递到子元素中了,这样就完成了一次measure过程,接着子元素会重复父容器的measure,如此反复就完成了整个View树的遍历。同理,performLayout和performDraw也分别完成perfromMeasure类似的流程。通过这三大流程,分别遍历整棵View树,就实现了Measure,Layout,Draw这一过程,View就绘制出来了。那么我们就分别来追踪下RelativeLayout和LinearLayout这三大流程的执行耗时。
如下图,我们分别用两用种方式简单的实现布局测试下
LinearLayout Measure:0.738ms Layout:0.176ms draw:7.655ms RelativeLayout Measure:2.280ms Layout:0.153ms draw:7.696ms 从这个数据来看无论使用RelativeLayout还是LinearLayout,layout和draw的过程两者相差无几,考虑到误差的问题,几乎可以认为两者不分伯仲,关键是Measure的过程RelativeLayout却比LinearLayout慢了一大截。
(1)RelativeLayout会让子View调用2次onMeasure,LinearLayout 在有weight时,也会调用子View 2次onMeasure (2)RelativeLayout的子View如果高度和RelativeLayout不同,则会引发效率问题,当子View很复杂时,这个问题会更加严重。如果可以,尽量使用padding代替margin。 (3)在不影响层级深度的情况下,使用LinearLayout和FrameLayout而不是RelativeLayout。 (4)提高绘制性能的使用方式 根据上面源码的分析,RelativeLayout将对所有的子View进行两次measure,而LinearLayout在使用weight属性进行布局时也会对子View进行两次measure,如果他们位于整个View树的顶端时并可能进行多层的嵌套时,位于底层的View将会进行大量的measure操作,大大降低程序性能。因此,应尽量将RelativeLayout和LinearLayout置于View树的底层,并减少嵌套
ListView的优化
https://www.cnblogs.com/yuhanghzsd/p/5595532.html
图片三级缓存
https://blog.csdn.net/u012138137/article/details/50921209
大量图片放入内存会发生什么问题?应该如何解决
https://blog.csdn.net/caijunjun1006/article/details/10349581
项目
如何实现黑名单挂断电话功能 拦截电话需要的权限 CALL_PHONE
https://blog.csdn.net/u013895206/article/details/72683218/
如何显示应用APP列表
https://blog.csdn.net/da_caoyuan/article/details/52908797
Listview 如何进行分组
https://blog.csdn.net/zhang31jian/article/details/21230855
地图APP 关闭定位权限 还可以获取到位置吗
我的回答是 可以获取到的 因为 手机定位 分为 3种类型定位 有基站定位 网络定位 GPS定位。 精准度由低到高。如果没有 打开GPS 那么可以使用网络进行定位。并且我说了 三种定位方式的区别
1、GPS定位:根据设备GPS芯片和GPS卫星实现定位,GPS定位在室内是不可以使用的。GPS定位精度和芯片本身以及实际使用环境有关,一般情况下,GPS定位精度在10m左右。
2、基站定位:根据设备获取的基站信息实现定位,基站定位精度一般不受使用环境影响,主要和基站的覆盖半径有关。百度的基站定位服务精度目前在200m左右。
3、Wi-Fi定位:根据设备获取的Wi-Fi的信息进行定位,Wi-Fi定位精度一般不受使用环境影响,主要和Wi-Fi半径,密度有关。百度的Wi-Fi定位精度目前在20m左右。
视频播放器 如何获取本地的视频?
缓存文件和数据库文件 存在在哪个文件夹
打开DDMS 查看File Exploer data/data/对应的包文件夹/cache
数据库文件两种来源:
1.应用在使用过程中产生的数据。使用SQLiteDateBaseHelper去创建,保存在应用数据目录下:data/data/com.xx/databases/xx.db
2.作为预置数据,在本地电脑中创建SQLite数据库,然后放到项目assert或是res/raw目录下,然后在应用中将数据库copy到应用数据目录下
非ROOT手机 和 ROOT手机 能在DDMS 看到的文件夹有什么区别
手机文件data不用root无法查看。
原因如下:
-
为了安全,大部分安卓非root用户只有cache、system分区的读取权限,data分区无任何权限,因此无法查看。但是部分软件需要读取系统信息如芯片型号,因此开放了system的读取权限。
-
但为了存储数据,应用本身有data/data/该应用/文件夹的读写执行权限。如果要读取应用自身数据目录,如终端模拟器的数据目录,可以直接cd后ls列出。但是这个功能极少使用并且仅限终端类应用。
-
如果是想要提取data/app里的apk,可以用第三方软件通过系统特殊接口获取,无需root,但这样不包含数据。方便分享apk包或备份。