Android面试题整理

最近找实习,狠狠恶补了一下Android基础。整理出一份文档来。分享一下……
因为是准备来面试的答题的,所以很多都是口语化,并且只说出一个大概,后面每天拿出一个来详细写。
话说Android面试,感觉java才是重点啊,好多都是问java问题的。
基础真的很重要!!!

【android5.0】
碎片化的问题开始得到改善
系统风格更偏向扁平加拟物
全新的通知栏,优先显示重要通知
不同数据独立保存
有了新的API支持

【app性能优化】
1.不做没必要的工作
2.尽量避免内存分配
(不必要的临时变量申明,使用基本类型而非对象类型,两个平行数组 a[],b[]优于a,b对象数组)
少的对象创建意味着低频的垃圾回收。
4.用静态代替虚拟。
(如果不需要访问某对象的字段,将方法设置为静态,调用速度会增加15%~20%)
5.对常量使用static final修饰
编译器会通过类初始化方法初始化这个常量,并得到一个引用。通过static final修饰就不需要
6.避免内部的Getters/Setters。
对于一个经常被访问的字段,不宜采用。但要结合安全性进行考虑。
7.采用改进的for循环。
(1.用临时变量去的数组长度。2.采用for-each循环。java: for(int a:array))
8.在私有内部内中,考虑用包访问权限替代私有访问权限
内部类直接访问外部类的私有成员是有代价的。
9.浮点数的使用会比整型慢两倍
性能优化 http://www.oschina.net/question/195301_32202

【多屏幕适配 】
1.使用Fragment
2.使用九格拉伸图像(.9.png)
3.使用 dp sp这样的单位,避免使用固定的单位。
4.使用灵活布局,将屏幕包装在可延伸的布局中。
5.不要屏幕元素尺寸等设置绝对值。使用相对位置、weight,gravity等
6.素材提供多种分辨率格式
7.在Manifest配置中,设置支持特点屏幕类型。

【Android四大组件】
Activity: Activity是Android程序与用户交互的窗口,是android构造快最基本的一种,通常是一个单独的屏幕,显示界面与接收事件并处理。管理生命周期跳转逻辑。
Content_Provider:使一个应用程序制定的数据集提供给其他应用程序,多个应用程序通过ContentProvider来共享数据。通过文件系统、Sqlite数据库等等。
Service:具有长生命周期,没有界面。一般用来处理后台耗时的功能。
BroadcastReceiver:广播接收器,应用通过广播接收器过滤自己感兴趣的事件并作出响应,也可以通过activity或service或NotificationManager来通知用户。应用也可以通过广播接收器和其他应用通信

【BroadCastRceiver的理解】
广播接收者。安卓的四大组件,唯一一个能动态注册的组件
应用程序可以通过广播接收器过滤自己感兴趣的事件,并作出响应。
应用程序也可以进行广播和其他应用进行通信。
还可以通过启动activity或发送notificationManager通知用户
广播不可以做比较耗时的操作,否则会弹出ANR。
耗时工作交给service,但是不能用子线程来解决,因为生命周期很短,所以可能子线程还没结束,broadcastRceiver就被系统杀死了

【广播的生命周期】
广播的生命周期很短、发送intent后找匹配的action,如果有就会调用receiver,获得receiver对象,再执行onReceive方法。然后就没有了

Intent intent = new Intent();
intent.setAction(“…”);
Context.sendOrderedBroadcast(intent,null);

【Service生命周期】
http://www.cnblogs.com/mengdd/archive/2013/03/24/2979944.html
通过startService: onCreate onStart onDestroy stopSelf()关闭
通过bindService: onCreate onBind unbindService()解除绑定

【与service通信方式】
①通过Intent方式启动service可以传参
②绑定service可以得到service的实例,通过这个实例可以访问service中的方法。利用回调的方式service可以主动通知activity
③通过广播的方式

【service和IntentService区别】
service是为了保证某些组件在后台也能运行,他不是独立进程,他也是运行在主线程里的。耗时和逻辑操作会引起ANR
耗时操作用IntentService来处理。IntentService继承了service,但是内部开了一个独立线程。
通过Handler机制实现了一个多线程操作。

【ContentProvider实现原理,为什么能够共享数据】
程序通过实现ContentProvider的抽象接口将自己的数据完全暴露出去。这种方式类似于数据库表,
也就是说ContentProvider像一个数据库,外界通过url通过contentprovider去访问并操作这些被暴露的数据

【Android常见的五种布局】
LinearLayout 线性布局
TableLayout 表格布局
RelativeLayout 相对布局
FrameLayout 框架布局
AbsoluteLayout 绝对布局

【Android的动画有哪几类】
(view)tween animation:补间动画 组件的移动放大缩小透明度
(drawable)frame animation:帧动画 顺序方式播放排列好的图片
Property Animation:属性动画。 view动画改变的是组件的绘制, 属性动画改变的是组件的实际属性

【ListView优化方案】
分页加载
判断convertView是否以存在
用viewHolder保存以创建的view
用软引用保存数据

【Android启动模式】
singleStandard
singleTop
singleTask
singleInstance

配置LauncherMode属性
Intent.setFlags(int flags)
FLAG_ACTIVITY_BROUGHT_TO_FRONT 不会开新的,从下面调到最上面
FLAG_ACTIVITY_NO_HISTORY 一旦退出就不存在栈中

【Android的数据存储方式】
SharedPreferences存储数据
文件存储数据
SQLite数据库
ContentProvider
网络存储

【多线程】
使用AsyncTask
Thread
View.post开线程
activity.runOnUiTheard 开线程

【说说对AsyncTask的理解】
对于耗时操作,我们一般开一个子线程执行,如果需要更新UI,就要用到handle
如果耗时操作太多,那需要开很多个子线程,这给系统带来很大负担,影响到性能问题。这个时候可以用AsyncTask来解决。AsyncTask对线程间的通讯做了包装,使后台线程和UI线程可以简易通信,后台将result告诉前台UI并更新。
Task不许在UI线程中创建、execute必须在UI线程中调用,Task只能被执行一次,多次调用会出现异常

【线程池】
线程池作用就是限制系统中执行线程的数量
1.减少创建和销毁线程的次数,让线程可以重用(队列方式)
2.可以根据系统的承受能力,调整线程池中工作线程的数目

【Handler机制】
子线程无法更新UI线程的控件,那么子线程就通过Handler机制实现子线程修改控件的功能

UI线程初始化Handler时会通过TheardLocal创建一个Looper,其他handler初始化的时候直接用这个looper,looper初始化时会创建一个消息队列。

子线程用handler向主线程发送message,message进入主线程的消息队列里。looper对消息队列进行轮询,如果有消息就发到handler。由handler的handlmessage处理。

Handler创建消息引入了消息池机制。创建消息时查询消息池是否存在消息,有的话直接调用,没有再创建。提高了对消息的复用。减少java垃圾回收次数。
UI线程初始化Handler时会通过TheardLocal创建一个Looper,保证只有一个looper,其他handler初始化的时候直接用这个looper,looper初始化时会创建一个消息队列。
looper循环查询消息队列,有消息时就取出来交给handler处理。

【TheardLoacl】
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.
ThreadLocal并不是一个Thread,而是Thread的局部变量。
ThreadLocal为每个使用该变量的线程提供独立的变量副本,多线程程序的并发问题

【触摸事件的分发】
向下找消费者,然后向上找处理方法。
第一步生成event对象,第二步分发envent对象,第三步消费事件
第一步:donw事件包装成 event。
第二步:调用activity事件分发方法。由父Activity执行
布局容器类继续分发。调用布局的父类ViewGroup的分发方法
两种情况:
(1)布局找到了消费控件(Button),调用Button的分发方法,其父类View的分发方法
调用控件的onTouchEventfang方法处理事件。 不是真正的处理,只是找到了消费事件的控件
(2)没有找到消费控件,调用布局的onTouchEvent()处理,返回false表示没有找到消费者,move,up不需要分发了,调用activity的onTouchEvent()方法处理
消费事件:
第三步:在up动作执行完以后,根据第二步两种处理方法
找到消费控件,调用控件的监听方法
没找到,这个事件没有消费就被终止了。

【通过Intent传递一些二进制数据的方法有哪些?】【序列化的方法有哪些】
使用Serializable接口实现序列化(java)
实现Parcelable接口,这里Android的部分类比如Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见的。

【Serializable、Parcelable的区别】
http://www.cnblogs.com/blueofsky/archive/2012/01/07/2315664.html
Serializable是早期的序列化接口,类只要实现这个接口就可以了,但是它的效率较低。
为了改善,就开发了Parcelable接口。Parcelable效率要高很多,但是需要实现一个静态变量和一个writeToParcel方法。需要自己打包和解包。
Serializable会产生大量临时变量影响性能,但是如果要把数据保存在磁盘上,就不建议用Parcelable了。

【Activity生命周期】
Activity状态:活动、暂停、停止、销毁
Activity初次启动:onCreate onStart onResume
Activity被销毁:onPause onStop onDestroy
Activity被停止:onPause onStop 恢复:onRestart onStart onResume(被销毁了执行onCreate)
Activity被暂停: onPause 恢复 onResume

【在onCreate方法中Bundle savedInstanceState 这个参数有什么作用】
这个参数对应两个方法。保证activity被销毁时可以保留某些非永久数据,在activity恢复的时候传给onCreate函数。。比如在按HOME键、锁屏键、启动另一个Activity、屏幕方向切换时会调用。然后在activity确定被销毁时,并且重新启动这个activity时。 调用另一个函数进行恢复

【介绍下android中的task】
sdk中对task有个比方,task就相当于应用的概念。通俗的说,我们的android应用程序就是油task组织起来的。
task就是一个以栈的形式组织起activity的集合。新的activity在栈的顶端,是唯一一个可以与用户见面的。最上面的activity完成任务销毁下面的activity就上来继续工作。如果内存不够了,系统就销毁最下面的activity。

【谈谈对SurfaceView的理解】
Surface是一块屏幕缓冲区,传统的VIEW共享一块屏幕缓冲区
SurfaceView创建的时候会创建一个MyWindow,也就是说SurfaceView内嵌了了一个自己的Surlface,利用独立线程进行绘制,提供了更高的帧率。
可以直接从硬件或内存中取得图像数据,是一个非常重要的绘图容器

【DDMS与TraceView的区别】
DDMS是一个程序执行查看器,在里面你可以看见线程和堆栈等信息,TraceView是程序性能分析器

【ListView异步加载图片】
1.利用软引用来缓存图片Bitmap,用图片的URL作为缓存查找的Key;
2.设两级缓存,一级是SoftReference,二级是本地SD卡;
3.如果两级缓存都没取到图片,则从服务器获取,并加入缓存;
4.加载完后通过回调接口通知UI更新;

【view的绘制过程】
mesure计算视图大小
layout布局
draw画图

【原型头像的绘制过程】
原理:现在canvas上画一个圆,然后再画一个Bitmap,这个Bitmap的边长是刚才画的圆的直径。
然后圆和Bitmap重合在一起了。

步骤是是先取要做的图片的长宽,做边长。通过边长我们绘制一个Bitmap。
然后创建一个Canvas,在上一步的Bitmap上画图。通过Canvas的构造方法把Bitmap传进去
操作Canvas画圆、将我们要的图片画到创建的Bitmap上去。

【.9.png和 .png区别】
png非失真性压缩位图
.9.png可以在保证不变形的情况下拉伸

【OOM怎么办】
【浮动窗口的实现】
【View刷新】
父View负责刷新,子View负责通知父View刷新

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值