知识点1:Android 开发过程中版本适配:
Android 4.4:
uri转path需要适配。
Android 5.0适配:
分包适配 -〉在5.0及以上在app的gradle文件中配置multiDexEnabled true即可,但是5.0以下需要倒入jar,然后在Application的attch方法中进行初始化。 ###Android 6.0适配: 动态权限处理。
Android 7.0适配:
-
Uri.fromFile()适配:使用FileProvider适配。
-
出于安全考虑关闭了系统网络、拍照、录像广播。
Android 7.0适配:
-
Service启动方式需要使用startForegroundService()启动服务。
-
Notification 适配:添加了渠道和组的概念。
-
Android 8.0去掉了允许未知来源,需要用户手动授权允许,Android程序需要在AndroidManifest.xml文件中添加REQUEST_INSTALL_PACKAGES权限。
知识点2:
java中equals和==的区别
基本数据类型==比较的是值是否相等,非基本数据类型==比较的是内存地址是否相等。
equals比较的是内存地址。
String、StringBuffer、StringBuilder的区别(运行速度:StringBuilder>StringBuffer>String)
String
:字符串常量,每次修改都相当于生成一个新的对象,所以不适合经常变更值的场景。
StringBuffer
:字符串常量,线程安全适用于多线程。
StringBuilder
:字符串常量,线程不安全,适用于单线程,效率略快于StringBuffer。
速度上面String不断复制和更改是创建不同的对象来进行操作,涉及到GV垃圾回收机制,会影响速度;而StringBuffer和StringBuilder则处理同一个对象不存在JVM的GC回收。
线程是否安全:如果一个StringBuffer 对象在字符串缓冲区中被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder 的方法则没有该关键字,所以不保证线程安全、不能同步的问题。所以多线程操作时需要使用StringBuf,但是单线程情况下,为了速度,建议使用StringBuilder。
java8新特性
Lamabda表达式、接口的默认方法和静态方法、重复注解、方法引用、更好的类型推断、拓展注解应用场景、访问局部变量、Filter过滤器、Stream接口、sort排序、Map映射、DataApi。
谈谈JVM的理解
Handler机制的原理与R小Java的区别(待补充)
相同点:线程间通信。
区别:R小Java线程切换更方便(直接可以切换子线程和UI线程),Handler需要在子线程中去发消息,然后主线程中接收消息刷新UI。
广播的创建方式以及区别
静态创建
和动态创建
区别:动态注册快于静态注册,无论优先级高低。
动态注册周期跟随Activity的生命周期,静态注册广播为常驻型。
数据存储方式
- Sharedpreferences(适合轻量级数据存储,采用xml键值对存储)
- 本地文件存储
- SQLite数据库存储
- ContentProvider
- 网络存储
服务启动方式以及对应生命周期的区别
- startService (onCreate - onStartCommand - onDestory)
- bindService (onCreate - onBind - onUnbind - onDestory)
线程间通信方式
- 接口
- Handler
- 观察者模式(EventBus)
- Android使用runOnUIThread切换到主线程
- AsyncTask
- BroadCast
- SharedPreferences
进程间通信方式
- Intent:访问其他Activity 或者隐式调用系统app
- ContentProvider:用于多个APP共享数据
- AIDL
- BroadCast
- Socket
ANR发生的情况以及如何避免