2019 上半年安卓面试题 34 道详解

作者: df556ada620a | 来源:发表于2019-06-24 22:43 被阅读2次

    这里根据一些群友的今年面试经历分享,以及参考网上的资料对 2019 上半年的Android 面试做一个总结。面向人群为 2-5 年左右经验,本篇PDF主要包含以下内容;(Activity,Https 协议,进程保活,Veiw,屏幕适配,内存优化,启动优化,热修复,Handler,Binder 以及 java 方面的 java 虚拟机,多线程,jvm,类加载等)

    PDF文档查看详细介绍;

    Android面试题

    1、Activity 生命周期? Android 的生命周期主要有七个,按其创建到销毁主要有

    以下几个阶段:onCreate() -> onStart() -> onResume() -> onPause() -> onStop() ->
    onDetroy()

    2、Service 生命周期?
    3、Activity 的启动过程
    4、Broadcast 注册方式与区别?什么情况下用动态注册?
    5、HttpClient 与 HttpUrlConnection 的区别
    6、java 虚拟机和 Dalvik 虚拟机的区别
    7、系统怎么进程保活(不死进程)

    此处延伸:进程的优先级是什么

    当前业界的 Android 进程保活手段主要分为 黑、白、灰 三种,其大致的实现思路如下:

    a.黑色保活:不同的 app 进程,用广播相互唤醒(包括利用系统提供的广播进行唤醒)
    b.白色保活:启动前台 Service
    c.灰色保活:利用系统的漏洞启动前台 Service
    黑色保活
    所谓黑色保活,就是利用不同的 app 进程使用广播来进行相互唤醒。举个 3 个比较常见的场景:

    场景 1:开机,网络切换、拍照、拍视频时候,利用系统产生的广播唤醒 app
    场景 2:接入第三方 SDK 也会唤醒相应的 app 进程,如微信 sdk 会唤醒微信,支
    付宝 sdk 会唤醒支付宝。由此发散开去,就会直接触发了下面的 场景 3
    场景 3:假如你手机里装了支付宝、淘宝、天猫、UC 等阿里系的 app,那么你打开任意一个阿里系的 app 后,有可能就顺便把其他阿里系的 app 给唤醒了。(只是拿阿里打个比方,其实 BAT 系都差不多)

    白色保活
    白色保活手段非常简单,就是调用系统 api 启动一个前台的 Service 进程,这样会在系统的通知栏生成一个 Notification,用来让用户知道有这样一个 app 在运行着,哪怕当前的 app 退到了后台。如下方的 LBE 和 QQ 音乐这样:

    灰色保活
    灰色保活,这种保活手段是应用范围最广泛。它是利用系统的漏洞来启动一个前台的 Service 进程,与普通的启动方式区别在于,它不会在系统通知栏处出现一个 Notification,看起来就如同运行着一个后台 Service 进程一样。这样做带来的好处就是,用户无法察觉到你运行着一个前台进程(因为看不到 Notification), 但你的进程优先级又是高于普通后台进程的。那么如何利用系统的漏洞呢,大致的实现思路和代码如下:

    思路一:API < 18,启动前台 Service 时直接传入 new Notification();
    思路二:API >= 18,同时启动两个 id 相同的前台 Service,然后再将后启动的 Service做 stop 处理

    熟悉 Android 系统的童鞋都知道,系统出于体验和性能上的考虑,app 在退到后台时系统并不会真正的 kill 掉这个进程,而是将其缓存起来。打开的应用越多,后台缓存的进程也越多。在系统内存不足的情况下,系统开始依据自身的一套进程回收机制来判断要 kill 掉哪些进程,以腾出内存来供给需要的 app。这套杀进程回收内存的机制就叫 Low Memory Killer ,它是基于 Linux 内核的 OOM Killer(Out-Of-Memory killer)机制诞生。

    进程的重要性,划分 5 级:
    前台进程 (Foreground process)
    可见进程 (Visible process)
    服务进程 (Service process)
    后台进程 (Background process)
    空进程 (Empty process)

    了解完 Low Memory Killer,再科普一下 oom_adj。什么是 oom_adj?它是 linux内核分配给每个系统进程的一个值,代表进程的优先级,进程回收机制就是根据这个优先级来决定是否进行回收。对于 oom_adj 的作用你只需要记住以下几点即可:

    进程的 oom_adj 越大,表示此进程优先级越低,越容易被杀回收;越小,表示进程优先级越高,越不容易被杀回收

    普通 app 进程的 oom_adj>=0,系统进程的 oom_adj 才可能<0

    有些手机厂商把这些知名的 app 放入了自己的白名单中,保证了进程不死来提高用户体验(如微信、QQ、陌陌都在小米的白名单中)。如果从白名单中移除,他们终究还是和普通 app 一样躲避不了被杀的命运,为了尽量避免被杀,还是老老实实去做好优化工作吧。

    所以,进程保活的根本方案终究还是回到了性能优化上,进程永生不死终究是个彻头彻尾的伪命题!

    8、讲解一下 Context
    9、理解 Activity,View,Window 三者关系
    10、四种 LaunchMode 及其使用场景

    此处延伸:栈(First In Last Out)与队列(First In First Out)的区别

    a 栈与队列的区别:
    b 队列先进先出,栈先进后出
    c 对插入和删除操作的"限定"。栈是限定只能在表的一端进行插入和删除操作的
    线性表。 队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性
    表。
    d 遍历数据速度不同

    standard 模式
    这是默认模式,每次激活 Activity 时都会创建 Activity 实例,并放入任务栈中。使
    用场景:大多数 Activity。

    11、简述 View 的绘制流程

    自定义控件:

    1、组合控件。这种自定义控件不需要我们自己绘制,而是使用原生控件组合成
    的新控件。如标题栏。
    2、继承原有的控件。这种自定义控件在原生控件提供的方法外,可以自己添加
    一些方法。如制作圆角,圆形图片。
    3、完全自定义控件:这个 View 上所展现的内容全部都是我们自己绘制出来的。
    比如说制作水波纹进度条。

    12、View,ViewGroup 事件分发
    13、保存 Activity 状态

    onSaveInstanceState(Bundle)会在 activity 转入后台状态之前被调用,也就是
    onStop()方法之前,onPause 方法之后被调用;

    14、Android 中的几种动画
    15、Android 中跨进程通讯的几种方式 Android 跨进程通信,像 intent,

    contentProvider,广播,service,Socket 都可以跨进程通信。
    intent:这种跨进程方式并不是访问内存的形式,它需要传递一个 uri,比如说打电
    话。
    contentProvider:这种形式,是使用数据共享的形式进行数据共享。
    service:远程服务,aidl
    广播

    16、AIDL 理解,并简述 Binder 机制
    17、Handler 的原理
    18、Binder 机制原理
    19、热修复的原理
    20、Android 内存泄露及管理

    (1)内存溢出(OOM)和内存泄露(对象无法被回收)的区别。
    (2)引起内存泄露的原因
    (3)内存泄露检测工具 ------>LeakCanary



    21、Fragment 与 Fragment、Activity 通信的方式

    1.直接在一个 Fragment 中调用另外一个 Fragment 中的方法
    2.使用接口回调
    3.使用广播
    4.Fragment 直接调用 Activity 中的 public 方法

    22、Android UI 适配

    字体使用 sp,使用 dp,多使用 match_parent,wrap_content,weight
    图片资源,不同图片的的分辨率,放在相应的文件夹下可使用百分比代替。

    23、app 优化

    app 优化:(工具:Hierarchy Viewer 分析布局 工具:TraceView 测试分析耗时的),
    app 优化主要从以下几个方面展开:

    App 启动优化
    布局优化
    响应优化
    内存优化
    电池使用优化
    网络优化

    App 启动优化(针对冷启动)


    优化;
    Application 的 onCreate(特别是第三方 SDK 初始化),首屏 Activity 的渲染都不要进行耗时操作,如果有,就可以放到子线程或者 IntentService 中

    24、图片优化

    (1)对图片本身进行操作。尽量不要使用 setImageBitmap、setImageResource、
    BitmapFactory.decodeResource 来设置一张大图,因为这些方法在完成 decode 后,
    最终都是通过 java 层的 createBitmap 来完成的,需要消耗更多内存. (2)图片进行缩放的比例,SDK 中建议其值是 2 的指数值,值越大会导致图片不清
    晰。
    (3)不用的图片记得调用图片的 recycle()方法。

    25、HybridApp WebView 和 JS 交互

    Android 与 JS 通过 WebView 互相调用方法,实际上是Android 去调用 JS 的代码;

    1.通过 WebView 的 loadUrl(),使用该方法比较简洁,方便。但是效率比较低,获
    取返回值比较困难。
    2.通过 WebView 的 evaluateJavascript(),该方法效率高,但是 4.4 以上的版本才支
    持,4.4 以下版本不支持。所以建议两者混合使用。

    JS 去调用 Android 的代码;

    26、Universal-ImageLoader,Picasso,Fresco,Glide 对比
    27、Xutils, OKhttp, Volley, Retrofit 对比

    Java 部分

    1、线程中sleep和wait的区别

    (1)这两个方法来自不同的类,sleep是来自Thread,wait是来自Object;
    (2)sleep方法没有释放锁,而wait方法释放了锁。
    (3)wait,notify,notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。

    2、Thread中的start()和run()方法有什么区别

    start()方法是用来启动新创建的线程,而start()内部调用了run()方法,这和直接调用run()方法是不一样的,如果直接调用run()方法,则和普通的方法没有什么区别。

    3、String,StringBuffer,StringBuilder区别

    1、三者在执行速度上:StringBuilder > StringBuffer > String (由于String是常量,不可改变,拼接时会重新创建新的对象)。
    2、StringBuffer是线程安全的,StringBuilder是线程不安全的。(由于StringBuffer有缓冲区).

    4、Java中重载和重写的区别:

    1、重载:一个类中可以有多个相同方法名的,但是参数类型和个数都不一样。这是重载。
    2、重写:子类继承父类,则子类可以通过实现父类中的方法,从而新的方法把父类旧的方法覆盖。

    5、Http https区别,并简述https的实现原理

    1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
    2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
    3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
    4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
    https实现原理:
    (1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
    (2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
    (3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
    (4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
    (5)Web服务器利用自己的私钥解密出会话密钥。
    (6)Web服务器利用会话密钥加密与客户端之间的通信。

    6、TCP和UDP的区别

    tcp是面向连接的,由于tcp连接需要三次握手,所以能够最低限度的降低风险,保证连接的可靠性。
    udp 不是面向连接的,udp建立连接前不需要与对象建立连接,无论是发送还是接收,都没有发送确认信号。所以说udp是不可靠的。
    由于udp不需要进行确认连接,使得UDP的开销更小,传输速率更高,所以实时行更好。

    7、Socket建立网络连接的步骤

    建立Socket连接至少需要一对套接字,其中一个运行与客户端--ClientSocket,一个运行于服务端--ServiceSocket;

    1、服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
    2、客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。注意:客户端的套接字必须描述他要连接的服务器的套接字,
    指出服务器套接字的地址和端口号,然后就像服务器端套接字提出连接请求。
    3、连接确认:当服务器端套接字监听到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述
    发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务端套接字则继续处于监听状态,继续接收其他客户端套接字的连接请求。

    关于面试专题PDF

    为了保障质量,这些面试题的筛选,以及答案的编写整理都耗费的很大的时间与精力。希望能对大家有帮助,需要这份原版的完整PDF,以及更多移动开发的面试与视频资料,可以查看本文首页的PDF获取

    相关文章

      网友评论

        本文标题:2019 上半年安卓面试题 34 道详解

        本文链接:https://www.haomeiwen.com/subject/kfyaqctx.html