一、如何优化自定义View
- 在要在onDraw或是onLayout()中去创建对象,因为onDraw()方法可能会被频繁调用,可以在view的构造函数中进行创建对象;
- 降低view的刷新频率,尽可能减少不必要的调用invalidate()方法。或是调用带四种参数不同类型的invalidate(),而不是调用无参的方法。无参变量需要刷新整个view,而带参数的方法只需刷新指定部分的view。在onDraw()方法中减少冗余代码。
- 使用硬件加速,GPU硬件加速可以带来性能增加。
- 状态保存与恢复,如果因内存不足,Activity置于后台被杀重启时,View应尽可能保存自己属性,可以重写onSaveInstanceState和onRestoreInstanceState方法,状态保存。
二、低版本SDK如何实现高版本api?
使用@TargetApi注解·
当代码中有比AndroidManifest中设置的android:minSdkVersion版本更高的方法,此时编译器会提示警告,解决方法是在方法上加上@SuppressLint("NewApi")或者@TargetApi()。但它们仅是屏蔽了android lint错误,在方法中还要判断版本做不同的操作。
@SuppressLint("NewApi")屏蔽一切新api中才能使用的方法报的android lint错误
@TargetApi() 只屏蔽某一新api中才能使用的方法报的android lint错误,如@TargetApi(11)如果在方法中用了只有API14才开始有的方法,还是会报错。
三、描述一次网络请求的流程
1)域名解析
浏览器会先搜索自身DNS缓存且对应的IP地址没有过期;若未找到则搜索操作系统自身的DNS缓存;若还未找到则读本地的hotsts文件;还未找到会在TCP/IP设置的本地DNS服务器上找,如果要查询的域名在本地配置的区域资源中,则完成解析;否则根据本地DNS服务器会请求根DNS服务器;根DNS服务器是13台根DNS,会一级一级往下找。
2)TCP三次握手
客户端先发送SYN=1,ACK=0,序列号seq=x报文;(SYN在连接建立时用来同步序号,SYN=1,ACK=0代表这是一个连接请求报文,对方若同意建立连接,则应在响应报文中使SYN=1,ACK=1)
服务器返回SYN=1,ACK=1,seq=y, ack=x+1;
客户端再一次确认,但不用SYN了,回复服务端, ACK=1, seq=x+1, ack=y+1
3)建立TCP连接后发起HTTP请求
客户端按照指定的格式开始向服务端发送HTTP请求,HTTP请求格式由四部分组成,分别是请求行、请求头、空行、消息体,服务端接收到请求后,解析HTTP请求,处理完成逻辑,最后返回一个具有标准格式的HTTP响应给客户端。
4)服务器响应HTTP请求
服务器接收处理完请求后返回一个HTTP响应消息给客户端,HTTP响应信息格式包括:状态行、响应头、空行、消息体
5)浏览器解析HTML代码,请求HTML代码中的资源
浏览器拿到html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,向服务器发起一个http请求,如果返回304状态码,浏览器会直接读取本地的缓存文件。否则开启线程向服务器请求下载。
6)浏览器对页面进行渲染并呈现给用户
7)TCP的四次挥手
当客户端没有东西要发送时就要释放连接(提出中断连接可以是Client也可以是Server),客户端会发送一个FIN=1的没有数据的报文,进入FIN_WAIT状态,服务端收到后会给客户端一个确认,此时客户端不能发送数据,但可接收信息。
四、HttpUrlConnection 和 okhttp关系
两者都可以用来实现网络请求,android4.4之后的HttpUrlConnection的实现是基于okhttp
- Bitmap对象的理解
- looper架构
- ActivityThread,AMS,WMS的工作原理
- 自定义View如何考虑机型适配
在onMeasure()
的getDefaultSize()
的默认实现中,当view的测量模式是AT_MOST或EXACTLY时,View的大小都会被设置成子View MeasureSpe
c的specSize
.子view的MeasureSpec
值是根据子View的布局参数和父容器的MeasureSpec
值计算得来。当子view的布局参数是wrap_content时,对应的测量模式是AT_MOST,大小是parentSize
,
- 自定义View的事件
- AstncTask+HttpClient 与 AsyncHttpClient有什么区别?
- LaunchMode应用场景
- AsyncTask 如何使用?
- SpareArray原理
- 请介绍下ContentProvider 是如何实现数据共享的?
- AndroidService与Activity之间通信的几种方式
- IntentService原理及作用是什么?
原理:IntentService
是继承Service的一个抽象类,它在onCreate()
方法中创建了一个HandlerThread
,并启动该线程。HandlerThread
是带有自己消息队列和Looper
的线程,根据HandlerThread
的looper
创建一个Handler,这样IntentService
的ServiceHandler
的handleMessage()
方法就运行在子线程中。handleMessage
中调用了onHandleIntent()
方法,它是一个抽象方法,继承IntentService
类需要实现该方法,把耗时操作放在onHandleIntent()
方法中,等耗时操作运行完成后,会调用stopSelf()
方法,服务会调用onDestory()
方法消毁自己。如果onHandleIntent()
中的耗时操作未运行完前就调用了stopSelf()
方法,服务调用onDestory()
方法,但耗时操作会继续运行,直至运行完毕。如果同时多次启动IntentService
,任务会放在一个队列中,onCreate()
和onDestory()
方法都只会运行一次。
作用:用来处理后台耗时操作,如读取数据库或是本地文件等。
- 说说Activity、Intent、Service 是什么关系
- ApplicationContext和ActivityContext的区别
- SP是进程同步的吗?有什么方法做到同步?
- 谈谈多线程在Android中的使用
- 进程和 Application 的生命周期
- 封装View的时候怎么知道view的大小
- RecycleView原理
- AndroidManifest的作用与理解
漫漫开发之路,我们只是其中的一小部分……只有不断的学习、进阶,才是我们的出路!才跟得上时代的进步!
今年年初我花一个月的时间收录整理了一套知识体系,如果有想法深入的系统化的去学习的,可以私信我【学习】,我会把我收录整理的资料都送给大家,帮助大家更快的进阶。