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

第一部分:基础知识延伸

一、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

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

十四、ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化?
十五、点击事件被拦截,但是想传到下面的View,如何操作?
十六、微信主页面的实现方式
十七、微信上消息小红点的原理

二十.数据库性能优化:索引和事务,需要找本专门的书大概了解一下

第二部分:图片处理

一、图片库Glide的源码分析
二、Glide图片框架缓存实现,Glide内存缓存如何控制大小?
三、Glide LRUCache原理?
四、图片加载原理
五、自己去实现图片库,怎么做?
六、Bitmap 使用时候注意什么?
七、、Bitmap的recycler()
八.Bitmap的处理
1.当使用ImageView的时候,可能图片的像素大于ImageView,此时就可以通过BitmapFactory.Option来对图片进行压缩,inSampleSize表示缩小2^(inSampleSize-1)倍。
2.BitMap的缓存:
1).使用LruCache进行内存缓存。
2).使用DiskLruCache进行硬盘缓存。
3.实现一个ImageLoader的流程:同步异步加载、图片压缩、内存硬盘缓存、网络拉取
1).同步加载只创建一个线程然后按照顺序进行图片加载
2).异步加载使用线程池,让存在的加载任务都处于不同线程
3).为了不开启过多的异步任务,只在列表静止的时候开启图片加载
九、Android中开启摄像头的主要步骤

第三部分:网络和安全机制

十五、HttpClient与HttpUrlConnection的区别

此处延伸:Volley里用的哪种请求方式(2.3前HttpClient,2.3后HttpUrlConnection)

首先HttpClient和HttpUrlConnection 这两种方式都支持Https协议,都是以流的形式进行上传或者下载数据,也可以说是以流的形式进行数据的传输,还有ipv6,以及连接池等功能。HttpClient这个拥有非常多的API,所以如果想要进行扩展的话,并且不破坏它的兼容性的话,很难进行扩展,也就是这个原因,Google在Android6.0的时候,直接就弃用了这个HttpClient.

而HttpUrlConnection相对来说就是比较轻量级了,API比较少,容易扩展,并且能够满足Android大部分的数据传输。比较经典的一个框架volley,在2.3版本以前都是使用HttpClient,在2.3以后就使用了HttpUrlConnection。

二十八、描述一次网络请求的流程
二十九、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升级,增加字段的语句
数据库框架对比和源码分析
数据库的优化
数据库数据迁移问题

第五部分: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.如果程序的内存在硬盘上,那么就需要用页置换算法来将其调入内存中:先进先出、最近未使用最少等等

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值