1.如何保证Service不被杀死
a.设置onStartCommand()的返回值为START_STICKY
b.启动前台服务,在内存不足的时候不会被回收
c.用户通过setting->stop时,在销毁时发送广播启动服务
2.contentprovider作用
a.对数据操作提供统一的接口,将上层业务与底层数据解耦
b.进程间数据共享
3.图片三级缓存(fresco)
a.Bitmap内存缓存
Bitmap缓存存储Bitmap对象,这些Bitmap对象可以立刻用来显示或者用于后处理
在5.0以下系统,Bitmap缓存位于ashmem, 5.0及其以上系统, Bitmap缓存直接位于Java的heap上。
b.未解码图片的内存缓存
这个缓存存储的是原始压缩格式的图片,图片在显示之前,需要调整大小,解码。
c.磁盘缓存
未解码的原始压缩格式的图片,在使用之前同样需要经过解码等处理
4.多态
含义:不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态
原理:动态绑定机制(程序运行过程中<编译后>通过动态创建的对象的方法表来定位方法的方式)
注:静态方法是属于类的,方法的调用不具有多态
5.static块执行顺序
static静态代码块可以看做是一个没有名字、没有参数、没有返回值的静态方法,会在main方法执行前主动执行的,它和静态变量的初始化顺序与代码书写位置有关。
6.单例模式
a.dcl
public class SingleTon {
private static volatile SingleTon instance;
private SingleTon(){
}
public static SingleTon newInstance(){
if(instance==null){
synchronized(SingleTon.class){
if(instance==null){
instance=new SingleTon ();
}
}
}
return instance;
}
}
b.类加载器的初始化
public class Singleton {
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.instance;
}
}
7.synchronized
原理(字节码层面):
同步代码块:monitorenter指令在代码起始位置,monitorexit指令在结束位置,每一个monitorenter都有一个monitorexit。线程执行到monitorenter指令时,尝试获取对象的锁。如果当前线程已经拥有对象的锁,那它可以重入这个锁,重入计数器的值会加1。
同步方法: 通过Class文件的方法表中将该方法的access_flags字段中的synchronized标志位置1表示该方法是同步方法,并调用该方法的对象或所属的Class做为锁对象。
作用:
a.共享变量操作的同步 b. 共享变量的内存可见性
同步代码块与同步方法的区别:
同步代码块的同步区域比同步方法小,降低线程切换带来的系统开销
8.volatile
作用:
a.共享变量可见性
当写一个volatile变量时,JMM会把线程对应的工作内存中的变量拷贝刷新到内存中,当另一个线程读取一个volatile变量时,JMM会它的工作内存中的变量拷贝置为无效,只能从内存中重新读取变量。
b.禁止指令重排序,指令间插入一条Memory Barrier通知编译器和CPU,不管什么指令都不能和这条Memory Barrier指令重排序