第一:熟悉各大技术交流平台 社区 网站 并且贡献度高 活跃度高 gitlab github
第二:熟悉主流的一些算法 和数据结构 有对精练 高效率 高质量 (可阅读性 可扩展性 高内聚 低耦合)等代码的存储 以及封装了一些自己私有的库
第三:技术宽度 熟悉C C++ 语言 C# Java python kotlin 等编程语音 和数据库相关技术 Sqlite 网络技术 和相关的Js等脚本语言 学习跨平台技术 RN FLUTTER 等 另外
在学习后端接口开发技术
第四:技术深度 垂直领域 深度安卓应用层 框架层 以及音视频相关技术的深度研究 。
第五:安卓操作系统 各大技术框架 背后的设计思想 逻辑 算法 数据结构 应用场景 以及各自特点。
学习规划 :
一个月
常见的深度安卓面试问题
基础安卓常见开发以及功能开发
一个月
一些常见的算法 和数据结构
一个月
熟悉C C++ 语言 C# Java python kotlin 等编程语言特性
数据库 网络等相关技术知识了解
三个月
跨平台开发 RN FLUTTER 以及后端接口开发的了解
三个月
技术深度 OpenGl 深度音视频开发 框架层 FrameWork开发
Failed to resolve: com.github.kongqw:AndroidSerialPort:1.0.1
Affected 受影响 受感动的 ,Affected Modules: app
一般情况下 是在all projects maven 里面没有导入该 链接 另外是版本号不匹配 。
implementation ‘com.github.kongqw:AndroidSerialPort:1.0.0’
安卓基于Linux内核实现的操作系统,有必要了解一下 Linux的内存管理机制 。 android 又不同于linux 它是移动型操作系统 具有自己的特性 。内存管理机制 和进程之间的管理 。
CPU只能访问其寄存器(Register)和内存(Memory), 无法直接访问硬盘(Disk)。 存储在硬盘上的数据必须首先传输到内存中才能被CPU访问。从访问速度来看,对寄存器的访问非常快,通常为1纳秒; 对内存的访问相对较慢,通常为100纳秒(使用缓存加速的情况下);而对硬盘驱动器的访问速度最慢,通常为10毫秒。
堆栈(Stack):存储由该程序的每个函数创建的临时变量
堆(Heap):该区域特别适用于动态内存分配
数据(Data):存储该程序的全局变量和静态变量
代码(Code):存储该程序的指令
每个进程都有一个基址寄存器和限制寄存器:
基址寄存器保存最小的有效存储器地址
限制寄存器指定范围的大小
Virtual memory(虚拟内存)
虚拟内存(VM)是OS为内存管理提供的基本抽象。
所有程序都使用虚拟内存地址
虚拟地址会被转换为物理地址
物理地址表示数据的实际物理位置
物理位置可以是内存或磁盘
分页将物理内存划分为多个大小相等的块,称为帧(Frame)。并将进程的逻辑内存空间也划分为大小相等的块,称为页面(Page)。
任何进程中的任何页面都可以放入任何可用的帧中。
Android使用虚拟内存和分页,不支持交换
安卓单进程概念:
一般情况下,一个应用程序就是一个进程,这个进程名称就是应用程序包名。我们知道进程是系统分配资源和调度的基本单位,所以每个进程都有自己独立的资源和内存空间,别的进程是不能任意访问其他进程的内存和资源的。
很多涉及到大图片的频繁操作或者需要读取一大段数据在内存中使用时,很容易报OOM的问题。为了彻底地解决应用内存的问题,Android引入了多进程的概念,它允许在同一个应用内,为了分担主进程的压力,将占用内存的某些页面单独开一个进程,比如大图片的处理、子进程记录运行轨迹等。
进程 process 分为私有进程和全局进程
私有前面有冒号 全局前面没有冒号
安卓之间的线程之间的通信 有一个是主线程(也叫UI线程),其它的都是普通的工作线程。那么线程间通信就会分为两种情况:主线程和工作线程通信;工作线程和工作线程通信。
安卓启动流程 从上电开始App的详细流程:
1.打开电源 引导芯片代码加载引导程序Boot Loader到RAM中去执行
2.BootLoader把操作系统拉起来
3.Linux 内核启动开始系统设置,找到一个init.rc文件启动初始化进程
4.init进程初始化和启动属性服务,之后开启Zygote进程
5.Zygote开始创建JVM并注册JNI方法,开启SystemServer
6.启动Binder线程沲和SystemServiceManager,并启动各种服务
7.AMS启动Launcher
Recovery模式是Android特有的升级系统,通过这个可以进行手机恢复出厂设置,或执行OTA,补丁和固件升级,实质是启动了一个文本模式的Linux。
Zygote会执行一个app_process可执行文件,在这个文件中首先添加了Android运行时环境,在Android运行时中调用了ZygoteInit类,这就从c++代码跳到了java代码。
注册1.soceket,2.预加载资源,3.启动SystemServer进程,经过层层调用,最终会调用到SystemServer.main方法。4进入runSelectLoop循环处理事件。
2021.5.13
RxFFmpeg 是基于 ( FFmpeg 4.0 + X264 + mp3lame + fdk-aac ) 编译的适用于 Android 平台的音视频编辑、视频剪辑的快速处理框架,包含以下功能(视频拼接,转码,压缩,裁剪,片头片尾,分离音视频,变速,添加静态贴纸和 gif 动态贴纸,添加字幕,添加滤镜,添加背景音乐,加速减速视频,倒放音视频,音频裁剪,变声,混音,图片合成视频,视频解码图片等主流特色功能
图片加载框架 glide
// 加载本地图片
File file = new File(getExternalCacheDir() + “/image.jpg”);
Glide.with(this).load(file).into(imageView);
// 加载应用资源
int resource = R.drawable.image;
Glide.with(this).load(resource).into(imageView);
// 加载二进制流
byte[] image = getImageBytes();
Glide.with(this).load(image).into(imageView);
// 加载Uri对象
Uri imageUri = getImageUri();
Glide.with(this).load(imageUri).into(imageView);
加载添加占位图 Glide.with(this).load(url).placeholder(R.drawable.loading).into(imageView);
Glide.with(this).load(url).placeholder(R.drawable.loading).error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)//关闭Glide的硬盘缓存机制
.into(imageView);
//DiskCacheStrategy.NONE: 表示不缓存任何内容。
//DiskCacheStrategy.SOURCE: 表示只缓存原始图片。
//DiskCacheStrategy.RESULT: 表示只缓存转换过后的图片(默认选项)。
//DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。
加载指定格式的图片–指定为静止图片
Glide.with(this)
.load(url)
.asBitmap()//只加载静态图片,如果是git图片则只加载第一帧。
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
Glide.with(this)
.load(url)
.asGif()//加载动态图片,若现有图片为非gif图片,则直接加载错误占位图。
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.override(100, 100)//指定图片大小
.into(imageView);
lide.with(this)
.load(url)
.skipMemoryCache(true) //传入参数为false时,则关闭内存缓存。
.into(imageView);
Glide.with(this)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.NONE) //关闭硬盘缓存操作
.into(imageView);
//其他参数表示:
//DiskCacheStrategy.NONE: 表示不缓存任何内容。
//DiskCacheStrategy.SOURCE: 表示只缓存原始图片。
//DiskCacheStrategy.RESULT: 表示只缓存转换过后的图片(默认选项)。
//DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图
脚本语言 脚本语言又被称为扩建的语言,或者动态语言,是一种编程语言,用来控制软件应用程序,脚本通常以文本(如ASCII)保存,只在被调用时进行解释或编译。
脚本语言(JavaScript,VBscript等)介于HTML和C,C++,Java,C#等编程语言之间。
功能:移动支付 微信 支付宝,TagGroup 第三方标签 包括颜色和大小 形状等自定义View显示
腾讯sdk 视频直播 语音通话 视频通话 游戏 视频播放 第三方登录 以及支付 以及一些google推出的
一些前卫一点View功能 有盾人脸识别 消息推送 数据伏笔 首页动画特效 神策 自动报站 高德地图 百度地图
离线语音通讯包 Gps Jni Ndk mk 等文件 Kotlin 饺子播放器 视频录像回放 surfaceview 显示视频流
Jni将帧数据 反射到 java层 JT808协议 字段数据的传换 聊天功能 即时通讯 IM ,Sqlite数据库的本地存储
服务 广播 以及 ContentProvider 内容提供者 广播进行进程之间的通讯 闹钟功能 GPS 定位 UI 界面一键切换
线程之间的通信 生产者消费者 设计模式 各大框架的原理和设计思想和逻辑 进程之间的通信 以及框架层的理解
安卓的启动流程 渲染流程 以及activity显示的细致过程 以及各大服务组件 安卓的设计思想 以及内存管理机制
view时间点击的分发机制 以及各路基本算法 安卓系统层的框架设计 分层思想 设计思想 以及各大功能 和各大框架
的设计思想 和原理 设计模式 算法 和数据结构 安卓系统的深度理解 组件 控件 然后各大技术工具的使用 以及它的优化
性能的设计 执行效率和质量 检测 音视频深度研发 安卓的jni ndk 以及framework的开发 关键的还有RN FLUTTER WEEX
等跨平台之间的开发 以及多语言的设计 最主要的是了解一下 软件工程专业的功课 。
软件工程是一门研究用工程化方法构建和维护有效、实用和高质量的软件的学科。它涉及程序设计语言、数据库、
软件开发工具、系统平台、标准、设计模式等方面。
软件=程序+数据+文档。 定义阶段:可行性研究初步项目计划、需求分析;开发阶段:概要设计、详细设计、实现、测试;
运行和维护阶段:运行、维护、废弃
程序设计原则:原则:1、抽象;2、信息隐蔽;3、模块化;4、局部化;5、确定性;6,一致性;7、完备性;8、可验证性
软件工程导论 面向对象技术 和UML 信息检索 数据挖掘 数字图像处理 计算机导论 离散数学 数据结构 算法分析 数据库
物联网 软件工程导论 操作系统 计算机网络 系统分析与设计 编译原理 网络管理
高等数学、数字逻辑电路设计、计算机组成原理、C++、C#、Java语言程序设计、汇编语言程序设计、数据库、操作系统、编译技术、计算机网络、软件体系结构、软件工程、算法设计与分析等
安卓蓝牙适配器:
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(mBluetoothAdapter == null){
// 说明此设备不支持蓝牙操作
}
Retrofit 涉及到的设计模式
外观模式,构建者模式,工厂模式,代理模式,适配器模式,策略模式,观察者模式
AIDL:熟悉AIDL,理解其工作原理,懂transact和onTransact的区别;
Binder:从Java层大概理解Binder的工作原理,懂Parcel对象的使用;
多进程:熟练掌握多进程的运行机制,懂Messenger、Socket等;
事件分发:弹性滑动、滑动冲突等;
玩转View:View的绘制原理、各种自定义View;
动画系列:熟悉View动画和属性动画的不同点,懂属性动画的工作原理;
懂性能优化、熟悉mat等工具
懂点常见的设计模式
AIDL、Messenger、Binder、多进程、动画、滑动冲突、自定义View、消息队列等
了解SystemServer的启动过程
了解主线程的消息循环模型
了解AMS和PMS的工作原理
能够回答问题”一个应用存在多少个Window?“
了解四大组件的大概工作流程
系统核心机制
基本知识点的细节
设计模式和架构
书籍推荐
《Android开发艺术探索》、《Android 源码设计模式解析与实战》、《Android内核剖析》
组件化,热升级,热修复,框架设计
系统学习 对原理和底层了解透彻 经历过大型项目的开发 用户使用量庞大 技术视野窄 能力提升慢
Android核心高级技术PDF文档+BAT大厂面试真题解析
字节跳动,腾讯,华为,小米,等一线互联网公司主流架构技术
35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。
大厂最看重的除了基础,技术水平外,就是你的学习能力
1、Android属性动画实现原理
2、补间动画实现原理
3、Android各个版本API的区别
4、Requestlayout,onlayout,onDraw,DrawChild区别与联系
5、invalidate和postInvalidate的区别及使用
6、Activity-Window-View三者的差别
7、谈谈对Volley的理解
8、如何优化自定义View
9、低版本SDK如何实现高版本api?
10、描述一次网络请求的流程
11、HttpUrlConnection 和 okhttp关系
12、如何缩减APK包大小?
13、Android与服务器交互的方式中的对称加密和非对称加密是什么?
14、设备横竖屏切换的时候,接下来会发生什么?
15、Android启动Service的两种方式是什么? 它们的适用情况是什么?
16、谈谈你对Android中Context的理解?
17、Service的onCreate回调在UI线程中吗?9、请介绍下AsyncTask的内部实现,适用的场景是?
18、谈谈你对binder机制的理解?
19、Android中进程间通信有哪些实现方式?
20、介绍下实现一个自定义view的基本流程
21、Android中touch事件的传递机制是怎样的?
22、Android多线程的实现方式有哪些?
23、Android开发中何时使用多进程?使用多进程的好处是什么?
24、ANR是什么?怎样避免和解决ANR?
25、Android下解决滑动冲突的常见思路是什么?
26、如何把一个应用设置为系统应用?
27、内存泄露检测有什么好方法?
28、Android消息机制
29、Android View绘制流程,当一个TextView的实例调用setText()方法后执行了什么
30、Android dalvik虚拟机和Art虚拟机的优化升级点
31、Android屏幕渲染机制
32、热修复的原理,你都了解过哪几种热修复框架
33、OkHttp的原理
34、Android 线程池的实现原理
35、JavaGC机制
36、HashMap的实现机制,怎么样HashMap线程安全
37、可重入锁的实现,公平锁非公平锁都是什么定义?
38、都用过那些常用的数据结构,说说对树的了解?
39、Activity启动模式,allowReparent的特点和栈亲和性
40、WebView优化
41、有没有Jni使用经验
42、有使用过RxJava吗?
43、说说你对设计模式的理解,开发过程中主要用到了哪些设计模式?
44、冒泡排序的链表实现
45、写个快排
46、写个单例模式
47、Activity启动模式
48、异常生命周期
49、从点击应用图标到进入应用,Android系统都做了哪些工作,期间涉及到的进程切换有哪些?
50、说说你了解的IPC方法
51、说说Binder的大体实现
52、怎么控制另外一个进程的View显示
53、广播中怎么进行网络请求
54、说说Android中线程池的实现
55、HashMap如果Hash冲突了怎么解决?
56、双线程通过线程同步的方式打印
阿里 P8级别 七大主流技术模块,视频+源码+笔记
总而言之 需要深入学习 what how why 帮助自己深度分析 成长 。
Android 成熟的网络框架
Retrofit Okhttp Volley AsyncHttpClient , 原理 设计模式 和各自的特点
Retrofit 结合 RxJAVA使用
OkHttp的底层是通过Java的Socket发送HTTP或HTTPS请求与接受响应,但是OkHttp实现了连接池的概念,即对于同一主机的多个请求,其实可以公用一个Socket连接,而不是每次发送完HTTP请求就关闭底层的Socket,这样就实现了连接池的概念。而OkHttp对Socket的读写操作使用的OkIo库进行了一层封装。
15个安卓通用的流行框架
DiskLruCache java 实现基于LRU磁盘缓存
安卓图片加载框架
Android Universal Image Loader 一个强大的加载,缓存,展示图片的库
Picasso 一个强大的图片下载与缓存的库
Fresco 一个用于管理图像和他们使用的内存的库
Glide 一个图片加载和缓存的库
名称 描述
Picasso-transformations 一个为Picasso提供多种图片变换的库
Glide-transformations 一个为Glide提供多种图片变换的库
Android-gpuimage 基于OpenGL的Android过滤器
名称 描述
Android Async HTTP Android异步HTTP库
AndroidAsync 异步Socket,HTTP(客户端+服务器),WebSocket,和socket.io库。基于NIO而不是线程。
OkHttp 一个Http与Http/2的客户端
Retrofit 类型安全的Http客户端
Volley Google推出的Android异步网络请求框架和图片加载框架
名称 描述
Gson 一个Java序列化/反序列化库,可以将JSON和java对象互相转换
Jackson Jackson可以轻松地将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象
Fastjson Java上一个快速的JSON解析器/生成器
HtmlPaser 一种用来解析单个独立html或嵌套html的方式
Jsoup 一个以最好的DOM,CSS和jQuery解析html的库
数据库
名称 描述
OrmLite JDBC和Android的轻量级ORM java包
Sugar 用超级简单的方法处理Android数据库
GreenDAO 一种轻快地将对象映射到SQLite数据库的ORM解决方案
ActiveAndroid 以活动记录方式为Android SQLite提供持久化
SQLBrite SQLiteOpenHelper 和ContentResolver的轻量级包装
Realm 移动数据库:一个SQLite和ORM的替换品
依赖注入
名称 描述
ButterKnife 将Android视图和回调方法绑定到字段和方法上
Dagger2 一个Android和java快速依赖注射器。
AndroidAnotations 快速安卓开发。易于维护
RoboGuice Android平台的Google Guice
图表
名称 描述
WilliamChart 创建图表的Android库
HelloCharts 兼容到API8的Android图表库
MPAndroidChart 一个强大的Android图表视图/图形库
后台处理
Tape 一个轻快的,事务性的,基于文件的FIFO的库
Android Priority Job Queue 一个专门为Android轻松调度任务的工作队列
事件总线
EventBus 安卓优化的事件总线,简化了活动、片段、线程、服务等的通信
Otto 一个基于Guava的增强的事件总线
响应式编程
RxJava JVM上的响应式扩展
RxJavaJoins 为RxJava提供Joins操作
RxAndroid Android上的响应式扩展,在RxJava基础上添加了Android线程调度
RxBinding 提供用RxJava绑定Android UI的API
Agera Android上的响应式编程
名称 描述
Logger 简单,漂亮,强大的Android日志工具
Hugo 在调试版本上注解的触发方法进行日志记录
Timber 一个小的,可扩展的日志工具
Mockito Java编写的Mocking单元测试框架
Robotium Android UI 测试
Robolectric Android单元测试框架
名称 描述
Stetho 调试Android应用的桥梁,使得可以利用Chrome开发者工具进行调试
名称 描述
LeakCanary 内存泄漏检测工具
ACRA Android应用程序崩溃报告
另外一个就是说 还记得你当时高中的时候 物理力学相关的问题 你可以迎刃而解 。你躺在高中的宿舍里 大脑就在想这些东西 用你的抽象 形象 想象思维取深度理解 。 32 到 47 岁是一个男人的黄金年龄,一切刚刚好 。 人家35岁腾讯员工 实现了财务自由 开始退休了 , 那么好 我给自己的小目标 48岁 晚十三年 。 充分弥补之前的时间的浪费 。 加油 叶永清
A type-safe HTTP client for Android and Java Retrofit
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(“http://www.kuaidi100.com/”)
.addConverterFactory(GsonConverterFactory.create())
.build();
RetrofitService service = retrofit.create(RetrofitService.class);
Call call = service.getPostInfo(“yuantong”, “11111111111”);
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
Log.i(“http返回:”, response.body().toString() + “”);
}
@Override
public void onFailure(Call call, Throwable t) {
}重写onResponse(请求成功回调)和onFailure(请求失败回调)方法,response参数中包含了请求结果中的所有信息(body、code、headers等)
RetrofitService的getPostInfo方法中,我们使用了@GET注解,说明这是一个GET方法,当然也可以写成HTTP协议中的其他请求方法(比如POST、PUT、DELETE、HEAD 等等网络请求方法
observable.subscribeOn(Schedulers.io()) // 在子线程中进行Http访问
.observeOn(AndroidSchedulers.mainThread()) // UI线程处理返回接口
.subscribe(new Observer() { // 订阅
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(PostInfo postInfo) {
Log.i("http返回:", postInfo.toString() + "");
}
});
0’
public class RetrofitUtils {
/**
* 获取OkHttpClient
* 用于打印请求参数
*
* @return OkHttpClient
*/
public static OkHttpClient getOkHttpClient() {
// 日志显示级别
HttpLoggingInterceptor.Level level = HttpLoggingInterceptor.Level.BODY;
// 新建log拦截器
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.i("Http请求参数:", message);
}
});
loggingInterceptor.setLevel(level);
// 定制OkHttp
OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
// OkHttp进行添加拦截器loggingInterceptor
httpClientBuilder.addInterceptor(loggingInterceptor);
return httpClientBuilder.build();
}
}
安卓数据的五种存储方式
① 使用SharedPreferences存储数据
② 文件存储数据
③ SQLite数据库存储数据
④ 使用ContentProvider存储数据
⑤ 网络存储数据
Android提供了一种方式来暴露你的数据(甚至是私有数据)给其他应用程序 - ContentProvider。它是一个可选组件,可公开读写你应用程序数据。
SharedPreference类提供了一个总体框架,使您可以保存和检索的任何基本数据类型( boolean, float, int, long, string)的持久键-值对(基于XML文件存储的“key-value”键值对数据)。
通常用来存储程序的一些配置信息。其存储在“data/data/程序包名/shared_prefs目录下。
xml 处理时Dalvik会通过自带底层的本地XML Parser解析,比如XMLpull方式,这样对于内存资源占用比较好。
/Android/data/package_name/cache/目录下做外部缓存
SQLite它是一个独立的,无需服务进程,支持事务处理,可以使用SQL语言的数据库。
sychronized 关键字 解决高并发的网络请求 解决系统吞吐量的问题 减小锁的颗粒度 提高并发能力 。
session 会议 会期 的问题 。
安卓异步方式实现加载 数据 主线程 也称之为UI线程 。
2021.5.14
安卓线程创建的俩种方式 Thread handler 以及 threadpool exception
new Thread(new Runnable() {
@Override
public void run() {
Bitmap bitmap = getBitmapFromFile(PATH);
handler.post(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
}
}).start();
class BitmapAsyncTask extends AsyncTask
@Override
protected void onProgressUpdate(Integer… values) {
super.onProgressUpdate(values);
}
@Override
protected Bitmap doInBackground(String... strings) {
// 在doInBackground方法中执行耗时操作
Bitmap bitmap = getBitmapFromFile(strings[0]);
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
// 在onPostExecute方法中进行ui操作
imageView.setImageBitmap(bitmap);
}
AsyncTask
class BitmapAsyncTask extends AsyncTask
@Override
protected void onProgressUpdate(Integer… values) {
super.onProgressUpdate(values);
}
@Override
protected Bitmap doInBackground(String... strings) {
// 在doInBackground方法中执行耗时操作
Bitmap bitmap = getBitmapFromFile(strings[0]);
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
// 在onPostExecute方法中进行ui操作
imageView.setImageBitmap(bitmap);
}
}
Scheduler 调度器
Java多线程之间通信 等待唤醒机制
volatile是变量修饰符,而synchronized则作用于一段代码或者方法。
volatile只是在线程内存和main memory(主内存)间同步某个变量的值;而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源。
const、final、lock
Android anr 等常见问题
UI线程(main)有耗时操作
视图渲染时间过长,导致卡顿
安卓造成 OOM: (1)不恰当地使用static关键字 (2)内部类对Activity的引用 (3)大量Bitmap的使用会导致程序包运行时的内存消耗变大 (4)游标Cursor对象用完应该及时关闭 (5)加载对象过大 (6)相应资源过多,来不及释放。
ANR: (1)在5秒内没有响应输入的事件(IO操作耗时、数据库操作复杂耗时、主线程非主线程产生死锁等待、网络加载/图片操作耗时、硬件操作耗时) (2)BroadcastReceiver在10秒内没有执行完毕(Service binder数量达到上限、Service忙导致超时无响应)
Glide三级缓存
内存缓存,磁盘缓存、网络缓存(由于网络缓存严格来说不算是缓存的一种,故也称为二级缓存)。缓存的资源分为两种:原图(SOURCE)、处理图(RESULT)(默认)。
内存缓存:默认开启的,可以通过调用skipMemoryCache(true)来设置跳过内存缓存,缓存最大空间:每个进程可用的最大内存*0.4。(低配手机0.33)
磁盘缓存:分为四种:ALL(缓存原图)、NONE(什么都不缓存)、SOURCE(只缓存原图)、RESULT(之后处理图),通过diskCacheStrategy(DiskCacheStrategy.ALL)来设置,缓存大小250M。
MVVM和MVP的区别貌似不大,只不过是presenter层换成了viewmodel层,还有一点就是view层和viewmodel层是相互绑定的关系,这意味着当你更新viewmodel层的数据的时候,view层会相应的变动ui。
(1) Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图) LayoutInflater像剪刀,Xml配置像窗花图纸。
(2) a. Fragment可以作为Activity界面的一部分组成出现;
b. 可以在一个Activity中同时出现多个Fragment,并且一个Fragment也可以在多个Activity中使用;
c. 在Activity运行过程中,可以添加、移除或者替换Fragment;
d. Fragment可以响应自己的输入事件,并且有自己的生命周期,它们的生命周期会受宿主Activity的生命周期影响。
安卓应用程序的跨进程通讯:
AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写,对于小白来说,AIDL的作用是让你可以在自己的APP里绑定一个其他APP的service,这样你的APP可以和其他APP交互。
AIDL中你可以使用的基本类型(int, long, boolean, float, double, String)
由于应用程序之间不能共享内存。在不同应用程序之间交互数据(跨进程通讯),在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service。其中Activity可以跨进程调用其他应用程序的Activity;Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播;Service和Content Provider类似,也可以访问其他应用程序中的数据,但不同的是,Content Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。
Brocast(广播)
广播是一种被动跨进程通讯的方式。当某个程序向系统发送广播时,其他的应用程序只能被动地接收广播数据。这就象电台进行广播一样,听众只能被动地收听,而不能主动与电台进行沟通。
在应用程序中发送广播比较简单。只需要调用sendBroadcast方法即可。该方法需要一个Intent对象。通过Intent对象可以发送需要广播的数据。如显示系统时间
ContentProvider
ContentProvider向我们提供了我们在应用程序之前共享数据的一种机制,而我们知道每一个应用程序都是运行在不同的应用程序的,数据和文件在不同应用程序之间达到数据的共享不是没有可能,而是显得比较复杂,而正好Android中的ContentProvider则达到了这一需求,比如有时候我们需要操作手机里的联系人,手机里的多媒体等一些信息,我们都可以用到这个ContentProvider来达到我们所需。
android.injected.testOnly=false 安装包异常 oppoA5 关于手机
Java 开启线程有俩种方法 一种是继承Thread 另外一个 实习那runanble对象 。
Java基础方面:JVM、String、内部类、多态、抽象和接口、集合框架(Hashmap、Arraylist)、单例、线程、Synchronized、Look锁、动态代理、引用
Android基础方面:四大组件、View、进程、Bitmap、屏幕适配、消息机制、线程异步、WebView。
Android扩展方面:ART、Apk优化、Hook、Proguard、架构(MVC/MVP/MVVM)、Jetpack、NDK开发。
Android源码方面:Leakcanary、Eventbus
设计模式方面:面向对象六大原则、工厂模式、单例模式、建造者模式、观察者模式、适配器模式、策略模式、代理模式
算法方面:排序、二叉树、链表、栈和队列、二分、hash表、堆、数组/双指针、字符串处理、动态规划
网络知识:Http(缓存、Https、Http2.0)、TCP(三次握手四次挥手、socket)、类加载器