数据结构与算法
各种开源框架使用与原理(okhttp glide gson Rxjava Retrofit ButterKnife dagger等) 各种设计模式(命令模式 观察者模式 抽象工厂模式 build模式 适配器模式 生产者/消费者 装饰者模式 外观模式等) 各种架构(MVP MVC MVVM) 网络(http https udp等) 组件化 模块化 插件化 热修复 IPC AIDL JNI NDK Bindler SQLite 多线程 锁 进程 内存 jvm dvm 以上部分自行查找相关资料
Android进程优先级: 前台、可见、服务、后台、空
Android任务栈: 不唯一 后进先出
activity启动模式: standard:不管任务栈中是否有 都创建 singleTop:栈顶复用 栈顶有就复用 没有就创建 singleTask:任务栈中有 就移到栈顶 没有就创建 singleinstance:有且只有一个实例 并且独享整个任务栈
scheme跳转协议: 服务端定制跳转页面 h5跳转原生页面 一个app跳转到另一个app
Fragment为什么别称为第五大组件: 3.0引入 起初为了适应平板大屏幕 比activity内存小 动态灵活加载 依附于activity
FragmentPagerAdapter和FragmentStatePagerAdapter的区别 前者适用于较少的页面 后者适用于较多的页面 后者切换时有释放Fragment对象 前者切换时 脱离UI并没有回收对象
Fragment生命周期 onAttach onCreate onCreateView onViewCreate onActivityCreated onDestoryView onDetach
Fragment通信 Fragment调用activity的方法 getActivity activity调用Fragment的方法 接口回调 Fragment调用Fragment的方法 先getactivity 再findFragmentById对应的Fragment
Fragment的replace、add、remove 方法 replace(FragmentManager的方法)替换实例 add 将实例添加到最上层 remove 将实例移除
Service是什么: 后台长期运行而没有用户界面 可以由广播、activity启动 运行在主线程中 不能做耗时操作
Service和Thread的区别 Android的后台指完全不依赖于UI线程 Service轻量级的IPC通信
Service启动方式 startService bindService
广播使用场景 同一个app具有多个进程的不同组件之间的消息通信 不同app之间组件的通信
广播的种类 普通广播 有序广播 本地广播(只在app内传播)
实现广播的方式 静态注册 xml中注册 注册完一直运行即使进程被杀死 动态注册 代码中注册 跟随activity的生命周期
广播内部实现机制 1.广播接收者BroadcastReceiver通过Binder机制向AMS(Activity Manager Service)进行注册; 2.广播发送者通过binder机制向AMS发送广播; 3.AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中; 4.消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。
本地广播 别的app无法接受 别的app无法对自己的app发送广播 比系统的全局广播更加高效 以上都是因为 通过handler实现的
handler的内部机制 handler发送message到消息队列中 loop从消息队列循环取消息 发送给handler进行处理 handler内存泄漏(非静态内部类隐试持有外部类的引用 GC只会回收没有被引用或者根集不可到达的对象(取决于GC算法)) 当回收activity时 handler在做好使操作 导致handler对activity的引用没有被释放 导致内存泄漏 解决办法 设为static 或者 在activity的ondestory中 调用removeCallback
asyncTask 本质上封装了线程池和handler的异步框架
handler和asyncTask的区别 前者 对于多个后台任务 简单清晰 后者 轻量级的异步任务类 反馈异步执行的进度 适用于单个或者少量异步任务
asyncTask注意事项 内存泄漏(同handler) 生命周期(不跟随activity 需要主动调用cancel方法保证程序稳定) 结果丢失 (屏幕旋转 系统回收 持有的是之前的activity的引用 则结果无效)
handlerThread产生背景 开启Thread子线程进行耗时操作 多次创建和销毁线程是很耗系统资源的
handlerThread特点 本质上是线程类 继承了Thread 有自己的looper对象 可以进行looper循环 通过looper对象传递给handler对象 可以在handleMessage方法中执行异步任务 优点是不会堵塞 减少性能的消耗 缺点不能同时进行多任务处理 效率低 与线程池注重并发不同 handlerThread是一个串行队列,背后只有一个线程
IntentService 本质封装了handlerThread和handler的异步框架 可以做耗时操作(有异步方法) 继承自Service 异步请求类 当任务执行完成后会自动停止 比Service优先级高 可以开启多次 但实例只有一个 执行完第一个任务后再执行第二个任务(其实是handler在处理)
bitmap优化 recycle lru 计算insamplesize 缩略图 三级缓存
ui卡顿原理 1秒60帧 16ms每帧 overdraw 有大量重叠部分 比如重合的View都有自己的背景 过度绘制 同一帧多次绘制
ui卡顿原因分析 人为的在ui线程中做轻微的耗时操作,导致卡顿 布局layout过于复杂,无法在16ms内渲染完成 同一时间动画执行次数过多,导致cpu和gpu负载过重 View的过度绘制,导致某些像素在同一帧时间内被绘制多次,导致cpu和gpu负载过重 View频繁的出发measure layout 导致耗时过多 内存频繁触发GC 导致暂时阻塞渲染操作 冗余资源及逻辑等导致加载和执行缓慢 anr
ui卡顿优化 布局优化(使用include merge等标签 尽量不要嵌套 使用比重代替长宽 自定义View代替复杂) 列表及adapter优化 背景和图片等内存分配优化 避免anr
java内存分配策略 1、静态存储区 2、栈区 3、堆区
java是如何管理内存的
java中的内存泄漏 定义:无用对象持续占有内存或者无用对象的内存得不到及时释放
Android中内存泄漏 1、单例 2、匿名内部类 3、handler 4、避免使用static变量 5、资源未关闭(广播、游标、数据库、stream 、socket、bitpam) 5、asyncTask
内存管理机制概述 1、分配机制 2、回收机制
Android内存管理机制 1、分配机制 2、回收机制
内存管理机制目标 1、更少的占用内存 2、合适的时候,合理的释放系统资源 3、在系统紧张的时候,释放掉大部分不重要的资源 4、合理的在特殊的生命周期中,保存或者还原重要数据,以至于系统能够正确的恢复应用
Android内存优化方法 1、当Service完成任务后,尽量停止它 2、当UI不可见的时候,释放掉一些只有ui使用的资源 3、在系统内存紧张的时候,尽可能多的释放掉一些非重要资源 4、避免滥用bitmap导致内存浪费 5、使用针对内存优化过的数据容器(少用枚举 消耗的内存是常量的两倍多 ) 6、避免使用依赖注入的框架 7、使用ZIP对齐的APK 8、使用多进程
如何对冷启动进行优化 1、减少onCreate方法的工作量 2、不要让Application参与业务操作 ,也不要进行耗时操作 3、不要以静态变量的方式在Application中保存数据 4、布局优化
Android不用静态变量存储数据 1、静态变量数据由于进程被杀死而初始化 2、使用其他方式:文件、视频、contentprovider
有关sharepreference的问题 1、不能夸进程同步 2、存储的文件过大(取值导致阻塞主线程 产生大量临时变量 一直存储在内存中)
其他优化 内存对象序列化 序列化:将对象的状态信息转化为可以存储或传输的形式的过程 Serializeble(java自带 在使用内存时比Serializeble性能高 序列化时产生大量临时变量 频繁垃圾回收) Parcelble(Android自带 不可用于磁盘数据的序列化 不能保证数据的持续性 用于进程间的数据传递)
MVC模式 简单来说就是通过controller的控制去操作model层的数据,并且返回给view层展示 大家想过这样会有什么问题吗?显然是有的,不然为什么会有MVP和MVVM的诞生呢,是吧。问题就在于xml作为view层,控制能力实在太弱了,你想去动态的改变一个页面的背景,或者动态的隐藏/显示一个按钮,这些都没办法在xml中做,只能把代码写在activity中,造成了activity既是controller层,又是view层的这样一个窘境 定义: 1、M: 业务逻辑 2、V:处理数据显示的操作 3、C:Activity处理用户交互问题 特点: 1、耦合性低 2、可扩展性好 3、模块职责划分明确
进程保活方案 1、利用系统广播拉活 不及时 2、利用系统Service机制拉活 短时间被kill超过三次就拉不活了(将Service 设置为 START_STICKY状态) 3、利用Native进程拉活(利用Linux 中的 fork 机制创建 Native 进程,在 Native 进程中监控主进程的存活,当主进程挂掉后,在 Native 进程中立即对主进程进行拉活。在主进程中创建一个监控文件,在主进程中持有文件锁。拉活进程启动后,申请文件锁将会被堵塞,一旦可以成功获取到锁,说明主进程挂掉,即可进行拉活5.0后失效) 4、利用JobScheduler机制拉活(5.0后) 5、利用账号机制拉活(失效) https://segmentfault.com/a/1190000006251859
进程杀死场景 触发系统进程管理机制 被第三方杀死 厂商杀进程 用户主动强行停止
bindle机制 https://blog.csdn.net/weijinqian0/article/details/52233529
热修复原理 https://blog.csdn.net/u012943767/article/details/52355214 https://www.jianshu.com/p/d10aa991ca76
http和https https://www.cnblogs.com/wqhwe/p/5407468.html
网络请求优化 https://www.jianshu.com/p/d4c2c62ffc35
数据库优化 https://www.jianshu.com/p/3b4452fc1bbd
Android和js交互 https://blog.csdn.net/carson_ho/article/details/64904691
Android 组件化和插件化 https://blog.csdn.net/mhhyoucom/article/details/79000072
如何导入外部数据库 https://blog.csdn.net/gpwner/article/details/53195925
描述一次网络请求的过程 https://blog.csdn.net/seu_calvin/article/details/53304406
Service和activity通信 https://blog.csdn.net/qq_28468727/article/details/52144155
Android实现wap方式联网 https://blog.csdn.net/seu_calvin/article/details/53305034
Requestlayout onlayout ondraw drawchild 区别与联系 https://blog.csdn.net/weixin_41101173/article/details/79726311
android中Invalidate和postInvalidate的差别 https://www.cnblogs.com/newcaoguo/p/6053288.html
动画框架实现原理 https://www.jianshu.com/p/3683a69c38ea
Android View刷新机制 https://www.oschina.net/question/163910_27566
contentprovider https://blog.csdn.net/carson_ho/article/details/76101093
自定义View优化 https://blog.csdn.net/whb20081815/article/details/74474736
activity缓存方法 https://www.jianshu.com/p/eac026497f14
merge viewstub https://www.jianshu.com/p/62ba51bc7dbc
json优缺点 https://blog.csdn.net/ssisse/article/details/51555227
怎样退出app https://blog.csdn.net/rabbit_in_android/article/details/50772811
res和asset的区别 https://blog.csdn.net/xiang462042190/article/details/43638299
bitmap详细了解
Android长连接和心跳机制 https://blog.csdn.net/ttkatrina/article/details/72956338
zygote启动过程 https://blog.csdn.net/cike110120/article/details/52157665
心跳包 https://blog.csdn.net/bless2015/article/details/52680220
XML解析方式 https://blog.csdn.net/WILLMAX_007/article/details/51416963
forceclose http://www.jb51.net/article/90176.htm
Android体系架构 https://blog.csdn.net/spy19881201/article/details/5775484
如何安全退出已调用多个activity的Application https://blog.csdn.net/debug2/article/details/6193644
dvm进程 linux进程 应用程序进程是否为同一个概念 https://blog.csdn.net/qq_27073205/article/details/46240261
Android如何捕获未捕获的异常 http://www.jb51.net/article/78858.htm
Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么 https://www.jianshu.com/p/34758dd69019
Android线程间通信 1.共享变量(内存) 2.管道 3.handle机制 runOnUiThread(Runnable) view.post(Runnable)
Android 进程通信 https://www.jianshu.com/p/ce1e35c84134
activity启动过程 https://www.jianshu.com/p/9ecea420eb52
讲解一下context https://blog.csdn.net/guolin_blog/article/details/47028975
recycleview http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0307/4032.html
LRUCache原理 https://blog.csdn.net/u012943767/article/details/51897259
启动时长 https://blog.csdn.net/beyond_liyy/article/details/52273740
保持应用稳定性 https://www.jianshu.com/p/40681fa8b284
classLoader https://www.jianshu.com/p/a620e368389a
动态布局 https://www.jianshu.com/p/0d6f753fdd92
减少重复代码 https://blog.csdn.net/u011494050/article/details/40593605
sp是进程同步吗 有什么方法做到同步 https://www.jianshu.com/p/bdebf741221e
surfaceView https://blog.csdn.net/luoshengyang/article/details/8661317/
线程间操作list https://www.jianshu.com/p/7a7985653651
app启动流程 从点击桌面图标开始 https://blog.csdn.net/hehe26/article/details/51460057
动态加载 https://www.jianshu.com/p/aa9a324626a8
构建流程 https://www.jianshu.com/p/4962634901fb
安装过程 https://www.jianshu.com/p/21412a697eb0
dalvik art基本了解 https://blog.csdn.net/seu_calvin/article/details/52354964
Android 沙箱化 https://blog.csdn.net/ljheee/article/details/53191397
系统启动流程 zygote-systemserver-各种系统服务-应用进程 https://www.jianshu.com/p/33152a7bec26 四篇都要看
recycleView 和listview 对比 https://blog.csdn.net/u014497502/article/details/50917321
synchronized和Lock的区别 https://blog.csdn.net/u012403290/article/details/64910926?locationNum=11&fps=1
listview 图片加载错乱原理及解决方案 https://blog.csdn.net/a394268045/article/details/50726560
动态适配权限 权限组的概念 https://www.jianshu.com/p/a37f4827079a
加载大图 https://blog.csdn.net/zuo8787/article/details/51406986
计算view的嵌套层级 https://blog.csdn.net/zx_android/article/details/79558509
多线程实现断点续传 https://blog.csdn.net/tianzhaoai/article/details/56673071
封装一个view的时候怎么知道View的大小 https://blog.csdn.net/z82367825/article/details/52206599
下拉状态栏会影响activity的生命周期吗 不会
onstop做了网络请求 onresume的时候怎么恢复???
OOM是否可以try catch 可以 但不是解决之道
Android 多进程场景 https://blog.csdn.net/seu_calvin/article/details/53932171
强引用置为null 会不会被回收 表示可以清理了 什么时候清理时GC的事
AndroidManifest作用与理解 https://blog.csdn.net/garyhu1/article/details/55666816
Android开启摄像头的主要步骤 http://www.jb51.net/article/87424.htm
AlertDialog,popupWindow,Activity区别 https://blog.csdn.net/qq_26358311/article/details/79578376
线程如何关闭 如何防止线程的内存泄漏 http://www.jb51.net/article/42146.htm https://blog.csdn.net/qq_32618417/article/details/51703435
viewpager懒加载 https://www.jianshu.com/p/7a47907f49c2
Android studio内存泄漏分析 https://blog.csdn.net/cxq234843654/article/details/51250306
插值器估值器 https://blog.csdn.net/qq_24530405/article/details/50630744
消息机制 https://blog.csdn.net/seu_calvin/article/details/52120086
systrace https://www.2cto.com/kf/201710/688172.html
微信小红点实现 https://www.zhihu.com/question/35462625
为什么不能再子线程中更新UI https://www.jianshu.com/p/ed1af0c6aee2 https://www.cnblogs.com/lao-liang/p/5108745.html
垃圾回收与System.gc https://blog.csdn.net/jiyiqini/article/details/46725647