Android中⾼级⾯试题合集,含答案
⾯试的时候总会遇到⼀些各种各样的⾯试题,⽽且这些⾯试题很多都是关于平时容易疏忽的理论⽅⾯的,所以整理⼀份Android⾼级开发⼯程师⾯试集锦,对照这些问题进⾏复习,将会事半功倍。从基础到中级在⾼级,从Android到java,记录下来有需要的时候多复习复习,也希望能帮到有需要的你。
Android部分
1、Activity⽣命周期?
2、Service⽣命周期?
3、Activity的启动过程
4、Broadcast注册⽅式与区别
HttpClient与HttpUrlConnection的区别
6、java虚拟机和Dalvik虚拟机的区别
7、进程保活(不死进程)
8、讲解⼀下Context
9、理解Activity,View,Window三者关系
10、四种LaunchMode及其使⽤场景
11、View的绘制流程
12、View,ViewGroup事件分发
13、保存Activity状态
google官方下载app14、Android中的⼏种动画
15、Android中跨进程通讯的⼏种⽅式
16、AIDL理解
17、Handler的原理
18、Binder机制原理
19、热修复的原理
20、Android内存泄露及管理
内存泄露原因:
⼀、Handler 引起的内存泄漏。
⼆、单例模式引起的内存泄漏。
三、⾮静态内部类创建静态实例引起的内存泄漏。
四、⾮静态匿名内部类引起的内存泄漏。
五、注册/反注册未成对使⽤引起的内存泄漏。
六、资源对象没有关闭引起的内存泄漏。
七、集合对象没有及时清理引起的内存泄漏。
21、Fragment与Fragment、Activity通信的⽅式
22、Android UI适配
23、app优化
24、图⽚优化
25、HybridApp WebView和JS交互
26、JAVA GC原理
27、ANR
解决⽅式:
28、单例模式
29、RxJava
30、MVC,MVP,MVVM
⼀、MVC(Model-View-Controller)
⼆、MVP(Model-View-Presenter)
三、MVVM(Model-View-ViewModel)
31、⼿写算法(选择冒泡必须要会)
*选择法排序
冒泡排序
⼆分查询
32、JNI
33、RecyclerView和ListView的区别
34、Universal-ImageLoader,Picasso,Fresco,Glide对⽐
Fresco
Universal-ImageLoader
Picasso
Glide
42、Xutils, OKhttp, Volley, Retrofit对⽐
Java部分
1、线程中sleep和wait的区别
2、Thread中的start()和run()⽅法有什么区别
3、关键字final和static是怎么使⽤的。
final:
static:
4、String,StringBuffer,StringBuilder区别
5、Java中重载和重写的区别:
6、Http https区别
7、Http位于TCP/IP模型中的第⼏层?为什么说Http是可靠的数据传输协议?
8、HTTP链接的特点
9、TCP和UDP的区别
10、Socket建⽴⽹络连接的步骤
11、Tcp/IP三次握⼿,四次挥⼿
Android部分
1、Activity⽣命周期?
onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy()
2、Service⽣命周期?
service 启动⽅式有两种,⼀种是通过startService()⽅式进⾏启动,另⼀种是通过bindService()⽅式进⾏启动。不同的启动⽅式他们的⽣命周期是不⼀样.
1. 通过startService()这种⽅式启动的service,⽣命周期是这样:调⽤startService() → onCreate()→ onStartCommand()→
onDestroy()。这种⽅式启动的话,需要注意⼀下⼏个问题:
当我们通过startService被调⽤以后,多次在调⽤startService(),onCreate()⽅法也只会被调⽤⼀次,⽽onStartConmon()会被多次调⽤当我们调⽤stopService()的时候,onDestroy()就会被调⽤,从⽽销毁服务。
当我们通过startService启动时候,通过intent传值,在onStartCommand()⽅法中获取值的时候,⼀定要先判断intent是否为null。
2. 通过bindService()⽅式进⾏绑定,这种⽅式绑定service,⽣命周期⾛法:bindService→onCreate()→onBind()→unBind()→onDestroy()
,bindService这种⽅式进⾏启动service好处是更加便利activity中操作service,⽐如加⼊service中有⼏个⽅法,a,b ,如果要在activity中调⽤,在需要在activity获取ServiceConnection对象,通过ServiceConnection来获取service中内部类的类对象,然后通过这个类对象就可以调⽤类中的⽅法,当然这个类需要继承Binder对象
3、Activity的启动过程
这个题不是问的⽣命周期,所以不要只简单的回答下⽣命周期就没了。
app启动的过程有两种情况,第⼀种是从桌⾯launcher上点击相应的应⽤图标,第⼆种是在activity中通过调⽤startActivity来启动⼀个新的activity。
我们创建⼀个新的项⽬,默认的根activity都是MainActivity,⽽所有的activity都是保存在堆栈中的,我们启动⼀个新的activity就会放在上⼀个activity上⾯,⽽我们从桌⾯点击应⽤图标的时候,由于launcher本⾝也是⼀个应⽤,当我们点击图标的时候,系统就会调⽤
startActivitySately(),⼀般情况下,我们所启动的activity的相关信息都会保存在intent中,⽐如action,category等等。
我们在安装这个应⽤的时候,系统也会启动⼀个PackaManagerService的管理服务,这个管理服务会对l⽂件进⾏解析,从⽽得到应⽤程序中的相关信息,⽐如service,activity,Broadcast等等,然后获得相关组件的信息。当我们点击应⽤图标的时候,就会调⽤startActivitySately()⽅法,⽽这个⽅法内部则是调⽤startActivty(),⽽startActivity()⽅法最终还是会调⽤startActivityForResult()这个⽅法。⽽在startActivityForResult()这个⽅法。
因为startActivityForResult()⽅法是有返回结果的,所以系统就直接给⼀个-1,就表⽰不需要结果返回了。⽽startActivityForResult()这个⽅法实际是通过Instrumentation类中的execStartActivity()⽅法来启动activity,Instrumentation这个类主要作⽤就是监控程序和系统之间的交互。⽽在这个execStartActivity()⽅法中会获取ActivityManagerService的代理对象,通过这个代理对象进⾏启动activity。
启动会就会调⽤⼀个checkStartActivityResult()⽅法,如果说没有在配置清单中配置有这个组件,就会在这个⽅法中抛出异常了。当然最后是调⽤的是Application.scheduleLaunchActivity()进⾏启动activity,⽽这个⽅法中通过获取得到⼀个ActivityClientRecord对象,⽽这个ActivityClientRecord通过handler来进⾏消息的发送,系统内部会将每⼀个activity组件使⽤ActivityClientRecord对象来进⾏描述,⽽ActivityClientRecord对象中保存有⼀个LoaderApk对象,通过这个对象调⽤handleLaunchActivity来启动activity组件,⽽页⾯的⽣命周期⽅法也就是在这个⽅法中进⾏调⽤。
4、Broadcast注册⽅式与区别
Broadcast⼴播,注册⽅式主要有两种.
第⼀种是静态注册,也可称为常驻型⼴播,这种⼴播需要在l中进⾏注册,这中⽅式注册的⼴播,不受页⾯⽣命周期的影响,即使退出了页⾯,也可以收到⼴播这种⼴播⼀般⽤于想开
机⾃启动啊等等,由于这种注册的⽅式的⼴播是常驻型⼴播,所以会占⽤CPU的资源。
第⼆种是动态注册,⽽动态注册的话,是在代码中注册的,这种注册⽅式也叫⾮常驻型⼴播,收到⽣命周期的影响,退出页⾯后,就不会收到⼴播,我们通常运⽤在更新UI⽅⾯。这种注册⽅式优先级较⾼。最后需要解绑,否会会内存泄露
⼴播是分为有序⼴播和⽆序⼴播。
HttpClient与HttpUrlConnection的区别
⾸先HttpClient和HttpUrlConnection 这两种⽅式都⽀持Https协议,都是以流的形式进⾏上传或者下载数据,也可以说是以流的形式进⾏数据的传输,还有ipv6,以及连接池等功能。HttpClient这个拥有⾮常多的API,所以如果想要进⾏扩展的话,并且不破坏它的兼容性的话,很难进⾏扩展,也就是这个原因,Google在Android6.0的时候,直接就弃⽤了这个HttpClient.
⽽HttpUrlConnection相对来说就是⽐较轻量级了,API⽐较少,容易扩展,并且能够满⾜Android⼤部分的数据传输。⽐较经典的⼀个框架volley,在2.3版本以前都是使⽤HttpClient,在2.3以后就使⽤了HttpUrlConnection。
6、java虚拟机和Dalvik虚拟机的区别
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_*))。
7、进程保活(不死进程)
说到进程保活,⾸先得知道进程的优先级,进程分为下⾯⼏种,优先级也是从⾼到低
前台进程 (Foreground process)
可见进程 (Visible process)
服务进程 (Service process)
后台进程 (Background process)
空进程 (Empty process)
当前业界的Android进程保活⼿段主要分为 ⿊、⽩、灰 三种,其⼤致的实现思路如下:
⿊⾊保活 :不同的app进程,⽤⼴播相互唤醒(包括利⽤系统提供的⼴播进⾏唤醒)
⽩⾊保活 :启动前台Service
灰⾊保活 :利⽤系统的漏洞启动前台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();
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论