android面试中遇到的问题

最近面试好多东西都忘记了,脑子记不住东西,好记性不如烂笔头,所幸都记录在这里,以备忘记时参考。

 

1、Java中的值传递和引用传递的区别?

(1) 基本数据的传值,对形参的修改不会影响实参

(2) 引用类型传引用,形参和实参指向同一内存地址(即同一个对象),所以对参数的修改会影响到实际的对象

(3) String、Integer,Double等immutable的类型特殊处理,可以理解为传值,最后操作不会影响实参对象。

2、android 程序进入后台之后如何保证程序不会被回收?

 

一般来说,在Android系统中,当某进程较长时间不活动,或系统资源比较紧时,该进程可能被系统kill掉,以此来回收一些资源。Android系统会根据进程的优先级来选择性地杀死一些进程,优先级从高到低依次是:

1. 前台进程(Foreground Process

2. 可视进程(Visible Process

3. 服务进程(Service Process

4. 后台进程(Background Process

5. 空进程(Empty Process

因此,要想让自己写的service不被系统kill掉,正常的做法是尽量提高程序的优先级,比如调用startforeground(true),因为service启动默认标记为background,当前运行的activity被标记为foreground的时候,当service设置为foreground,service与当前activity优先级类似,但是这样也不能保证它不会被系统给杀死,

解决办法:将自己写的service变成 core service ,即将自己的程序提升为系统级别的程序,这样在任何情况下都不会被kill掉,前提是应用程序需要设置两个标志:FLAG_PERSISTENT(persistent)和FLAG_SYSTEM

3、Hashmap遍历的四种方式

(1)普通遍历方法:通过map。keySet遍历key和value(普通使用二次取值)

(2)通过map.entrySet使用iterator遍历key和value

(3)通过map.entrySet遍历key和value(使用于大容量的数据)

(4)通过map.values()遍历所有的value,而不能遍历key

4、Hashmap和HashTable的区别

相同点:实现原理相同,功能相同,底层都是哈希结构表,查询速度快,很多情况下可以互用。

不同点:体现在线程安全性,同步(synchronization),以及速度三个方面。

1. Hashmap几乎等价于hashtable,hashmap是非同步(synchronization),并且可以接受null(hashmap可以接受null的key和value而hashtable不行)

2. Hashmap是非synchronized,而hashtable是synchronized,意味着线程较安全,如果没有正确的同步的话,多个线程是不能共享HashMap的

3. Hashmap的迭代器是(iterator)是fail-fast迭代器,而hashtable的迭代器是(enumerator)不是fail-fast迭代器

4. 由于hashtable是synchronized且线程是安全的,所以在单线程情况下它比hashmap要慢

 

5、网络请求中的安全问题

通过加密和签名

APP和服务器的安全隐患

1. 窃听对网络数据进行加密

2. 篡改给数据加签名,

3. 重放HTTPS可以防止重放攻击

4. 反编译前端加限制肯定不够,需要后端重新加密一次

 

加密机制的问题:可以使用AES对称加密

签名机制的问题,用的是MD5加秘钥

RSA秘钥生成算法:随机生成两个足够大的素数p和q,

6、Android中的性能优化(借鉴某大佬的理念)

性能优化主要可以从四个方面去了解

1、稳定性(内存溢出、崩溃)  2、流畅性(卡顿)

2、损耗性(耗电、流量)      4、安装包(apk瘦身)

(1)稳定性-----------内存优化

由于android应用的沙箱机制,每个应用分配的内存是有限制的,内存太低就会触发lmk-low memory killer ,也就会出现闪退。所以会造成crash和ANR,原因可能是资源问题,static关键字使用等,因此不要在主线程中进行耗时操作

(2)流畅--------------交互化

交互是与用户体验最直接的方面,交互场景大概分为四个部分,UI绘制,应用启动,界面跳转,事件响应

建议:布局优化:在android中系统对view进行测量布局绘制时,都是通过对view数组的遍历来进行操作的,布局复用,使用include标签复用layout,提高显示速度,减少层级,删除控件中无用属性

绘制优化:布局的优化,移除xml中非必须的背景,自定义view的优化

启动优化:优化闪屏页的UI布局,通过profile GPU rendering检测丢帧情况。启动加载逻辑优化,采用分布加载,异步加载的方式

刷新优化:减少刷新次数,缩小刷新区域

(3)节省------------耗电优化

Android5.0之后引用了获取设备上电量消耗的API Battery Historian,是系统电量分析工具,此外计算优化,避开浮点运算,避免walelock使用不当

(4)Apk瘦身

应用安装包的大小对应用使用没有影响,但apk包越大,用户使用门槛越高,特别是在移动网络数据下,下载应用的时候

常用方案:代码混淆、资源优化(删除冗余资源,资源文件最少化)、图片优化(利用AApt对PNG图片进行压缩处理)、避免重复功能的库、插件化(比如功能模块放在服务器上,按需下载,可以减少安装包的大小)

7、屏幕适配

最好通过权重的方式来分配每个组件的大小,

也可以通过像素(dip)进行适配,

合理使用wrap_contenthe 和math_parent

8、自定义控件

可以有三种实现方式:

(1)继承某个现有的组件,在此基础上重写改组件的方法;比如继承galle ry重写coverFlow()方法

(2)复合型组件定义:继承某个layout,实现复合组件自定义,如TextView和editText组合实现登录注册控件

(3)继承view,实现ondraw(),实现自己绘制的组件,如翻页效果

注:在继承viewGroup的时候会重写ondraw()

9、android机型适配优化 

1. 合理使用wrap_content和math_parent

2. 尽可能使用RelativeLayout

3. 针对不同的机型使用不同的配置文件

4. 尽量使用.9图片

5. 使用与密度无关的像素单位(dp  sp)

6. 对不同的设备提供可选择的图片

7. 识别当前布局文件是哪个?这个主要采用标志位的方式获取当前布局文件信息,针对当前布局没有的控件进行判断是否为null,

8. 根据当前布局,使用不同的响应操作

9. 在其他activity中复用fragments

下面有一些楼主的面试总结可以借鉴:Android2017-2018最新面试题(3-5年经验个人面试经历)

9、activity的启动模式

10、谈谈对事件分发的理解

11、service的用法有两种startService 和bindService使用

12、activity的生命周期和fragment的生命周期有何不同

13、简述rxJava的使用

14、Handler原理简单描述一下

15、scrollview和recycleview 滑动事件冲突怎么解决

16、glide用法在使用过程成遇到的问题

17、MVC和MVP和MVVM的区别

18、简单谈一下异步

19、内存优化(在使用项目的时候做过哪些)(20181015)

 

这是我面试过程中遇到的问题,答案有时间在续

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值