Android面试

面试时间较短,要考虑到各个方面

1、请解释下在单线程模型中Message,Handler,Message Queue,Looper之间的关系。

拿主线程来说,主线程启动时会调用Looper.prepare()方法,会初始化一个Looper,放入Threadlocal中,接着调用Looper.loop()不断遍历MessageQueue,Handler的创建依赖与当前线程中的Looper,如果当前线程没有Looper则必须调用Looper.prepare()。Handler,sendMessage到MessageQueue,Looper不断从MessageQueue中取出消息,回调handleMessage方法。

2, 同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?

可以放在不同的Task中。需要为不同的activity设置不同的affinity属性,启动activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记。

3, 横竖屏切换时候Activity的生命周期。

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

4, 如何理解Activity,View,Window三者之间的关系?

这个问题真的很不好回答。所以这里先来个算是比较恰当的比喻来形容下它们的关系吧。Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图)LayoutInflater像剪刀,Xml配置像窗花图纸。

1:Activity构造的时候会初始化一个Window,准确的说是PhoneWindow。

2:这个PhoneWindow有一个“ViewRoot”,这个“ViewRoot”是一个View或者说ViewGroup,是最初始的根视图。

3:“ViewRoot”通过addView方法来一个个的添加View。比如TextView,Button等

4:这些View的事件监听,是由WindowManagerService来接受消息,并且回调Activity函数。比如onClickListener,onKeyDown等。

5,Activity的几种LaunchMode及使用场景

standard 模式

这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。使用场景:大多数Activity。 singleTop
模式

如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent()
),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。使用场景如新闻类或者阅读类App的内容页面。
singleTask 模式

如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent()
)。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。使用场景如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。
singleInstance 模式

在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例(
会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity
都会进入同一个应用中。使用场景如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A
-> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。

6, 如何避免Overdraw

Overdraw就是过度绘制,是指在一帧的时间内(16.67ms)像素被绘制了多次,理论上一个像素每次只绘制一次是最优的,但是由于重叠的布局导致一些像素会被多次绘制,而每次绘制都会对应到CPU的一组绘图命令和GPU的一些操作,当这个操作耗时超过16.67ms时,就会出现掉帧现象,也就是我们所说的卡顿,所以对重叠不可见元素的重复绘制会产生额外的开销,需要尽量减少Overdraw的发生。 第一招:合理选择控件容器 第二招:去掉window的默认背景 第三招:去掉其他不必要的背景 第四招:ClipRect &
QuickReject 第五招:ViewStub 第六招:Merge 第七招:善用draw9patch 第八招:慎用Alpha
第九招:避免“OverDesign”

7, Android中一个Touch时间的分发流程

System -> Activity -> PhoneWindows -> dockerView -> ViewGroup

8, 为什么Fragment不能接受到按键Key事件,而Dialog可以?

Fragment只是ViewGroup的生命周期管理者,而Dialog拥有一个完整的子Window对象,Activity会优先分配事件到前台的Dialog.

9, Service的生命周期,两种启动方法,有什么区别:

1.context.startService() ->onCreate()- >onStart()->Servic running–>(如果调用context.stopService() )->onDestroy() ->Service shutdown
1).如果Service还没有运行,则调用onCreate()然后调用onStart();
2).如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。
3).调用stopService的时候直接onDestroy,
4).如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。
2.context.bindService()->onCreate()->onBind()->Service running–>onUnbind() -> onDestroy() ->Service stop
1).onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。
2).这个时候会把调用者和Service绑定在一起,Context退出了,Service就会调用onUnbind->onDestroy相应退出。
3).所以调用bindService的生命周期为:onCreate –> onBind(只一次,不可多次绑定) –> onUnbind –> onDestory。

10, 怎么保证service不被杀死

1.提升service优先级
2.提升service进程优先级
3.onDestroy方法里重启service

11, 广播的两种注册方法,有什么区别。

1.静态注册:如果有广播信息来,你写的广播接收器同样的能接受到,比如系统的一些广播。
2.动态注册:当应用程序结束了,广播自然就没有了,一些自己定义的广播

12, 有没有使用过热修复框架?简单介绍一下

13,是否了解过React Native,简单介绍一下

14, 如何实现一个全屏100帧的帧动画?

最优解:OpenGL ES自主绘图
再次,SurfaceView实现双缓存,加入LruCache缓存算法
再次,必然行不通

15,属性动画的核心是那个类,可否作用于非View对象?

TypeEvaluator.java,可以,属性动画不止针对动画,对Object的可访问的对象属性都可以操作。

16,接触过那些第三方扩展?

友盟,shareSDK, Jpush, 地图,支付。。。

17, 在Android安全方面,有什么经验?

通信安全(服务器通信,组件通信), 数据加密,数据验签,代码混淆,WebView/Js调用安全

18, 经常使用到的调试工具有什么?

Logcat, Adb, HierarchyViewer, TraceView, Heap, Lint…

19, 对于性能优化有什么建议?

UI优化, 内存优化, 电量优化, 流量优化

20, Android目前存在哪几种设计模式,分别介绍

MVC,MVP, MVVM

21, 如何选择Android版本适配问题?

根据什么,选择最低支持版本?

22, 举出你知道的Android M, N,的新特性

分屏,画中画,文件访问权限的改变,JobServie…

23,简单说说你的屏幕适配方案?

百分比布局(适用于要保持界面中各个元素大小比例一致)
xml文件像素布局,为不同的屏幕分辨率给定指定的大小
xml文件dp布局,为不同的分辨率指定可伸缩的大小
px转dp,协定转换公式,根据一张固定分辨率的原型图上的标注自动转换到其他分辨率
Flex布局(FaceBook开源Yoga,比较新)

24, 有没有用过EventBus或者RxAndroid等基于事件的响应式库,简单介绍一下

Evetbus事件总线
RxAndroid, 异步基于事件的响应式编程
Agera, 类似于Rx,模型为push Event/pull Data

25, 你认为的Android发展方向在哪?Kotlin语言有什么样的看法?

你可能感兴趣的:(android,面试,Android)