进程间通信方式

 

  1. 主要有intent,只支持Bundle支持的数据类型;
  2. Messenger 支持一对多串行通信,用于发送消息及Bundle数据;
  3. AIDL 功能强大,可调用服务端方法;
  4. ContentProvider 主要支持进程间共享数据;
  5. BroadCastReceiver 广播也可实现进程间通信,发送消息及数据

 

线程间通信方式

 

  1. 使用volatile关键字(修饰基本类型数据),实现线程间共享内存,保证数据的可见性;
  2. 使用object类的wait()和notify()方法配合synchronized使用
  3. 使用Lock类或者LockSupport类实现线程间的阻塞和唤醒

 

Activity的生命周期以及启动模式

 

生命周期如下图

2020 android面试题总结部分

启动模式分为四种

  1. Standard 标准模式,每次启动都会生成新的实例,应用于邮件,manifest无配置默认为此种启动模式
  2. SingleTop 栈顶复用 在栈顶存在该实例便复用,否则新建,应用于登录页面,推送消息栏,复用拉起时走onNewIntent()方法
  3. SingleTask 栈内复用模式,在栈内存在该实例则复用,上面的实例清出栈,主要用于主页面,支付页面,webview页面
  4. SingleInstance  栈内只存在一个实例,主要用于系统Launcher,锁屏键,来电显示等

 

关于==和equals的区别和联系

 

1)对于==,比较的是值是否相等

  (1)如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

(2)如果作用于引用类型的变量,则比较的是所指向的对象的地址

2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是  同一个对象

(1)如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

(2)诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

 

Thread和Runnable的区别以及Thread的start和run的区别

 

  1. Thread和Runnable都可以实现多线程(还可以用Executors实现线程池和callable)
  2. Thread是类,Runnable是接口,runnable可以实现复用
  3. Start方法开启子线程,run是Thread内部的方法,开启线程调用run()无法实现多线程

 

MVC MVP MVVM 的区别及特点

 

  1. MVC中view承担了部分controller的功能,无法达到逻辑的复用
  2. MVP 通过view和p层即Presenter的相互持有,p调用modele,将逻辑方法抽象成接口,presenter中去具体实现,view层只是调用p的方法;优点是模型视图完全分离,presenter中的方法可以重用,缺点是presenter与view联系紧密,视图改变,presenter也要随之改变,实现方法过多,不易维护
  3. MVVM 采用双向绑定(data-binding),优点是代码简单,view的变动自动反应在viewModel中,反之亦然,缺点是维护性差,代码不易阅读

 

关于View的事件传递

 

可以参考这篇文章https://www.jianshu.com/p/a7ce6d8dcf5b

具体代码可看https://www.iteye.com/blog/pjwqq-2186142

 

String,StringBuffer,StringBuilder的区别

  1. String不可改变对象,一旦创建就不能修改;
  2. StringBuffer创建之后,可以去修改,当多个线程同步操作数据,使用StringBuffer
  3. StringBuilder也可修改,执行效率高于StringBuffer,线程不安全
  4. 字符赋值频繁使用StringBuilder

简述JNI

是java和c语言之间的桥梁,由于java是一种半解释语言,可以被反编译出来,一种重要涉及安全的代码就使用了C编程,再者很多底层功能调用C语言都实现了Java没必要重复造轮子,所以定义了JNI接口的实现

Android性能优化

  1. 布局优化: 减少布局层级,使用ViewStub提高显示速度,布局服用,尽可能少使用warp_content,删除空间中无用的属性,避免过度绘制移除window默认背景,按需显示占位图,自定义View优化,使用canvas.clipRect()识别可见区域
  2. 启动速度:采用分布加载,异步加载,延期加载提高应用初始化速度,采用线程初始化数据等,合理的刷新机制
  3. 内存方面:防止内存泄露,使用一些第三方工具检测解决
  4. 代码优化:遵循Java生命周期
  5. 安装包优化:删除无用资源,优化图片,代码混淆,避免重复库存在
  6. 网路优化:避免过多的网络请求,做好数据缓存;减小数据传输,对传输数据进行压缩

Java常用数据结构

 

HashMap HashTable区别

  1. HashTable方法同步,方法用synchronized修饰,多线程场合
  2. HashTable不允许null值
  3. 遍历方式,HashTable使用Enumeration遍历,HashMap使用Iterator遍历
  4. hash数组大小默认11,HshTable增加为old*2 + 1,HashMap默认16,增加为2的指数倍
  5. HashTable线程安全,但是需要获得对象锁,一般使用CurrentHashMap
  6. HashTable竞争同一把锁,ConcurrentHashMap

LinkedList ArrayList区别

  1. 双向链表&Object数组
  2. 插入删除&随机查找
  3. 都是不同步的,不保证线程安全
  4. 内存空间占用,ArrayList在结尾预留容量空间,LinkedList每一个元素消耗更多的空间

 

Android的动画类型

主要分为帧动画,补间动画和属性动画;

属性动画和补间动画区别

  1. 补间动画可以设置4个方向的动画, 属性动画指定任意动画
  2. 补间动画是针对UI控件执行的动画, 属性动画是针对对象进行的动画
  3. 补间动画移动后, 控件的实际位置没有变化 ;
  4. 属性动画会随着位置的变化而变化

Post和get的区别

 

  1. get请求的参数是拼接在url中的,浏览器对get请求的参数长度是限制的
  2. Post请求的参数是放在http请求的body当中的,相比get请求来说相对安全,post请求的可以携带的数据相比get请求在浏览器中可以更大

 

内存泄露如何查看和解决

概念:有些对象只有有限的生命周期,当他们的任务完成之后,它们将被垃圾回收,如果在对象的生命周期本该结束的时候,这个对象还被一系列的引用,着就会导致内存泄露。
解决方法:使用开源框架LeakCanary检测针对性解决
常见的内存泄露有:
1)单例造成的内存泄露,例如单例中的Context生命周期大于本身Context生命周期
线程使用Hander造成的内存卸扣,当activity已经结束,线程依然在运行更新UI非静态类2)使用静态变量导致无法回收释放造成泄露
3)WebView网页过多造成内存泄露
4)资源未关闭造成泄露,例如数据库使用完之后关闭连接

 

 

 

相关文章: