Android面试汇总-Android延伸知识面试

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yaoming168/article/details/88952701

一、ListView 中图片错位的问题是如何产生的?

  1. listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作。
  2. 如果不重用 convertView 不会出现错位现象, 重用 convertView 但没有异步操作也不会有问题。

参考答案:https://www.cnblogs.com/lesliefang/p/3619223.html

二、屏幕适配的处理技巧都有哪些?

  1. 开发前部分阶段:比如尽量不用AbsoluteLayout(绝对布局),多用线性布局与相对布局,设置宽高边距等尺寸用dp(dip),不要用px。开发调试选择主流屏幕(1280x720)。
  2. 开发后阶段:在不同分辨率手机上测试,没有大问题才可以发布上线使用。
  3. 出现问题解决方法:
    1)、图片适配
    图片在不同屏幕手机上出现偏差、失侦等情况,很简单,让UI给你多切几套图,放在res目录下的drawable-hdpi、drawable-mdpi、drawable- xhdpi、drawable-xxhdpi、drawable-xxxhdpi,这几个目录分别对应不同的屏幕,当不同屏幕启动App时候会优先去访问其对应的目录下的图片 资源,如果对应下面没有才回去访问其他的目录。
    2)、布局适配
    其原理和图片适配差不多,就是当不同屏幕上同一个布局文件不能满足需求,比如大屏幕需要做特殊显示这种,此时就在res目录下新建一个文件夹 layout-800x480(适配480800的屏幕,其他屏幕同样方法新建即可),然后在里面去对进行指定的设置布局文件了。
    3)、尺寸适配
    这里先介绍一个概率:设备密度(dp和px的转换关系,dp=px/设备密度);320
    240(0.75), 480320(1),480800(1.5),1280720(2)这是主流几大屏幕对应的设备密度。
    一般在开发者,美工UI给我们的都是PX,我们在设置的时候就不能还自己把PX缓存DP这么简单了,比如说,美工在1280
    720上面切了一套图,给出的某个控件宽100px,那么此时我们在布局文件设置就应该设置为50dp(100/设备密度);在一些需求中,不同屏幕需要设置不同的尺寸,此时可以新建一个values-(分辨率)这样的目录,在其下面有一个dimens文件(在原values下的dimens也要设置),在里面进行尺寸设置然后再布局里面调用即可,同样的道理,手机访问App当调用values里面的文件时会优先调优和自己对应的文件。
    4)、权重适配
    线性布局才能够设置权重。在LinearLayout属性设置里面可以设置总权重android:weightSum;然后在里面的空间去分配权重,这样不管在什么手机,都是按照权重比例来进行显示的。
    5)、代码适配
    代码适配类似于权重适配,权重适配可以用代码适配来实现,但是代码适配就不一定能够用权重适配来实现,比如相对布局不能用权重,就可以代码来控制。实现原理是:计算屏幕宽高,动态的来设置空间宽高。一般根据比例去计算,比如侧滑菜单和主界面分别的比例,此时就可以这样动态去计算
DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
int whdth = dm.widthPixels;//获取屏幕宽度
int height = dm.heightPixels;//获取屏幕高度

三、动态权限适配方案,权限组的概念
参考答案:https://blog.csdn.net/yuguqinglei/article/details/80375702

四、下拉状态栏是不是影响activity的生命周期

十、如果在onStop的时候做了网络请求,onResume的时候怎么恢复?
恢复的是网络请求暂停后恢复?还是页面更新?
stop的时候请求被暂停,onstart的时候检测重新恢复请求即可
如果是恢复页面请求后的页面数据,分两种,1 activity被销毁,那么使用saveInstanceState存储数据,onRestoreInstanceState()恢复数据,2,没有被销毁,那就不需要恢复

十三、Android中开启摄像头的主要步骤
十四、ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化?
十五、点击事件被拦截,但是想传到下面的View,如何操作?
十六、微信主页面的实现方式
十七、微信上消息小红点的原理
十八、CAS介绍(这是阿里巴巴的面试题,我不是很了解,可以参考博客: CAS简介)
十九.Bitmap的处理
1.当使用ImageView的时候,可能图片的像素大于ImageView,此时就可以通过BitmapFactory.Option来对图片进行压缩,inSampleSize表示缩小2^(inSampleSize-1)倍。
2.BitMap的缓存:
1).使用LruCache进行内存缓存。
2).使用DiskLruCache进行硬盘缓存。
3.实现一个ImageLoader的流程:同步异步加载、图片压缩、内存硬盘缓存、网络拉取
1).同步加载只创建一个线程然后按照顺序进行图片加载
2).异步加载使用线程池,让存在的加载任务都处于不同线程
3).为了不开启过多的异步任务,只在列表静止的时候开启图片加载
二十.数据库性能优化:索引和事务,需要找本专门的书大概了解一下
第一部分、图片

图片库对比
图片库的源码分析
图片框架缓存实现
LRUCache原理
图片加载原理
自己去实现图片库,怎么做?
Glide源码解析
Glide使用什么缓存?
Glide内存缓存如何控制大小?
十一、Bitmap 使用时候注意什么?
十二、Bitmap的recycler()

第二部分、网络和安全机制

二十八、描述一次网络请求的流程
二十九、HttpUrlConnection 和 okhttp关系

一、浏览器输入地址到返回结果发生了什么
1.DNS解析
2.TCP连接
3.发送HTTP请求
4.服务器处理请求并返回HTTP报文
5.浏览器解析渲染页面
6.连接结束
27.网络
1.ARP协议:在IP以太网中,当一个上层协议要发包时,有了该节点的IP地址,ARP就能提供该节点的MAC地址。
2.HTTP HTTPS的区别:
1.HTTPS使用TLS(SSL)进行加密
2.HTTPS缺省工作在TCP协议443端口
3.它的工作流程一般如以下方式:
1.完成TCP三次同步握手
2.客户端验证服务器数字证书,通过,进入步骤3
3.DH算法协商对称加密算法的密钥、hash算法的密钥
4.SSL安全加密隧道协商完成
5.网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性;用协商的hash算法进行数据完整性保护,保证数据不被篡改
3.http请求包结构,http返回码的分类,400和500的区别
1.包结构:
1.请求:请求行、头部、数据
2.返回:状态行、头部、数据
2.http返回码分类:1到5分别是,消息、成功、重定向、客户端错误、服务端错误
4.Tcp
1.可靠连接,三次握手,四次挥手
1.三次握手:防止了服务器端的一直等待而浪费资源,例如只是两次握手,如果s确认之后c就掉线了,那么s就会浪费资源
1.syn-c = x,表示这消息是x序号
2.ack-s = x + 1,表示syn-c这个消息接收成功。syn-s = y,表示这消息是y序号。
3.ack-c = y + 1,表示syn-s这条消息接收成功
2.四次挥手:TCP是全双工模式
1.fin-c = x , 表示现在需要关闭c到s了。ack-c = y,表示上一条s的消息已经接收完毕
2.ack-s = x + 1,表示需要关闭的fin-c消息已经接收到了,同意关闭
3.fin-s = y + 1,表示s已经准备好关闭了,就等c的最后一条命令
4.ack-c = y + 1,表示c已经关闭,让s也关闭
3.滑动窗口,停止等待、后退N、选择重传
4.拥塞控制,慢启动、拥塞避免、加速递减、快重传快恢复

30.网络劫持的类型原理:可以百度一下了解一下具体概念

6、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服务器利用会话密钥加密与客户端之间的通信。

7、Http位于TCP/IP模型中的第几层?为什么说Http是可靠的数据传输协议?

tcp/ip的五层模型:

从下到上:物理层->数据链路层->网络层->传输层->应用层

其中tcp/ip位于模型中的网络层,处于同一层的还有ICMP(网络控制信息协议)。http位于模型中的应用层

由于tcp/ip是面向连接的可靠协议,而http是在传输层基于tcp/ip协议的,所以说http是可靠的数据传输协议。

8、HTTP链接的特点

HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。

从建立连接到关闭连接的过程称为“一次连接”。

9、TCP和UDP的区别

tcp是面向连接的,由于tcp连接需要三次握手,所以能够最低限度的降低风险,保证连接的可靠性。

udp 不是面向连接的,udp建立连接前不需要与对象建立连接,无论是发送还是接收,都没有发送确认信号。所以说udp是不可靠的。

由于udp不需要进行确认连接,使得UDP的开销更小,传输速率更高,所以实时行更好。

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

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

1、服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

2、客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。注意:客户端的套接字必须描述他要连接的服务器的套接字,

指出服务器套接字的地址和端口号,然后就像服务器端套接字提出连接请求。

3、连接确认:当服务器端套接字监听到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述

发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务端套接字则继续处于监听状态,继续接收其他客户端套接字的连接请求。

11、Tcp/IP三次握手,四次挥手

网络框架对比和源码分析
自己去设计网络请求框架,怎么做?
okhttp源码
网络请求缓存处理,okhttp如何处理网络缓存的
从网络加载一个10M的图片,说下注意事项
TCP的3次握手和四次挥手
TCP与UDP的区别
TCP与UDP的应用
HTTP协议
HTTP1.0与2.0的区别
HTTP报文结构
HTTP与HTTPS的区别以及如何实现安全性
如何验证证书的合法性?
https中哪里用了对称加密,哪里用了非对称加密,对加密算法(如RSA)等是否有了解?
client如何确定自己发送的消息被server收到?
谈谈你对WebSocket的理解
WebSocket与socket的区别
谈谈你对安卓签名的理解。
请解释安卓为啥要加签名机制?
视频加密传输
App 是如何沙箱化,为什么要这么做?
权限管理系统(底层的权限是如何进行 grant 的)?
第三部分、数据库

sqlite升级,增加字段的语句
数据库框架对比和源码分析
数据库的优化
数据库数据迁移问题
第四部分、插件化、模块化、组件化、热修复、增量更新、Gradle
对热修复和插件化的理解
插件化原理分析
模块化实现(好处,原因)
热修复,插件化
项目组件化的理解
描述清点击 Android Studio 的 build 按钮后发生了什么
第五部分、NDK、jni、Binder、AIDL、进程通信有关

自己开发一个nkd项目
1、创建一个项目
2、创建 JNI目录
3、编写native java 层方法
4、生成JNI头文件
1)、编写java Native代码
2)、介绍一个命令javah
3)、添加android.jar包到环境变量

四十六、JNI
(1)安装和下载Cygwin,下载 Android NDK
(2)在ndk项目中JNI接口的设计
(3)使用C/C++实现本地方法
(4)JNI生成动态链接库.so文件
(5)将动态链接库复制到java工程,在java工程中调用,运行java工程即可

请介绍一下NDK
什么是NDK库?
jni用过吗?
如何在jni中注册native函数,有几种注册方式?
Java如何调用c、c++语言?
jni如何调用java层代码?
进程间通信的方式?
Binder机制
简述IPC?
什么是AIDL?
AIDL解决了什么问题?
AIDL如何使用?
Android 上的 Inter-Process-Communication 跨进程通信时如何工作的?
多进程场景遇见过么?
Android进程分类?
进程和 Application 的生命周期?
进程调度
谈谈对进程共享和线程安全的认识
谈谈对多进程开发的理解以及多进程应用场景

三十八.操作系统进程和线程的区别
1.简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
2.线程的划分尺度小于进程,使得多线程程序的并发性高。
3.另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
4.多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配
第六部分、framework层、ROM定制、Ubuntu、Linux之类的问题

一、系统启动流程是什么?(提示:Zygote进程 –> SystemServer进程 –> 各种系统服务 –> 应用进程)
二、大体说清一个应用程序安装到手机上时发生了什么
三、简述Activity启动全部过程
四、App启动流程,从点击桌面开始
五、逻辑地址与物理地址,为什么使用逻辑地址?
六、Android为每个应用程序分配的内存大小是多少?
七、Android中进程内存的分配,能不能自己分配定额内存?
八、进程保活的方式
九、如何保证一个后台服务不被杀死?(相同问题:如何保证service在后台不被kill?)比较省电的方式是什么?
参考答案:https://blog.csdn.net/mad1989/article/details/22492519
https://www.cnblogs.com/wzjhoutai/p/7105038.html
十、App中唤醒其他进程的实现方式
参考答案:
https://blog.csdn.net/wapchief/article/details/79657026
https://blog.csdn.net/jimtrency/article/details/78720611
十一、操作系统如何管理内存的:
1.使用寄存器进行将进程地址和物理内存进行映射
2.虚拟内存进行内存映射到硬盘上增大内存
3.虚拟内存是进行内存分页管理
4.页表实现分页,就是 页+地址偏移。
5.如果程序的内存在硬盘上,那么就需要用页置换算法来将其调入内存中:先进先出、最近未使用最少等等

猜你喜欢

转载自blog.csdn.net/yaoming168/article/details/88952701