说起咱们程序员,那可是有三个等级,分别是初、中、高。
而大部分人,都蹲在初级这里和每年进入人才市场的毕业生一起感慨:市场饱和就业难。
初级程序员是饱和了,但是高级程序员呢?简直是稀缺。如果一直停留在初级程序员的水平,什么高薪程序员一月收入20k,那只有盖上被子在梦里实现了。
而中高级,并没有想象中的那么难,这里有三十三道AndroID中高级面试题,看完解析之后,你会发现不是我学不会,而是我没有去学
#题目加解析
1、Activity生命周期?onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy()
####2、Service生命周期?service
启动方式有两种
一种是通过startService()
方式进行启动
另一种是通过bindService()
方式进行启动。
不同的启动方式他们的生命周期是不一样.
通过startService()
这种方式启动的service
生命周期是这样:
调用startService() --> onCreate()--> onStartConmon()--> onDestroy()
。
这种方式启动的话,需要注意一下几个问题
第一:当我们通过startService
被调用以后,多次在调用startService(),onCreate()
方法也只会被调用一次,而onStartConmon()
会被多次调用,当我们调用stopService()
的时候,onDestroy()
就会被调用,从而销毁服务。
第二:当我们通过startService
启动时候,通过intent传值,在onStartConmon()
方法中获取值的时候,一定要先判断intent
是否为null
。
通过bindService()
方式进行绑定,这种方式绑定service
生命周期:bindService-->onCreate()-->onBind()-->unBind()-->onDestroy()
bindservice
这种方式进行启动service
好处是更加便利activity
中 *** 作service
,如果要在activity
中调用,在需要在activity
获取ServiceConnection
对象,通过ServiceConnection
来获取service
中内部类的类对象,然后通过这个类对象就可以调用类中的方法,当然这个类需要继承Binder对象
此处延伸:什么情况下用动态注册
broadcast
广播,注册方式主要有两种.
第一种是静态注册,也可成为常驻型广播,这种广播需要在AndroIDmanifest.xml
中进行注册,这中方式注册的广播,不受页面生命周期的影响,即使退出了页面,也可以收到广播这种广播一般用于想开机自启动啊等等,由于这种注册的方式的广播是常驻型广播,所以会占用cpu的资源。
第二种是动态注册,而动态注册的话,是在代码中注册的,这种注册方式也叫非常驻型广播,受到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新UI方面。这种注册方式优先级较高。最后需要解绑,否会会内存泄露
广播是分为有序广播和无序广播。
5、httpClIEnt与httpUrlConnection的区别此处延伸:Volley
里用的哪种请求方式
首先httpClIEnt
和httpUrlConnection
这两种方式都支持https协议,都是以流的形式进行上传或者下载数据,也可以说是以流的形式进行数据的传输,还有ipv6
,以及连接池等功能。httpClIEnt
这个拥有非常多的API,所以如果想要进行扩展的话,并且不破坏它的兼容性的话,很难进行扩展,也就是这个原因,Google
在AndroID6.0
的时候,直接就弃用了这个httpClIEnt
.
而httpUrlConnection
相对来说就是比较轻量级了,API比较少,容易扩展,并且能够满足AndroID
大部分的数据传输。比较经典的一个框架volley
,在AndroID 2.3
版本以前都是使用AndroID httpClIEnt
,在AndroID 2.3
以后就使用了httpUrlConnection
Java虚拟机:
1、java
虚拟机基于栈。
基于栈的机器必须使用指令来载入和 *** 作栈上数据,所需指令更多更多。
2、java
虚拟机运行的是java
字节码。java
类会被编译成一个或多个字节码.class
文件.
Dalvik虚拟机:
1、dalvik
虚拟机是基于寄存器的
2、Dalvik
运行的是自定义的.dex
字节码格式。
java类被编译成.class
文件后,会通过一个dx
工具将所有的.class文件转换成一个.dex
文件,然后dalvik
虚拟机会从其中读取指令和数据.
3、常量池已被修改为只使用32
位的索引,以 简化解释器。
4、一个应用,一个虚拟机实例,一个进程
所有androID
应用的线程都是对应一个linux
线程,都运行在自己的沙盒中,不同的应用在不同的进程中运行。每个androID dalvik
应用程序都被赋予了一个独立的linux PID(app_*)
####13、保存Activity状态onSaveInstanceState(Bundle)
会在activity
转入后台状态之前被调用,也就是onStop()
方法之前,onPause
方法之后被调用;
####14、AndroID中的几种动画
帧动画:
指通过指定每一帧的图片和播放时间,有序的进行播放而形成动画效果,比如想听的律动条。
补间动画:
指通过指定VIEw
的初始状态、变化时间、方式,通过一系列的算法去进行图形变换,从而形成动画效果,主要有Alpha
、Scale
、Translate
、Rotate
四种效果。
注意:只是在视图层实现了动画效果,并没有真正改变VIEw
的属性,比如滑动列表,改变标题栏的透明度。
属性动画:
在AndroID3.0
的时候才支持,通过不断的改变VIEw
的属性,不断的重绘而形成动画效果。相比于视图动画,VIEw
的属性是真正改变了。比如vIEw
的旋转,放大,缩小。
####15、AndroID中跨进程通讯的几种方式AndroID
跨进程通信,像intent
,contentProvIDer
,广播,service
都可以跨进程通信。
intent:
这种跨进程方式并不是访问内存的形式,它需要传递一个uri
,比如说打电话。
contentProvIDer:
这种形式,是使用数据共享的形式进行数据共享。
service:
远程服务,比如aIDl
广播:
广播 包含静态广播,动态广播。
AndroID
中主线程是不能进行耗时 *** 作的,子线程是不能进行更新UI
的。所以就有了handler
,它的作用就是实现线程之间的通信。
handler整个流程中,主要有四个对象,handler
,Message
,MessageQueue
,Looper
。当应用创建的时候,就会在主线程中创建handler
对象,
我们通过要传送的消息保存到Message
中,handler
通过调用sendMessage
方法将Message
发送到MessageQueue
中,Looper
对象就会不断的调用loop()方法
不断的从MessageQueue
中取出Message
交给handler
进行处理。从而实现线程之间的通信。
在AndroID
系统的Binder
机制中,是有ClIEnt
,Service
,ServiceManager
,Binder
驱动程序组成的,其中ClIEnt
,service
,Service Manager
运行在用户空间,Binder
驱动程序是运行在内核空间的。而Binder
就是把这4种组件粘合在一块的粘合剂,其中核心的组件就是Binder
驱动程序,Service Manager
提供辅助管理的功能,而ClIEnt
和Service
正是在Binder
驱动程序和Service Manager
提供的基础设施上实现C/S
之间的通信。其中Binder
驱动程序提供设备文件/dev/binder
与用户控件进行交互,ClIEnt
、Service
,Service Manager
通过open
和ioctl
文件 *** 作相应的方法与Binder
驱动程序进行通信。而ClIEnt
和Service
之间的进程间通信是通过Binder
驱动程序间接实现的。而Binder Manager
是一个守护进程,用来管理Service
,并向ClIEnt
提供查询Service
接口的能力。
我们知道 Java
虚拟机 —— JVM
是加载类的class
文件的,而AndroID
虚拟机——Dalvik/ART VM
是加载类的dex
文件,而他们加载类的时候都需要ClassLoader
,ClassLoader
有一个子BaseDexClassLoader
,而BaseDexClassLoader
下有一个数组——DexPathList
,是用来存放dex
文件,当BaseDexClassLoader
通过调用findClass
方法时,实际上就是遍历数组,找到相应的dex
文件,找到,则直接将它return
。而热修复的解决方法就是将新的dex
添加到该集合中,并且是在旧的dex
的前面,所以就会优先被取出来并且return
返回。
`
字体使用sp
,dp
,多使用match_parent,wrap_content,weight
图片资源,不同图片的的分辨率,放在相应的文件夹下可使用百分比代替。
(1)对图片本身进行 *** 作。
尽量不要使用setimageBitmap
、setimageResource
、BitmapFactory.decodeResource
来设置一张大图,因为这些方法在完成decode
后,最终都是通过 java
层的 createBitmap
来完成的,需要消耗更多内存.
(2)图片进行缩放的比例,SDK
中建议其值是2
的指数值,值越大会导致图片不清晰。
(3)不用的图片记得调用图片的recycle()
方法
垃圾收集算法的核心思想是:
对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。垃圾收集算法的选择和垃圾收集系统参数的合理调节直接影响着系统性能。
ANR
全名Application Not Responding
, 也就是"应用无响应". 当 *** 作在一段时间内系统无法处理时, 系统层面会d出上图那样的ANR
对话框.
产生原因:
(1)5s
内无法响应用户输入事件(例如键盘输入, 触摸屏幕等).
(2)broadcastReceiver
在10s内无法结束
(3)Service 20s
内无法结束(低概率)
解决方式:
(1)不要在主线程中做耗时的 *** 作,而应放在子线程中来实现。如onCreate()和onResume()
里尽可能少的去做创建 *** 作。
(2)应用程序应该避免在broadcastReceiver
里做耗时的 *** 作或计算。
(3)避免在Intent Receiver
里启动一个Activity
,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。
(4)service
是运行在主线程的,所以在service
中做耗时 *** 作,必须要放在子线程中。
(1)安装和下载Cygwin
,下载 AndroID NDK
(2)在ndk
项目中JNI
接口的设计
(3)使用C/C++
实现本地方法
(4)JNI
生成动态链接库.so
文件
(5)将动态链接库复制到java
工程,在java
工程中调用,运行java
工程即可
RecyclerVIEw
可以完成ListVIEw
,GrIDVIEw
的效果,还可以完成瀑布流的效果。同时还可以设置列表的滚动方向(垂直或者水平);RecyclerVIEw
中vIEw
的复用不需要开发者自己写代码,系统已经帮封装完成了。RecyclerVIEw
可以进行局部刷新。RecyclerVIEw
提供了API
来实现item
的动画效果。
在性能上:
如果需要频繁的刷新数据,需要添加动画,则RecyclerVIEw
有较大的优势。
如果只是作为列表展示,则两者区别并不是很大。
##最后
篇幅有限,解释起来太长了,就看这里好的文档吧
链接:https://pan.baIDu.com/s/1dYDPMNw5GMTVXvzJ2EeINg
提取码:mk53
点赞收藏分享文章举报阿尔法789发布了88 篇原创文章 · 获赞 3 · 访问量 4667私信 关注 总结还可以来我的GitHub交友地址:https://github.com/Meng997998/AndroidJX,点下star一起来学习呗
以上是内存溢出为你收集整理的面试三十三题!说实话,中高级面试题看完解析后也不怎么难!全部内容,希望文章能够帮你解决面试三十三题!说实话,中高级面试题看完解析后也不怎么难!所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)