Activity
- 上一个activity的onPause执行完成后才会执行下一个activity的onResume,因此为了让第二个activity尽快显示出来,应该避免在onPause执行耗时操作。
- Activity在意外关闭时,在onStop方法调用前会调用onSaveInstanceState保存状态,包括View的数据等,View里面也实现onSaveInstanceState 和 onRestoreInstanceState方法,比如EditText里面有一个内部类SaveState用来保存和回复edittext信息。
- 默认启动一个Activity是将这个activity启动到当前Context的任务栈,如果利用非Activity的Context启动一个Activity,需要添加一个new_Task。
多进程
- 通常情况下,android中的多进程指的是一个应用程序中开启多进程的情况,可以在Androidmainfest文件中指定四大组件的process属性。
- Android在绑定服务的时候,服务会返回一个Binder对象,该对象需要序列化,实现serializable。
ThreadLocal
- 一个泛型类,对于同一个ThreadLocal对象,在不同线程访问该对象,可以返回不同的值。
- ThreadLocal有一个内部类Values,Thread类有一个Values成员变量,ThreadLocal的set和get方法,会根据当前线程去拿到不同的对象。
- 在handler机制中,每个线程都有一个looper对象。其实对于Looper类来说,它有一个静态成员变量looper,该成员变量使用ThreadLocal修饰的,这样再不同线程调用sThreadLocal.get()方法,所获得的looper对象就是对应线程的。
java内存
- java虚拟机内存分为堆区、栈区、方法区、本地(native)方法栈、程序计数器,其中方法区内又有一块特殊的区域,常量池。常量在编译阶段就已经导入常量池了。
- 寄存器,在cpu内部,程序员无法控制。
- 堆栈,ram,用来存放引用,即句柄。
- 堆,heap,用来存放对象。
- 静态存储,也存在于ram,用static修饰。
- 常量池。
java内存模型与线程
- 每个线程都有自己单独的内存区域,对于线程间公共的变量,每个线程都有一个拷贝。CPU在执行任务时,首先需要将公有数据复制到快速缓存区,运算完成后再刷回主内存,这就导致了线程之间的同步问题。
- 除了缓存一致性问题,还存在另外一种硬件问题,指令重排,为了使CPU内部运算单元能够被充分利用,处理器可能会对字节码指令重新排序处理。
- Java内存模型:本质上就是一套规范,在这套规范中有一个最重要的happens-before原则,A操作的结果对于B操作一定可见,则A happens-befor B,比如给共有变量添加volatile关键字修饰,给方法添加synchronized同步等。
protected修饰与不写修饰符的区别
- 作用范围都是包内可访问。区别:子类可使用父类的protected修饰的成员,不能使用父类无修饰符的成员。
内部类
- 成员内部类
- 静态成员内部类
- 局域内部类
- 匿名内部类
内存泄露
- 静态成员变量引起内存泄漏,static修饰的变量属于类所有,当static变量持有Activity对象时,Activity销毁并不会销毁对象。
- 单例模式引起内存泄露,懒汉式只有一个实例,也是静态的,类似第一条。
- asyncTask引起内存泄漏,一般asynctask用作匿名内部类的形式,会持有外部Activity对象,当activity退出时,asyncTask还在执行子线程。
- handler一般也是匿名内部类的形式存在,如果handler的Message还没处理完的话(比如handler.postDelay),activity此时退出了,那么这个activity对象仍然被handler对象持有。
- 属性动画一定要在onDestroy方法里要停止,不然会常驻内存。
so库的打包
- Android studio 默认会将jniLibs下的所有架构都打包进apk里面去,手机在安装app的时候选择一个架构,放在lib文件夹下,因此每个armeabi文件夹里的so库必须完整。
RecyclerView
- RecyclerView在xml里不能用权重,否则createViewHolder会执行多次。
接口的成员变量为什么是public static final 修饰?
- 接口就是用来继承的,就是为了让子类共享,因此为public。
- 接口的数据就是为了让所有子类共享,只需要一份,因此为static。
- 公共的数据,就不能在子类中更改,如果更改了,那么其他子类相应也更改了。
广播
- 不要在广播接收者里面开启线程,广播拥有自己的进程,当广播执行完receive()方法后,所在进程会成为空进程,很容易被系统回收。
内存回收方式
- 标记清除法,标记出可回收内存,一次性回收。
- 复制算法,将内存分为两块,只使用其中一块,快满时将存活对象复制到另一块,完全清除当前这一块。
- 标记整理算法,标记存活内存,将存活内存移到最前边,清除后面所有。
- 分代收集算法,将堆分成老年代和轻年代,轻年代可回收对象比较多,采用复制算法,轻年代采用标记法。
java io流

解决jcenter的库下载不下来的问题
- 讲”jcenter()”替换为:
1
maven{url'http://maven.aliyun.com/nexus/content/groups/public/'}
jvm内存回收机制
- 每个线程都有独立的虚拟机栈,用来保存线程本地变量名和局部变量值。
- 对象回收有两种方式,引用计数法和可达性分析法。引用计数法是指对象每被引用一次计数就加一,当计数为0时说明可被回收,这种方式的弊端是A对象和B对象交叉引用时不会被回收。
技能点
- 二维码识别
- 百度地图,高德地图
- 蓝牙3.0 4.0开发
- greendao 3.0 一对多的应用
- 关键字离线语音识别
- 图像跟踪jni接口编写
泛型
- 泛型类似于形参,分为泛型类、泛型接口、泛型方法
- 泛型只在编译阶段有效,不在运行阶段生效
- 泛型形参为具体类时才有约束作用,其他字母时传任何类都可以
- public与返回值中间添加
的方法才是泛型方法 1
public <T> T getObject(){}
查找中文字符串
- find in path 输入如下内容:^((?!(*|//)).)+[\u4e00-\u9fa5]
android类加载
- android系统无法直接运行.class文件,系统将.class文件打包成.dex文件,.dex文件主要由PathClassLoader和DexClassLoader加载
- PathClassLoader用来加载系统apk和安装在手机里apk的dex
- DexClassLoader可以加载任何路径包含Dex的jar和apk,热修复就是用DexClassLoader来实现的