必看Android 500道高薪面试题集

发布时间 : 星期二 文章必看Android 500道高薪面试题集更新完毕开始阅读

掉。使用onScrollStateChanged可以检测是否滚到最后一行且停止滚动然后执行加载 23. ListView图片异步加载实现思路

1)先从内存缓存中获取图片显示(内存缓冲)

2)获取不到的话从SD卡里获取(SD卡缓冲,从SD卡获取图片是放在子线程里执行的,否则快速滑屏的话会不够流畅)

3)都获取不到的话从网络下载图片并保存到SD卡同时加入内存并显示(视情况看是否要显示) 24. Intent的原理、作用、可以传递哪些类型的参数 答:

intent是连接Activity, Service, BroadcastReceiver, ContentProvider四大组件的信使,,可以传递八种基本数据类型以及string, Bundle类型,以及实现了Serializable或者Parcelable的类型。

Intent可以划分成显式意图和隐式意图。

显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。

隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。 25. 如何实现屏幕分辨率的自适应(布局、九线图、目录)

答: 最好可以通过权重(layout_weight)的方式来分配每个组件的大小,也可以通过具体的像素(dip)来确定大小。 尽量使用Relativelayout 。

已知应用支持平台设备的分辨率,可以提供多个layout_320*480 ...

drawable-hdpi,drawable-mdpi,drawable-ldpi分别代表分辨率为480*800,360*480,240*360, 放置图片大小相差1.5倍

最后还需要在AndroidManifest.xml里添加下面一段,没有这一段自适应就不能实现:

android:largeScreens=\android:normalScreens=\ android:anyDensity = \

在标签和 标签之间添加上面那段代码。即可。

备注:三者的解析度不一样,就像你把电脑的分辨率调低,图片会变大一样,反之分辨率高,图片缩小

还可以通过.9.png实现图片的自适应 26. 简述Android中的IPC机制

IPC(Inter-Process Communication,进程间通信),aidl是 Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口.编译器可以通过扩展名为aidl的文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的.

BroadcastReceiver也可以实现进程间通信 ContentProvider 提供进程间数据共享 27. Android程序入口如何判断

action节点中的android.intent.action.MAIN表明它所在的Activity是整个应用程序的入口点

28. android哪几种方式访问网络 http协议:超文本传输协议

7

(最底层的是Socket,接着是URLConnection,HttpClient) HttpURLConnection

HttpClient方式(HttpGet和HttpPost类) 29. 说说HttpClient的通信过程

1)生成请求对象(HttpGet get,HttpPost post) 2)生成客户端对象 HttpClient client

3)执行请求接收相应 HttpResponse response = client.execute(post) HttpEntity entity = response.getEntity() 4)得到数据流

InputStream inputStream = entity.getContent(); 5)最后关闭过期连接

30. 移动互联数据交互格式有哪些及其区别 (Json(有数据类型)与xml(没有)的区别?) 移动互联数据交互格式有XML和JSON 1)JSON和XML的数据可读性基本相同 2)JSON和XML同样拥有丰富的解析手段 3)JSON相对于XML来讲,数据的体积小 4)JSON与JavaScript的交互更加方便 5)JSON对数据的描述性比XML较差

31. XML解析有哪几种?各自优缺点,官方推荐使用哪种 基本的解析方式有三种: DOM,SAX,Pull

1)dom解析解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构的优点是对文档增删改查比较方便,缺点占用内存比较大。

2)sax解析基于事件驱动型,优点占用内存少,解析速度快,缺点是只适合做文档的读取,不适合做文档的增删改查。

3)pull解析同样基于事件驱动型,android 官方API提供,可随时终止,调用next() 方法提取它们(主动提取事件) 32. sax解析代码

首先SAXParserFactory来创建一个SAXParserFactory实例 SAXParserFactory factory = SAXParserFactory.newInstance(); 根据SAXParserFactory实例来创建SAXParser SAXParser产生SAXReader

XMLReader reader = factory.newSAXParser().getXMLReader();

XMLReader 加载XML,然后解析XML,在解析的过程中触发相对于接口中的事件处理程序 33. 百度地图核心类,及实现的功能

BMapManager:地图引擎管理类,负责初始化,开启地图API,终止百度地图API等工作 MKSearch:搜索服务.用于位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索 MKSearchListener搜索结果通知接口。该接口返回poi搜索,公交搜索,驾乘路线,步行路线结果 MapView:显示地图的View

MyLocationOverlay:一个负责显示用户当前位置的Overlay。

Overlay:Overlay是一个基类,它表示可以显示在地图上方的覆盖物。 34. GC内存泄露在什么情况下会出现?怎么解决 a) 查询数据库没有关闭游标

b) 构造Adapter时,没有使用缓存的 convertView

8

c) Bitmap对象不在使用时调用recycle()释放内存 d) 不用的对象没有及时释放对象的引用 35. android内存的优化

答:android内存泄露容易导致内存溢出,又称为OOM。 Android内存优化策略:

1)在循环内尽量不要使用局部变量 2)不用的对象即时释放,即指向NULL 3)数据库的cursor即时关闭。 4)构造adapter时使用缓存contentview

5)调用registerReceiver()后在对应的生命周期方法中调用unregisterReceiver() 6)即时关闭InputStream/OutputStream。

7)android系统给图片分配的内存只有8M, 图片尽量使用软引用, 较大图片可通过BitmapFactory缩放后再使用,并及时recycle

8)尽量避免static成员变量引用资源耗费过多的实例。 36. 加载大图片的时候如何防止内存溢出

答: android系统给图片分配的内存只有8M,当加载大量图片时往往会出现OOM。 Android加载大量图片内存溢出解决方案:

1)尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存,可以通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source

2)使用BitmapFactory.Options对图片进行压缩

InputStream is = this.getResources().openRawResource(R.drawable.pic1); BitmapFactory.Options options=new BitmapFactory.Options(); options.inJustDecodeBounds = false;

options.inSampleSize = 10; //width,hight设为原来的十分一 Bitmap btp =BitmapFactory.decodeStream(is,null,options);

3)运用Java软引用,进行图片缓存,将需要经常加载的图片放进缓存里,避免反复加载 及时销毁不再使用的Bitmap对象 if(!bmp.isRecycle() ){

bmp.recycle() //回收图片所占的内存 system.gc() //提醒系统及时回收 }

37. Android缓存机制

答: 客户端缓存机制是android应用开发中非常重要的一项工作,使用缓存机制不仅仅可以为用户节省3G流量,同时在用户体验方面也是非常好的选择,比如有些新闻客户端支持离线模式,也是通过缓存机制实现的.缓存机制分为两部分,一部分是文字缓存,另一部分是多媒体文件缓存. 文字缓存有两种实现:

1)可以将与服务器交互得到的json数据或者xml数据存入sd卡中,并在数据库添加该数据的记录.添加数据库记录时,提供两个关键字段,一个是请求的URL,另一个则是本地保存后的文件地址,每次加载数据之前都会根据URL在数据库中检索

2)将JSON数据解析后装入List对象中,然后遍历List,将数据统统写入相应的数据库表结构中,以后每次向服务器发起请求之前可以先在数据库中检索,如果有直接返回. 多媒体文件缓存:主要指图片缓存

9

图片的缓存可以根据当前日期,时间为名字缓存到SD卡中的指定图片缓存目录,同时数据库中做相应记录,记录办法可以采用两个关键字段控制,一个字段是该图片的URL地址,另一个字段是该图片的本机地址.取图片时根据URL在数据中检索,如果没有则连接服务器下载,下载之后再服务器中作出相应记录 缓存文件删除策略:

1)每一个模块在每次客户端自动或者用户手动更新的时候删除相应模块的缓存文件,并重新下载新的缓存文件.

2)在设置界面中提供删除缓存的功能,点击后删除本机所有缓存. 38. 如何实现消息推送

有哪些方式,各自优缺点,最常使用哪种

答:实现消息推送的方式有五种,分别是轮询,SMS,C2DM,MQTT,XMPP最常使用的是XMPP, 我们做项目时采用的是XMPP协议

1)XMPP协议,它是一种基于XML的传递协议,具有很强的灵活性和可扩展性。它的特点是将复杂性从客户端转移到了服务器端。GTalk、QQ、IM等都用这个协议。

2)轮询:客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送,而是去服务端拽数据。但是实现简单,主要缺点:耗电,浪费用户流量等

3)Google的C2DM,具体不细说,缺点,服务器在国外,不是很稳定。 4)通过短信方式, 但是很难找到免费短信平台 5.)MQTT协议, IBM提供的一种推送服务,不太灵活 39. MVC在Android中的应用

答: Android中界面部分也采用了当前比较流行的MVC框架,在Android中:

1) 视图层(View):一般采用XML文件进行界面的描述,使用的时候可以非常方便的引入。也可以使用JavaScript+HTML等的方式作为View层,通过WebView组件加载,同时可以实现Java和JavaScript之间的通信。

2) 控制层(Controller):这句话也就暗含了不要在Acitivity中写代码,要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Acitivity的响应时间是5s,如果耗时的操作放在这里,Android的控制层的重任通常落在了众多的Acitvity的肩上,程序就很容易被回收掉。

3) 模型层(Model):对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。

在Android SDK中的数据绑定,也都是采用了与MVC框架类似的方法来显示数据。在控制层上将数据按照视图模型的要求(也就是Android SDK中的Adapter)封装就可以直接在视图模型上显示了,从而实现了数据绑定。比如显示Cursor中所有数据的ListActivity,其视图层就是一个ListView,将数据封装为ListAdapter,并传递给ListView,数据就在ListView中显示。 40. Android自定义组件实现思路 答: Android自定义组件有三种实现思路:

1) 继承某个现有组件,在其基础上添加额外功能,如继承Gallery实现CoverFlow效果 2) 继承某个Layout,实现复合组件自定义,如TextView和EditText组合实现登录注册组件 3) 继承View,实现onDraw()方法,实现自己绘制组件,如翻页效果组件 41. 版本更新的实现思路

答:在服务器相应URL上有版本文件, 客户端同时存储该应用当前版本号

(SharedPreferences/Sqlite), 每次打开应用,去检测服务器版本号与本地版本号是否一致,如果不一致,则自定义对话框提示是否下载更新 42. 播放视频有哪些实现方式

10

联系合同范文客服:xxxxx#qq.com(#替换为@)