2020年Android面试常考知识点汇总,近期有面试的必看
作者:互联网
3. 注册静态BroadcastReceiver,监听系统广播,然后判断Service状态
4. 守护进程
BroadcastReceiver:
-
普通广播、
-
系统广播:系统内置的一些广播,比如监听网络变化、打开相机等等
-
有序广播:
- 接收者按照预先声明的优先级依次接收Broadcast;
- 可以把数据存入结果对象中,传递给下一个接收者;
- 可以被一种某一个接收者终止。
-
本地广播(APP内)
ContentProvider:
Android进程(等级)
-
foreground process 前端进程
前端进程就是目前显示在屏幕上和用户交互的进程
比如说:
- 顶层可交互的activity(已执行onResume);
- 有个Service,并绑定到跟用户正在交互的activity;
- 在Service里调用了startForground函数;
- 正在执行onReceive函数的BroadCastReceiver
-
visible process 可见进程
没有任何前台组件,但是仍然能影响用户在屏幕上看到东西。
比如:- 如果一个activity在一个对话框运行之后仍然是可视的;
- 输入法的弹出时。
-
Service process 服务进程
服务进程不会直接为用户所见
比如在后台播放mp3或者从网上下载东西 -
background process 后台进程
比如:Activity执行了onStop -
empty process 空进程
数据持久化
SQLight:
- SQLite是一个轻量级的数据库,支持基本的SQL语法
- SQLiteDatabase的类,封装了一些操作数据库的api
1\. context.openOrCreateDatabase()方法创建SQLiteDatabase实例
2\. SQLiteDatabase实例调用insert()方法插入数据
3\. 调用query()方法查询数据
4\. 调用execSQL()方法执行SQL语句
SharedPreference:
- 是一种轻量级的数据存储方式,采用简直对的方式来存储数据。
- 其本质就是一个xml文件,一般位于/data/data/包名/shared_prefs/目录下。
- 由于内存中存在sharedPreference文件的缓存,所以在多进程的环境下,系统对它的读写不可靠。因此不建议用在IPC中
ContentProvider:
- Android系统中能实现不同应用间共享的一种数据存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储
- 每个Content Provider都会对外提供一个公共的URI,应用程序通过这个URI来对数据进行操作。
- Content Provider天生支持跨进程访问,因此可以用于IPC
Android应用程序之间是通过哪些方式共享数据的?
File,Sqlite,Content Provider,BroadCast Receiver,Intent,同个Application内部的话还可以通过静态变量共享数据。
webView
加载
-
提高渲染的优先级
webSettings.setRenderPriority(RenderPriority.HIGH);
-
把图片加载放在最后来加载渲染
webSettings.setBlockNetworkImage(true);
-
使用硬件加速,该功能在Android 3.0 (API level 11)才加入。
硬件加速可以在一下四个级别开启或关闭:Application、Activity、Window、View
比如,在AndroidManifest.xml中添加android:hardwareAccelerated属性;关闭view的硬件加速myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); -
开启缓存
设置websetting
js和java对象交互
-
获取webview控件的websetting
-
设置websetting.setJavascriptEnabled( true )
-
将一个对象暴露给JavaScript:webview.addJavascriptInterface。这个对象包含了JS调用的方法,这些方法用@JavascriptInterface修饰
-
JS通过这些方法与Android交互
防止OOM
- 在代码中动态地将webview设置到布局中,而不是直接写到xml文件中;
- 在Activity的onDestory中销毁webview
线程相关
Linux线程基础
- 线程与进程的区别
- 线程同步
- Linux线程通讯方式
ANR
- what
- Activity 5s内无响应,BroadcastReceiver 10s内无响应
- /data/anr/traces.txt 文件记录了ANR的信息
- why
- how
耗时任务或者线程间通讯
-
AsyncTask
- 本质上是对 ThreadPool 和 Handler 的一个封装
- 默认是串行的执行任务,可以调用executeOnExecutors()方法并行执行任务
-
Handler
-
IntentService
Handler
- Handler + MessageQueue + Looper
MessageQueue本质上是一个单链表,不是Queue。采用FIFO方式管理,enqueueMessage()方法是将消息插入一条队列,next()方法是一个无限循环的方法。如果有消息,则取出,如果没有,就阻塞。
- HandlerThread
本质上是一个继承了Thread的线程类。
通过创建HandlerThread获取looper对象,传递给Handler对象,执行异步任务。在HandlerThread中通过**Looper.prepare()来创建消息队列,并通过Looper.loop()**来开启消息循环。创建HandlerThread后必须先调用start()方法,才能调用getLooper()获取Looper对象。
HandlerThread封装了Looper对象,使我们不用关心Looper的开启和释放的细节问题。如果不用HandlerThread的话,需要手动去调用Looper.prepare()和Looper.loop()这些方法。
IntentService
-
原理:IntentService是一个抽象类,封装了HandlerThread和Handler,负责处理耗时的任务。任务执行完毕后会自行停止。在onCreate()方法中开启了一个HandlerThread线程,之后通过HandlerThread的Looper初始化了一个Handler,负责处理耗时操作。通过startService()方法启动,在handler中调用抽象方法onHandleIntent(),该方法执行完成后自动调用stopself()方法停止
-
override onHandleIntent() 方法
-
优点:一方面不需要自己去创建线程,另一方面不需要考虑在什么时候关闭该Service
OOM
-
what
OOM 和 内存泄漏 的区别 -
how
- 静态变量持有Activity或Context对象
- 非静态内部类的实例(默认持有外部类的引用)
- 资源未关闭:file、stream、bitmap等
-
Handler造成OOM
- 原因:使用**(匿名)内部类**实例化handler,默认持有context引用
- 避免:静态内部类、Activity在onDestroy的时候,清空handler未处理的消息
-
WebView造成OOM
View相关
三部曲
三个核心步骤:Measure、Layout、Draw
Touch分发机制
重要
滑动冲突
简述Activity、Window、WindowManager、View、ViewRootImpl的作用和相互之间的关系
-
Activity不负责视图的控制,而是交给Window。这个Window本质上是一个PhoneWindow,被windowmanager管理。
-
Window中有decorview,decorview是当前视图的底层View,是setContentView所设置View的父View
View是所有控件的基类。 -
ViewRoot对应ViewRootImpl,它是连接WindowManager和DecorView的纽带。绘制的三大流程都是在ViewRootImpl中完成的:从ViewRootImpl中的performTraversals开始,有三个方法performMeasure, performLayout, prformDraw分别对应measure,layout,draw三个流程,完成对顶级View的绘制。
-
在父View的Measure过程中,会调用子View的Measure过程,如此反复,完成对整个View树的遍历。同理,在Layout和Draw中也是如此。
RecyclerView
-
优点:
- 封装了ViewHolder
- 与ListView相比,耦合性更低、更加灵活:根据viewType设置不同的布局
- 设置LayoutManager,实现ListView的功能和GridView的功能(支持 LinearLayoutManager 和 GridLayoutManager)
- 支持局部刷新:notifyItemChanged()方法 (Listview用的BaseAdapter只有notifyDataSetChanged()方法)
-
缺点:
- 使用更加复杂
- 没有onItemClickListener()、setOnItemLongClickListener()方法,只有OnItemTouchListener()方法
-
RecyclerView.Adapter
- onCreateViewHolder()方法:产生一个ViewHolder对象,该对象中封装了view
- onBindViewHolder()方法:根据传入的ViewHolder对象,显示数据
- getItemViewType()方法:根据情况,返回不同的viewType,方便后续显示不同的布局和业务处理
IPC
Linux中IPC的方式:命名管道、信号量、共享内存
基础
- 开启多进程的方式:给四大组件在Menifest文件中,添加process属性,指定进程名称
- Android为每个进程分配一个独立的虚拟机,有不同的Application和地址空间。
- 不同进程访问同一个类的对象会有不同的副本。因此静态成员和单例模式失效、线程同步失效、sharedPreference可靠性降低。
序列化
-
Serializable接口:Java的序列化接口,使用简单,但开销大,序列化和反序列化需要大量IO操作
-
Parcelable接口:是Android的序列化方式,使用复杂,但效率高。
-
对象是不能直接跨进程传输的。对象的跨进程传输,其本质是序列化和反序列化的过程
机制:Bundle、文件共享、ContentProvider、Socket、AIDL、Messager
-
四大组件间,把数据封装到Bundle。在一个进程中开启另一个进程的Activity或者Service,就可以通过Intent把Bundle传递过去。其中,封装在Bundle中的数据需要能够被序列化
-
使用文件共享方式,多进程读写一个相同的文件,获取文件内容进行交互。
-
使用ContentProvider,常用于多进程共享数据,比如系统的相册,音乐等,我们也可以通过ContentProvider访问到
-
使用Socket传输数据。服务端(比如一个进程中运行了一个Service)创建一个ServerSocket对象,监听本地的端口;客户端(比如另一个进程中运行的Activity)通过Socket连接本地的那个接口。经过TCP的三次握手后,建立连接。接着可以发送数据。使用socket不仅可以实现进程间通信,也可以实现设备间通信。
Binder
- 基本原理:
Android特有的IPC、客户端-服务器C/S的模式、
四个角色:Client、Server、ServiceManager、BinderDriver
调用过程:
1. Server向ServiceManager注册
2. Client通过ServiceManager获取Server的代理对象
3. Client向代理对象发起请求,该请求通过BinderDriver发送给Server处理
4. Server通过BinderDriver返回处理结果
-
注意:客户端调用服务端的方法,被调用的方法运行在服务端的Binder线程池中,此时客户端被挂起。因此此时需要避免ANR。(AIDL和Messager同理)
-
Binder连接池
在一个应用有多个使用AIDL的场景,无需为每一个AIDL创建自己的Service。而是使用一个Service,创建并返回一个Binder连接池的Binder对象。Activity在使用AIDL的时候,可以通过该Binder连接池对象,获取不同的Binder对象(类似于工厂模式)
AIDL
-
使用流程:以Activity(进程1)和Service(进程2)通信为例
- 创建AIDL接口,Build一下,产生相关代码
- 创建IBinder实例,即实例化xxx.Stub()抽象内部类,override抽象方法
- 创建Service,在onBind()中,把上述IBinder实例返回
- 在Activity中调用bindService启动Service,然后在ServiceConnection中的onServiceConnected方法回调中获得该IBinder实例。
- Activity调用该实例的方法,实现通信
Messager
-
一种轻量级的跨进程通讯方案,底层使用AIDL实现。
-
是一种串行的通信,即服务端需要一个一个处理消息。因此,在大量并发请求的情况下,用Messager就不太合适。
-
使用流程:以Activity(进程1)和Service(进程2)通信为例
- 在Service中new一个Messenger(这个Messenger需要指定Handler)
- 然后在onBind函数中,返回messenger的Binder对象(messenger.getBinder())
- 在Activity中,通过bindService启动service,通过ServiceConnection获取到Binder对象。
- 通过这个Binder对象实例化一个Messenger,然后messenger.send(message)进行通信
启动流程
Android开机流程
init进程-zygote进程-SystemServer进程-各种ManagerService(AMS,PMS,WMS)- launcher程序
总结
Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!
上面分享的字节跳动公司2020年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
**[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](
)**
就先写到这,码字不易,写的很片面不好之处敬请指出,如果觉得有参考价值的朋友也可以关注一下我
①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包阅读下载,最后觉得有帮助、有需要的朋友可以点个赞
a开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](
)**
就先写到这,码字不易,写的很片面不好之处敬请指出,如果觉得有参考价值的朋友也可以关注一下我
①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包阅读下载,最后觉得有帮助、有需要的朋友可以点个赞
[外链图片转存中…(img-dvv4nXNf-1631334362315)]
[外链图片转存中…(img-ZY11omfc-1631334362316)]
[外链图片转存中…(img-dCqaW4RN-1631334362317)]
标签:知识点,Service,常考,面试,Activity,进程,Android,方法,View 来源: https://blog.csdn.net/yandex666/article/details/120236041