>> 背熟,唯手熟尔,大家都这么厉害,只能记得更准才行。
1
四大组件
各个组件阐述:
① Activity 活动:是一个单独的屏幕或窗口,Activity 之间通过 Intent 进行通信,每一个 Activity 都必须要在 AndroidManifest.xml 声明。
② Service 服务: 在后台完成的服务。分为 start 和 bind 两种。startService() 和 bindService() 的区别是,startService() 的生命周期和启动它的组件无关,bindService() 和调用者绑定在了一起,共存亡。
③ Content Provider 内容提供者:一个应用程序可以提供数据集给其他应用程序,如通讯录,可以实现在多个应用程序之间共享数据。使用的 URI 前缀是 content://
④ Broadcast Receiver 广播接受者:对感兴趣的外部事件进行响应,自己没有界面但是可以启动一个 Activity 或者 Service,或者发布一个通知。注册方法有两种,动态注册和 xml 中静态注册。动态注册与 Activity 共存亡,静态注册哪怕 app 未启动也有作用。
总结:
① 四大组件的注册:除了 Broadcast Receiver 可以动态注册,其他都需要静态注册。
② 四大组件的激活:Content Provider 通过 ContentResolver 激活,其他通过 Intent 激活。
③ 四大组件的关闭:Activity 通过 finish() 方法关闭,Service 通过 stopService() 或 unBindService() 关闭,其他没必要显式关闭。
-----------------------------------
2
六大布局
① 线性布局 (LinearLayout)
② 框架布局 (FrameLayout)
③ 表格布局 (TableLayout)
④ 相对布局 (RelativeLayout)
⑤ 绝对布局 (AbsoluteLayout)
⑥ 网格布局 (GridLayout)
-----------------------------------
3
五大存储
SharedPreferences、文件存储、SQLite数据库方式、内容提供器(Content provider)和网络。
① SharedPreferences:存储一些简单的配置信息,如记住用户名,通过 xml 保存在 shared_prefs 文件夹下。
② 文件存储:可以通过 openFileInput 和 openFileOuput 读写自身目录下的文件。
③ SQLite数据库:是 Android 自带的数据库。
④ Content Provider 内容提供者
⑤ 网络存储:注册网络权限、通过 HTTP 请求数据。
-----------------------------------
4
如何排查 OOM
① 通过监控工具和 GC 日志,如 LeakCanary 检测内存泄漏,然后使用 Android Studio 自带 Android Profiler 导出,mat 工具分析。
② 代码层面打印。
③ 通过 Dump 文件观察 OOM 时的内存镜像。
④ 上线前通过压测解决潜在的 OOM 问题。
-----------------------------------
5
ListView 和 RecyclerView 区别
① 动画:ListView 需要自己实现,RecyclerView 内置很多动画。
② 刷新:ListView 是全局刷新,RecyclerView 可以局部刷新。
③ 缓存:RecyclerView 多了两级缓存,且缓存池可以共用。
-----------------------------------
6
ListView 优化
① 复用:通过 ViewHolder 复用 convertView,类似一个缓存,不存在则创建并 setTag(),存在则 getTag()
② 图片:异步加载 (Glide)、使用缩略图、小图,快速滑动时不加载图片
③ 层级:减少 List Item 的层级。
④ RecycleBin 机制:滑动窗口实现的虚拟滚动,移出屏幕则加入 RecycleBin,进入屏幕从 RecycleBin 获取,可以避免数据多时 OOM。
-----------------------------------
7
点击事件设置监听的方式
① 匿名类:new View.OnClickListener()
② 外部类:自定义类继承 View.OnClickListener
③ Activity 实现 View.OnClickListener
④ layout 文件中使用 onclick 属性指定方法名。
-----------------------------------
8
Activity 生命周期
① 共 7 个:onCreate(), onStart(), onResume(), onPause(), onStop(), onRestart(), onDestory().
② 是否可见:onStart() 在前台看不到也无法交互、onResume() 能看到可以交互、onPause() 能看到不能交互、onStop() 看不到。
③ 屏幕旋转时生命周期的变化:如果不设置,会先停止再重新创建:
停止:onPause() -> onStop() -> onDestory()
创建:onCreate() -> onStart() -> onResume()
解决办法:在 xml 给 activity 增加 configChanges 属性: screenSize | orientation | keyboardHideen.
-----------------------------------
9
页面之间如何传递数据?
① Intent 传值,onActivityForResult 回传。
② 传递对象:序列化 Serializable.
③ 传递集合:转换成 List。
-----------------------------------
10
dp / px / sp
① dp: 与密度无关的像素单位,不同设备上不一样。
② px: 一个像素点。
③ sp: 与尺寸无关的像素单位,一般用于字体大小。
-----------------------------------
11
Handler 机制
① 组成:Handler, MessageQueue, Looper.
② 功能:Handler 负责消息的收发,MessageQueue 负责存储,Looper 负责消息的管理。
③ 原理:
1、过程:handler 获取一个消息对象,通过 sendXXX 方法 push 到队列中,Looper 轮询这个队列取出消息对象,通过 dispatchMessage 分发给 Handler,回调时使用 handlerMessage() 处理消息。
2、线程安全:是线程安全的。
3、数据结构:Message 对象底层使用链表,最长为 50。
-----------------------------------
12
什么是 ANR, 如何避免?
① 概念:Android Not Responding,安卓主线程响应时间为 5 秒,5 秒内没响应则回收。
② 避免:耗时的工作在子线程中做。
-----------------------------------
13
广播接收方式、广播类型
广播接收方式
① 常驻型:在 AndroidManifest.xml 中静态注册,关闭后也能收到。
② 非常驻型:代码中 resigterReceiver() 注册,生命周期与启动者绑定。
广播类型
① 普通广播:最常用的 setAction(名称)
② 系统广播:涉及到手机的基本操作的广播。
③ 有序广播:发出去的广播被按顺序接收。
④ 应用内广播:使用 setPackage() 解决冲突和安全性问题。
⑤ 粘性广播:5.0 以后已经失效。
-----------------------------------
14
Service 和 Activity 传递数据
① bindService()
② 广播、Interface、Handler、bind 对象。
-----------------------------------
15
下载如何实现断点续传
① 原理:HTTP 报文中,客户端通过 Range 告诉服务端从指定的位置下载,服务端通过 Accept-Ranges 告诉客户端支持断点续传,通过 Content-Range 告诉客户端返回的数据信息。
② 安卓实现:最方便的是 xUtils.HttpUtils,支持多线程断点下载。如果自己写的话:通过 GET 请求获取文件总长度,然后创建等长的临时文件,用长度除以线程数,计算每个线程的开始和结束位置,然后开启多线程下载,将下载结果存在对应位置。断点位置可以通过一个 int 变量存储。
-----------------------------------
16
Android的进程间通信方式
① Bundle: 通过 Intent.putExtras(bundle) 传递。
② ContentProvider: 跨进程访问其他应用程序中的数据。
③ 文件:共享存储的方式实现进程通信。
④ Broadcast: 跨进程的应用程序监听这些广播。
⑤ AIDL: 全称是 Android Interface Design Language, 中文安卓接口设计语言,是一个类似于 socket 的服务,服务端给客户端统一提供数据。
⑥ Messenger:基于 AIDL,使用 Messenger 发送数据,使用 Handler 处理数据。
⑦ Socket: 在子线程中实时交换网络数据。
-----------------------------------
17
Android中自定义View的流程
① 实现 Measure、Layout、Draw
-
onMeasure():遍历所有子 View 并测量、合并所有子 View 尺寸、存储测量后的子 View 宽高。
-
onLayout(): 遍历子View、计算子 View 的四个位置、设置子 View 的 4 个顶点。
-
onDraw(): 绘制父 View 本身的内容。
② 自定义属性
-----------------------------------
18
Android中事件分发机制
① 概念:对象是点击事件、本质是将点击事件传递到某个具体的 View 以及处理的过程,分发的过程就是事件传递的过程。
② 顺序:Activity --> ViewGroup --> View
③ 核心方法:
④ 过程:
-----------------------------------
19
为什么主线程looper死循环不会导致ANR现象出现?
① Looper.loop() 的用途:是一个消息循环,如果没有这个消息循环,主线程运行完毕就会退出。
② 我们的代码就是在这个消息循环中执行的,因此就不会阻塞。只要消息循环没有阻塞,能一直处理事件,就不会产生 ANR。
-----------------------------------
20
Service如何执行一个耗时操作
继承 IntentService,重写 onHandleIntent 方法,就会在单独的线程中执行。
-----------------------------------
21
安卓的activity和application有什么区别
① Activity 和 Application 都是 Context 的子类,Context 管理上下文环境中的各个参数和变量。
② 虽然 Activity 和 Applicaiton 都是 Context 的子类,但是他们维护的生命周期不一样,前者维护一个 Acvitity 的生命周期,后者维护一个 Application 的生命周期。
-----------------------------------
22
fragment和activity有什么区别
① Activity 代表了一个屏幕的主体,Fragment 可以作为 Activity 的一个组成元素。
② Fragment 更加灵活,可以直接在 XML 文件中添加。
③ Fragment 可以灵活的替换一部分页面,Activity 不行。
-----------------------------------
23
安卓的activity和application有什么区别
① Activity 和 Application 都是 Context 的子类,Context 管理上下文环境中的各个参数和变量。
② 虽然 Activity 和 Applicaiton 都是 Context 的子类,但是他们维护的生命周期不一样,前者维护一个 Acvitity 的生命周期,后者维护一个 Application 的生命周期。
-----------------------------------
24
fragment和activity有什么区别
① Activity 代表了一个屏幕的主体,Fragment 可以作为 Activity 的一个组成元素。
② Fragment 更加灵活,可以直接在 XML 文件中添加。
③ Fragment 可以在一个界面上灵活的替换一部分页面,Activity 不行。
-----------------------------------
25
onStart和onResume的区别,分别是在什么时候调用的
-----------------------------------
26
activity启动模式
四种启动模式:
① 默认启动模式 standard: 启动的 Activity 会按顺序依次压入任务栈。
② 栈顶复用模式 singleTop: 如果栈顶 Activity 就是目标 Activity,则不会创建新的 Activity。
③ 栈内复用模式 singleTask: 如果栈内存在目标 Activity,则将目标 Activity 上方的所有 Activity 弹出,让目标 Acvitity 处于栈顶。
④ 全局唯一模式 singleInstance: 分配一个新的 affinity, 创建一个新的任务栈,然后将目标 Acvitity 放入新的任务栈,新的任务栈中只有这一个 Acvitity 实例。
-----------------------------------
27
多进程的几个activity依次启动。application只会被初始化一次吗
多进程启动,applicaiton 会初始化多次。可以通过 pid 解决,如果当前进程 id 不是主进程的 id,则直接 return。
-----------------------------------
28
a启动b 再返回生命周期。a启动b流程 为什么是先pause 等b展示完了再stop
① a 启动 b:a 先 onPause, 然后 b onCreate --> onStart --> onResume, 然后 a onStop
② 返回:b 先 onPause, 然后 a onRestart --> onStart --> onResume, 然后 b onStop --> onDestory.
一个活动是否 onStop, 取决于它是否可见。
先 pause 等 b 展示完了再 stop 的原因是,当 b 展示完后,a 才不可见,因此这时候才会调用 onStop.
-----------------------------------
29
内存泄露有哪些场景
在有向图中有通路和一个对象相连,但是以后不会使用到这个对象,就会发生内存泄漏。
常见的场景:
① 修改 HashSet 中对象 hashCode 有关的字段,会导致集合中无法删除这个对象。
② MVP 中,Activity 退出时,P 层中仍有 V 层的引用,导致 Activity 中的内存无法释放。
③ 外部类的一个实例的方法返回了内部类的一个对象,当这个外部类实例不再使用,但是内部类对象还在使用,会导致这个外部类对象无法被回收。
-----------------------------------
30
问怎么恢复activity状态 哪些方法 oncreate里面能恢复吗 和重写那俩方法恢复有什么区别
① 重写 onSaveInstanceState 方法,给 Bundle添加键值对。
② 重写 onResotreInstanceState 方法,调用 super 恢复状态
在 onCreate 也能恢复,区别是 onCreate 中需要判断 Bundle 是否为空。
-----------------------------------
31
RecyclerView机制 怎么区分不同类型的item的
RecylerView 机制
① 概念:RecyclerView 使用一个 Adaper 将数据按照一定的规则展示,Adapter 的工作是将数据转换成 RecylerView 认识的 ViewHolder。
② 缓存机制:Recycler 内部类,有五级缓存。
区分不同类型的 item
重写 getItemViewType() 方法,通过 position 拿到这个对象,判断它需要哪种视图,返回一个 int 类型的视图标志,然后在 onCreateViewHolder 方法中引入布局。
-----------------------------------
32
anr分类有哪些,原因,anr定位
分类
① 按键触摸超时: 5S
② 广播超时:10s
③ 服务超时:20s
定位
① Logcat 日志信息
② traces.txt 日志信息
-----------------------------------
33
android常见问题之卡顿原因与分析解决
卡顿原因
① 主线程进行了耗时操作如网络访问、大文件的读写操作.
② 频繁的gc引发卡顿
③ 死锁
④ view的绘制过于频繁,或者是嵌套过多
卡顿定位
① Logcat 日志信息
② traces.txt 日志信息
-----------------------------------
34
路由器在哪一层?常见的层都有哪些硬件设备?
路由器在网络层
① 物理层:中继器、集线器
② 数据链路层:网卡、网桥、交换机
③ 网络层:路由器、防火墙
-----------------------------------
35
AsyncTask不同版本线程池的区别
① 3.0 以下:核心线程数 5 个,最大 128 个,阻塞队列容量 128
② 3.0-4.0, 核心 5 个,最大 128 个,阻塞队列容量 10
③ 4.4 以后:核心为 CPU_COUNT + 1,最大为 2 * CPU_COUNT + 1,阻塞队列容量 128
-----------------------------------
36
Android中的Context是什么?哪些实现?这些实现的区别?
① 自己的理解:就像拍电影,四大组件就是演员,Context 就是摄像机镜头。
② 源码注释:Context 是一个抽象类,提供了应用程序的全局信息。是一个统领应用程序环境变量的上下文。
③ 实现:实现 Context 的有:ContextImpl, ContextWrapper, 然后 ContextWrapper 下又有 Application, Service, ContextThemeWrapper, ContextThemeWrapper 下又有 Activity.
④ 实现的区别:
-
ContextImpl 类真正实现了 Context 中所有的函数,我们所调用的各种Context类的方法均来自于该类。
-
ContextWrapper 里面有一个类型为 ContextImpl 的 mBase, 实现方法的时候调用了 mBase 的方法。
-----------------------------------
37
点击一个App图标的启动过程
① Launcher进程向system_server进程发起startActivity请求;
② system_server 进程向zygote进程发送创建进程的请求
③ zygote进程fork出新的App进程;
④ App 进程向system_server进程发起attachApplication请求
⑤ system_server进程准备好之后,向App进程发送 scheduleLaunchActivity 请求
⑥ App进程 通过handler向主线程发送LAUNCH_ACTIVITY消息
⑦ 主线程通过反射机制创建目标Activity,并回调Activity.onCreate()方法
-----------------------------------
38
View 是如何绘制的
测量、布局、绘制。
首先从 ViewRootImpl.performTraversals方法开始,分别调用performMeasure、performLayout、performDraw方法,从根View开始,然后一层一层传递下去,最终完成所有的测量布局绘制工作;
-----------------------------------
39
滑动冲突解决
① 外部解决:在父组件的 onInterceptTouchEvent 中,当横向的滑动距离大于纵向的滑动距离时,无需拦截此次滑动事件,滑动事件就会传递到下一层的 View
② 内部解决:在子组件中的onTouch方法中,调用getParent().requestDisallowInterceptTouchEvent()方法。
-----------------------------------
40
RxJava 原理
RxJava是流式编程,解决异步编程问题。
在每一条流中,都至少包含以下要素:
① 被订阅者,Observable或Flowable
② 订阅者,Observer或subscriber
③ 触发时机,subscribe()方法
④ 线程切换,subscribeOn()和observeOn()
⑤ 数据操作,如map()、flatMap()等
-----------------------------------
41
Retrofit 基本原理
① 概念:是一个对OKHttp框架的封装,采用注解方式开发,最终通过OKHttp框架进行发送。
② 原理:
- 通过动态代理的方式用MethodHandler完成接口方法。
- 通过RequestFactoryParser.parse解析,获得接口方法的参数和注解的值,传入到OkHttpCall,OkHttpCall 完成Http请求并使用Converter解析数据。
-----------------------------------