【绝对干货】超全 Android 中高级面试复习大纲,安卓面试题目 2019
onRestart()
4、进程的优先级
空进程
后台进程
服务进程
可见进程
前台进程
5、Activity 任务栈
先进后出
6、Activity 启动模式
standard
singletop
singletask
singleinstance
7、scheme 跳转协议
Android 中的 scheme 是一种页面内跳转协议,通过定义自己的 scheme 协议,可以跳转到 app 中的各个页面
服务器可以定制化告诉 app 跳转哪个页面
App 可以通过跳转到另一个 App 页面
可以通过 H5 页面跳转页面
Fragment 面试题
1、Fragment 为什么被称为第五大组件
Fragment 比 Activity 更节省内存,其切换模式也更加舒适,使用频率不低于四大组件,且有自己的生命周期,而且必须依附于 Activity
2、Activity 创建 Fragment 的方式
静态创建
动态创建
3、FragmentPageAdapter 和 FragmentPageStateAdapter 的区别
FragmentPageAdapter 在每次切换页面的的时候,是将 Fragment 进行分离,适合页面较少的 Fragment 使用以保存一些内存,对系统内存不会多大影响
FragmentPageStateAdapter 在每次切换页面的时候,是将 Fragment 进行回收,适合页面较多的 Fragment 使用,这样就不会消耗更多的内存
4、Fragment 生命周期
onAttach()
onCreate()
onCreateView()
onActivityCreated()
onStart()
onResume()
onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()
5、Fragment 的通信
Fragment 调用 Activity 中的方法:getActivity
Activity 调用 Fragment 中的方法:接口回调
Fragment 调用 Fragment 中的方法:FragmentManager.findFragmentById
**6、Fragmen
t 的 replace、add、remove 方法**
replace:替代 Fragment 的栈顶页面
add:添加 Fragment 到栈顶页面
remove:移除 Fragment 栈顶页面
Service 面试题
1、Service 是什么
Service 是四大组件之一,它可以在后台执行长时间运行操作而没有用户界面的应用组件
2、Service 和 Thread 的区别
Service 是安卓中系统的组件,它运行在独立进程的主线程中,不可以执行耗时操作。Thread 是程序执行的最小单元,分配 CPU 的基本单位,可以开启子线程执行耗时操作
Service 在不同 Activity 中可以获取自身实例,可以方便的对 Service 进行操作。Thread 在不同的 Activity 中难以获取自身实例,如果 Activity 被销毁,Thread 实例就很难再获取得到
3、Service 启动方式
startService
bindService
4、Service 生命周期
startService
onCreate()
onStartCommand()
onDestroy()
bindService
onCreate()
onBind()
onUnbind()
onDestroy()
Broadcast Receiver 面试题
1、Broadcast Receiver 是什么
Broadcast 是四大组件之一,是一种广泛运用在应用程序之间传输信息的机制,通过发送 Intent 来传送我们的数据
2、Broadcast Receiver 的使用场景
同一 App 具有多个进程的不同组件之间的消息通信
不同 App 之间的组件之间的消息通信
3、Broadcast Receiver 的种类
普通广播
有序广播
本地广播
Sticky 广播
4、Broadcast Receiver 的实现
静态注册:注册后一直运行,尽管 Activity、进程、App 被杀死还是可以接收到广播
动态注册:跟随 Activity 的生命周期
5、Broadcast Receiver 实现机制
自定义广播类继承 BroadcastReceiver,复写 onReceiver()
通过 Binder 机制向 AMS 进行注册广播
广播发送者通过 Binder 机制向 AMS 发送广播
AMS 查找符合相应条件的广播发送到 BroadcastReceiver 相应的循环队列中
消息队列执行拿到广播,回调 BroadcastReceiver 的 onReceiver()
6、LocalBroadcastManager 特点
本地广播只能在自身 App 内传播,不必担心泄漏隐私数据
本地广播不允许其他 App 对你的 App 发送该广播,不必担心安全漏洞被利用
本地广播比全局广播更高效
以上三点都是源于其内部是用 Handler 实现的
WebView 面试题
1、WebView 安全漏洞
API16 之前存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用 WebView.addJavascriptInterface 方法,远程攻击者可通过使用 Java 反射机制利用该漏洞执行任意 Java 对象的方法
2、WebView 销毁步骤
WebView 在其他容器上时(如:LinearLayout),当销毁 Activity 时,需要在 onDestroy()中先移除容器上的 WebView,然后再将 WebView.destroy(),这样就不会导致内存泄漏
3、WebView 的 jsbridge
客户端和服务端之间可以通过 Javascript 来互相调用各自的方法
4、WebViewClient 的 onPageFinished
WebViewClient 的 onPageFinished 在每次完成页面的时候调用,但是遇到未加载完成的页面跳转其他页面时,就会一直调用,使用 WebChromeClient.onProgressChanged 可以替代
5、WebView 后台耗电
在 WebView 加载页面的时候,会自动开启线程去加载,如果不很好的关闭这些线程,就会导致电量消耗加大,可以采用暴力的方法,直接在 onDestroy 方法中 System.exit(0)结束当前正在运行中的 java 虚拟机
6、WebView 硬件加速
Android3.0 引入硬件加速,默认会开启,WebView 在硬件加速的情况下滑动更加平滑,性能更加好,但是会出现白块或者页面闪烁的副作用,建议 WebView 暂时关闭硬件加速
7、WebView 内存泄漏
由于 WebView 是依附于 Activity 的,Activity 的生命周期和 WebView 启动的线程的生命周期是不一致的,这会导致 WebView 一直持有对这个 Activity 的引用而无法释放,解决方案如下
独立进程,简单暴力,不过可能涉及到进程间通信(推荐)
动态添加 WebView,对传入 WebView 中使用的 Context 使用弱引用
**[腾讯、字节跳动、阿里、百度等 BAT 大厂 2019-2020 面试真题解析](
)**
Binder 面试题
1、Linux 内核的基本知识
进程隔离/虚拟地址空间:进程间是不可以共享数据的,相当于被隔离,每个进程被分配到不同的虚拟地址中
系统调用:Linux 内核对应用有访问权限,用户只能在应用层通过系统调用,调用内核的某些程序
binder 驱动:它负责各个用户的进程,通过 binder 通信内核来进行交互的模块
2、为什么使用 Binder
性能上,相比传统的 Socket 更加高效
安全性高,支持协议双方互相校验
3、Binder 通信模型
Service 服务端通过 Binder 驱动在 ServiceManager 的查找表中注册 Object 对象的 add 方法
Client 客户端通过 Binder 驱动在 ServiceManager 的查找表中找到 Object 对象的 add 方法,并返回 proxy 的 add 方法,add 方法是个空实现,proxy 也不是真正的 Object 对象,是通过 Binder 驱动封装好的代理类的 add 方法
当 Client 客户端调用 add 方法时,Client 客户端通过 Binder 驱动将 proxy 的 add 方法,请求 ServiceManager 来找到 Service 服务端真正对象的 add 方法,进行调用
4、AIDL
客户端通过 aidl 文件的 Stub.asInterface()方法,拿到 Proxy 代理类
通过调用 Proxy 代理类的方法,将参数进行封包后,调用底层的 transact()方法
transact()方法会回调 onTransact()方法,进行参数的解封
在 onTransact()方法中调用服务端对应的方法,并将结果返回
Handler 面试题
1、Handler 是什么
Handler 通过发送和处理 Message 和 Runnable 对象来关联相对应线程的 MessageQueue
2、Handler 使用方法
post(runnable)
sendMessage(message)
3、Handler 工作原理
[Android 进阶——Android 消息机制之 Looper、Handler、MessageQueen](
)
4、Handler 引起的内存泄漏
原因:非静态内部类持有外部类的匿名引用,导致 Activity 无法释放
解决:
Handler 内部持有外部 Activity 的弱引用
Handler 改为静态内部类
Handler.removeCallback()
AsyncTask 面试题
1、AsyncTask 是什么
它本质上就是一个封装了线程池和 Handler 的异步框架
2、AsyncTask 使用方法
三个参数
Params:表示后台任务执行时的参数类型,该参数会传给 AysncTask 的 doInBackground()方法
Progress:表示后台任务的执行进度的参数类型,该参数会作为 onProgressUpdate()方法的参数
Result:表示后台任务的返回结果的参数类型,该参数会作为 onPostExecute()方法的参数
五个方法
onPreExecute():异步任务开启之前回调,在主线程中执行
doInBackground():执行异步任务,在线程池中执行
onProgressUpdate():当 doInBackground 中调用 publishProgress 时回调,在主线程中执行
onPostExecute():在异步任务执行之后回调,在主线程中执行
onCancelled():在异步任务被取消时回调
3、AsyncTask 工作原理
[Android 进阶——多线程系列之异步任务 AsyncTask 的使用与源码分析](
)
4、AsyncTask 引起的内存泄漏
原因:非静态内部类持有外部类的匿名引用,导致 Activity 无法释放
评论