在这2016年的尾巴上,迎接了人生第一次工作后的面试,虽然只是电话面试,还只有短短不到半小时,感觉还挺奇怪的。
这一年,过得又快,又慢。经历了很多刻骨铭心的事情。很多以为只能在电视剧中看到的事情发生在了我的身上。我想,这算是迟来的成人礼吧,让我见识到了人生的残酷与无奈,自己的弱小无知。借着总结面试问题的机会,顺便发发感慨,仅此纪念这一年中的人、事情,让我开了眼界,长了见识,多少也算是长大了一点吧。
割—————————————————————————————————————————————————————————————————————————
1、android四大组件相关
(1)activity与service的区别
答:1、从设计角度讲:
Android的Activity设计与Web页面非常类似,主要负责与用户进行交互。
Service则是在后台运行,默默为用户提供功能,进行调度和统筹。android的服务组件没有运行在独立的进程或线程中,它和其他的组件一样也在应用的主线程中运行,如果服务组件执行比较耗时的操作就会导致主线程阻塞或者假死,从而无法响应用户的操作。因此,耗时的操作不要放在UI线程中,因为UI 5s,广播10s就阻塞了,会ANR。
2、从使用角度讲:
Service不仅可以给Activity建立双向连接,为Activity提供数据和功能支持,也可以单向接受Intent的请求,进行数据的分析处理和功能调度。
3、从扮演角色讲:
Activity的功能比较单一,主要就是显示应用所具有的一些功能,帮助用户与应用进行交互。而Service可能扮演功能调度者也能扮演功能提供者,从触发器收集信息进行分析和处理,然后更新界面,修改数据或进行其他操作时是一种功能调度者。
(2)activity singletask启动,堆栈排布
abc排布,b为singletask启动模式,a启动b,则堆栈为bc。因为singletask模式会清空启动activity之前所有activity,将当前activity置顶。
(3)ContentProvider介绍
将一些特定的应用程序数据提供给其他应用程序使用。数据可以存储于文件系统、SQLite数据库或其他方式。内容提供者继承于ContentProvider基类,为其他应用程序取用和存储它管理的数据实现了一套标准方法。应用程序使用ContentResolver对象调用它的方法作为替代。
Android的数据存储方式总共有五种,分别是:Shared Preference、网络存储、文件存储、外储存储、SQLite。但是一般这些存储都只是在单独的一个应用程序中达到一个数据的共享,有时需要操作其他应用程序的数据,这时可以通过ContentProvider。
1、ContentProvider为存储和获取数据提供了统一的接口。ContentProvider对数据进行封装,不用关心数据存储的细节,使用表的形式来组织数据。
2、使用ContentProvider可以再不同的应用程序之间共享数据。
3、Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。
(4)service运行在什么线程,onstart,onbind等
主线程
2、截图后,微信点击+号,推荐截图图片,是什么机制?
3、线上收集OOM或NullPoint信息,如何收集并修复?
(1)将bug写文件后,定期上传到服务器。
(2)线上热修复:1、Dexposed 阿里手淘。2、AndFix 阿里支付宝。3、基于ClassLoader qq空间。
1、Dexposed:找到需要修复的Java函数对应的method对象,将它修改为native方法,把它的nativeFunc指向hookedMethodCallback。这样对这个java函数的调用就转为调用hookedMethodCallback这个native函数了,然后再用这个native函数回调java层自己实现的统一接口来处理。这个统一接口有beforeHookedMethod、afterHookedMethod和replaceHookedMethod等。
2、AndFix:使用虚拟机的JarFile加载的补丁文件,读取PATCH.MF文件得到补丁类名称;使用DexFile读取patch文件中的dex文件,获取后根据Annotation(注解)获取补丁方法;根据注解中获取到的类名和方法名,使用classLoader获取到Class,然后根据反射得到bug Method;使用C++中的指针替换bug方法对象的属性来修复bug。
3、基于ClassLoader:一个classLoader包含多个dex文件,每个dex文件是一个Element,多个dex文件排列成一个有序的数据dexElements,当找类的时候,会按顺序遍历dex文件,然后从当前遍历的dex文件中找类。而后,将patch.jar放在数组的第一位,这样当遍历findClass时,会首先找到修复的类从而替代有bug的类。但是存在CLASS_ISPREVERIFIED的问题,即在虚拟机启动的时候,当verify选项被打开的时候,如果static、private、构造函数等,其中的直接引用到的类都在同一个dex文件中,则该类会被打上CLASS_ISPREVERIFIED标志。热修复时要阻止该类打上标志。即让LoadBugClass在构造方法中引用别的dex文件。因此会需要重启应用。
4、JAVA内存回收机制
分为新区、旧区和永久区。
(1)新区:按8:1:1分为eden区和两个survivor区。大部分对象在eden区生成,回收时先将eden区存活复制到To区,清除eden和from区,生存时间长的复制到旧区。而后From区变为to区,投区变为from区。
(2)旧区:采用标记压缩算法回收。把所有可达对象搬迁到一端,然后直接清理掉端边界以外的内存。
(3)永久区:用了装载class、方法等信息,默认为64M,不会被回收。
5、Bitmap内存大小计算
长*宽*单位像素占用的字节数。Bitmap中有一个枚举类Config用了配置图片的压缩格式,代表每个像素是用多大的数据来存储的。Config.ALPHA_8是1byte。Config.RGB_565和Config.ARGB_4444都是2bytes,Config.ARGB_8888是4byte。