进程间通信方式
- 主要有intent,只支持Bundle支持的数据类型;
- Messenger 支持一对多串行通信,用于发送消息及Bundle数据;
- AIDL 功能强大,可调用服务端方法;
- ContentProvider 主要支持进程间共享数据;
- BroadCastReceiver 广播也可实现进程间通信,发送消息及数据
线程间通信方式
- 使用volatile关键字(修饰基本类型数据),实现线程间共享内存,保证数据的可见性;
- 使用object类的wait()和notify()方法配合synchronized使用
- 使用Lock类或者LockSupport类实现线程间的阻塞和唤醒
Activity的生命周期以及启动模式
生命周期如下图
启动模式分为四种
- Standard 标准模式,每次启动都会生成新的实例,应用于邮件,manifest无配置默认为此种启动模式
- SingleTop 栈顶复用 在栈顶存在该实例便复用,否则新建,应用于登录页面,推送消息栏,复用拉起时走onNewIntent()方法
- SingleTask 栈内复用模式,在栈内存在该实例则复用,上面的实例清出栈,主要用于主页面,支付页面,webview页面
- SingleInstance 栈内只存在一个实例,主要用于系统Launcher,锁屏键,来电显示等
关于==和equals的区别和联系
1)对于==,比较的是值是否相等
(1)如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
(2)如果作用于引用类型的变量,则比较的是所指向的对象的地址
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是 同一个对象
(1)如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
(2)诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
Thread和Runnable的区别以及Thread的start和run的区别
- Thread和Runnable都可以实现多线程(还可以用Executors实现线程池和callable)
- Thread是类,Runnable是接口,runnable可以实现复用
- Start方法开启子线程,run是Thread内部的方法,开启线程调用run()无法实现多线程
MVC MVP MVVM 的区别及特点
- MVC中view承担了部分controller的功能,无法达到逻辑的复用
- MVP 通过view和p层即Presenter的相互持有,p调用modele,将逻辑方法抽象成接口,presenter中去具体实现,view层只是调用p的方法;优点是模型视图完全分离,presenter中的方法可以重用,缺点是presenter与view联系紧密,视图改变,presenter也要随之改变,实现方法过多,不易维护
- MVVM 采用双向绑定(data-binding),优点是代码简单,view的变动自动反应在viewModel中,反之亦然,缺点是维护性差,代码不易阅读
关于View的事件传递
可以参考这篇文章https://www.jianshu.com/p/a7ce6d8dcf5b;
具体代码可看https://www.iteye.com/blog/pjwqq-2186142
String,StringBuffer,StringBuilder的区别
- String不可改变对象,一旦创建就不能修改;
- StringBuffer创建之后,可以去修改,当多个线程同步操作数据,使用StringBuffer
- StringBuilder也可修改,执行效率高于StringBuffer,线程不安全
- 字符赋值频繁使用StringBuilder
简述JNI
是java和c语言之间的桥梁,由于java是一种半解释语言,可以被反编译出来,一种重要涉及安全的代码就使用了C编程,再者很多底层功能调用C语言都实现了Java没必要重复造轮子,所以定义了JNI接口的实现
Android性能优化
- 布局优化: 减少布局层级,使用ViewStub提高显示速度,布局服用,尽可能少使用warp_content,删除空间中无用的属性,避免过度绘制移除window默认背景,按需显示占位图,自定义View优化,使用canvas.clipRect()识别可见区域
- 启动速度:采用分布加载,异步加载,延期加载提高应用初始化速度,采用线程初始化数据等,合理的刷新机制
- 内存方面:防止内存泄露,使用一些第三方工具检测解决
- 代码优化:遵循Java生命周期
- 安装包优化:删除无用资源,优化图片,代码混淆,避免重复库存在
- 网路优化:避免过多的网络请求,做好数据缓存;减小数据传输,对传输数据进行压缩
Java常用数据结构
HashMap HashTable区别
- HashTable方法同步,方法用synchronized修饰,多线程场合
- HashTable不允许null值
- 遍历方式,HashTable使用Enumeration遍历,HashMap使用Iterator遍历
- hash数组大小默认11,HshTable增加为old*2 + 1,HashMap默认16,增加为2的指数倍
- HashTable线程安全,但是需要获得对象锁,一般使用CurrentHashMap
- HashTable竞争同一把锁,ConcurrentHashMap
LinkedList ArrayList区别
- 双向链表&Object数组
- 插入删除&随机查找
- 都是不同步的,不保证线程安全
- 内存空间占用,ArrayList在结尾预留容量空间,LinkedList每一个元素消耗更多的空间
Android的动画类型
主要分为帧动画,补间动画和属性动画;
属性动画和补间动画区别
- 补间动画可以设置4个方向的动画, 属性动画指定任意动画
- 补间动画是针对UI控件执行的动画, 属性动画是针对对象进行的动画
- 补间动画移动后, 控件的实际位置没有变化 ;
- 属性动画会随着位置的变化而变化
Post和get的区别
- get请求的参数是拼接在url中的,浏览器对get请求的参数长度是限制的
- Post请求的参数是放在http请求的body当中的,相比get请求来说相对安全,post请求的可以携带的数据相比get请求在浏览器中可以更大
内存泄露如何查看和解决
概念:有些对象只有有限的生命周期,当他们的任务完成之后,它们将被垃圾回收,如果在对象的生命周期本该结束的时候,这个对象还被一系列的引用,着就会导致内存泄露。
解决方法:使用开源框架LeakCanary检测针对性解决
常见的内存泄露有:
1)单例造成的内存泄露,例如单例中的Context生命周期大于本身Context生命周期
线程使用Hander造成的内存卸扣,当activity已经结束,线程依然在运行更新UI非静态类2)使用静态变量导致无法回收释放造成泄露
3)WebView网页过多造成内存泄露
4)资源未关闭造成泄露,例如数据库使用完之后关闭连接