随手记

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流

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来实现的