2015 8月 面试记,一些android的面试题

本文汇总了一系列Android面试常问的技术问题及其解答,包括Activity启动模式、Fragment生命周期、屏幕旋转时的状态保存策略、动画类型及区别等,是Android开发者面试准备的良好参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上周,找了一周的工作,去了不少公司面试。有几百人的中型公司,也有优秀的创业公司。

被问到的一些问题,总结一下。答案是我自己写的,有些不知道正不正确,只是给个参考。


1.Activity 启动模式
答:
a.standard:标准模式,调用startActivity()就会生成一个新实例
b.singleTop:如果已经有一个实例在栈的顶部,这时不会生成新实例,而是调用Activity的newInstance()方法。如果不位于栈的顶部,则生成一个新的实例。
c.singleTask:会在一个新的Task里生成一个实例,以后每次调用都会使用这个实例,不会生成新的实例
d.singleInstance:会singleTask基本一样,但有一点不同:singleInstance的Task里只能有一个实例

2.Fragment生命周期
答:
a.onAttach()
b.onCreate()
c.onCreateView()
d.onActivityCreate()
e.onStart()
f.onResume()
g.onPause()
h.onStop()
k.onDestroyView()
l.onDestroy()
m.onDetach()

3.屏幕旋转,怎样能保存Fragment状态
答:
判断Fragment实例是否为空。
主要是因为,当Activity因为配置发生改变(屏幕旋转)或者内存不足被系统杀死,造成重新创建时,我们的fragment会被保存下来,但是会创建新的FragmentManager,新的FragmentManager会首先会去获取保存下来的fragment队列,重建fragment队列,从而恢复之前的状态。

4.android动画有多少种,有什么区别
答:
Tween:缩放、平移、渐变、旋转
Frame:帧动画,一般是用几张图片,每一张图片作为一帧的动画

5.android调用jni的使用方法
答:
1.生成共享库的头文件
2.实现JNI原生函数源文件
3.编译生成so库

6.android底层
答:
android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层

7.Service生命周期
答:
有二种,
onCreate()
onStartCommand()
onDestroy()

onCreate()
onBind()
onUnbind()
onDestroy()

8.请解释下在单线程模型中Message,Handler,Message Queue,Looper之间的关系。
答:
拿main线程来说,main线程启动时会调用Looper.prepare()方法,会初始化一个Looper,放入MainThread中,接着调用Looper.loop()不断遍历Message Queue,Handler的创建依赖与当前线程中的Looper,sendMessage到MessageQueue,Looper不断从MessageQueue中取出消息,回调handleMessage方法。

9.线程间的通信
答:
wait()、notify()、notifyAll()

10.接口能不能有变量?
答:
可以,但必须是static final

11.对面向对象的理解
答:
继承、封装、多态

12.要加载很多张图片,该怎么做,不要用别人的框架。
答:
压缩图片:减小图片占用的内存
LruCache:缓存、管理内存,不会OOM
线程池:开启多线程加载
ViewHolder重用View:减少创建、回收View

13.View的绘制过程
答:
可以简单归为三个方法的调用。
a.onMeasure():计算视图大小
b.onLayout():安置视图位置
c.onDraw():绘制视图 

14.onTouch事件的传递过程
答:

可以简单归为三个方法。
Touch事件,有四种状态:AUCTION_DOWN,AUCTION_UP,AUCTION_MOVE,AUCTION_CANCEL,Android的众多事件就是由这四种状态组成。

a.dispatchTouchEvent():负责分发事件
b.onInterceptTouchEvent():负责拦截事件
c.onTouchEvent():对事情进行处理

对于ViewGroup类的控件,有一个很重要的方法,就是onInterceptTouchEvent(),用于处理事件并改变事件的传递方向,它的返回值是一个布尔值,决定了Touch事件是否要向它包含的子View继续传递,这个方法是从父View向子View传递。而方法onTouchEvent(),用于接收事件并处理,它的返回值也是一个布尔值,决定了事件及后续事件是否继续向上传递,这个方法是从子View向父View传递。touch事件在 onInterceptTouchEvent()和onTouchEvent以及各个childView间的传递机制完全取决于onInterceptTouchEvent()和onTouchEvent()的返回值。返回值为true表示事件被正确接收和处理了,返回值为false表示事件没有被处理,将继续传递下去。

ACTION_DOWN事件会传到某个ViewGroup类的onInterceptTouchEvent,如果返回false,则DOWN事件继续向子ViewGroup类的onInterceptTouchEvent传递,如果子View不是ViewGroup类的控件,则传递给它的onTouchEvent。

如果onInterceptTouchEvent返回了true,则DOWN事件传递给它的onTouchEvent,不再继续传递,并且之后的后续事件也都传递给它的onTouchEvent。
如果某View的onTouchEvent返回了false,则DOWN事件继续向其父ViewGroup类的onTouchEvent传递;如果返回了true,则后续事件会直接传递给其onTouchEvent继续处理。(后续事件只会传递给对于必要事件ACTION_DOWN返回了true的onTouchEvent。

onInterceptTouchEvent()用于处理事件并改变事件的传递方向。处理事件这个不用说了,你在函数内部编写代码处理就可以了。而决定传递方向的是返回值,返回为false时事件会传递给子控件的onInterceptTouchEvent();返回值为true时事件会传递给当前控件的onTouchEvent(),而不在传递给子控件,这就是所谓的Intercept(截断)。


onTouchEvent() 用于处理事件,返回值决定当前控件是否消费(consume)了这个事件。可能你要问是否消费了又区别吗,反正我已经针对事件编写了处理代码?答案是有区别!比如ACTION_MOVE或者ACTION_UP发生的前提是一定曾经发生了ACTION_DOWN,如果你没有消费ACTION_DOWN,那么系统会认为ACTION_DOWN没有发生过,所以ACTION_MOVE或者ACTION_UP就不能被捕获。

15.性能优化
答:
网络方面:网络数据作GZip压缩、数据缓存
布局方面:<include>标签、<viewstub>标签、<merge>标签
代码方面:handler.removeCallbacksAndMessages(null);

16.Java 同步锁,成员变量锁和静态方法锁
答:

17.android进程间通信
答:

18.activity service 通信
答:
a.Activity调用bindService (Intent service, ServiceConnection conn, int flags)方法,得到Service对象的一个引用,这样Activity可以直接调用到Service中的方法,如果要主动通知Activity,我们可以利用回调方法
b.Service向Activity发送消息,可以使用广播,当然Activity要注册相应的接收器。比如Service要向多个Activity发送同样的消息的话,用这种方法就更好 

19.Android广播注册有什么方式,有什么区别?Android中使用广播的用意是什么?
答:
a.Android提供了两种注册广播接受者的形式,分别是在程序中动态注册和在xml中指定。他们之间的区别就是作用的范围不同,程序动态注册的接收者只在程序运行过程中有效,而在xml注册的接收者不管你的程序有没有启动有会起作用。
b.组件间或者应用程序间的通信,解耦 

20.从开发人员的角度解释什么是Android
答:









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值