1.要做到一个尽可能流程的ListView,如何进行优化?
(1),Item布局,层级越少越好,使用hierarchyview工具查看有优化。
(2),复用convertView,ViewHolder
(3),item中有图片的时候,进行异步加载
(4),在用户快速滑动的时候,不加载图片
(5),item中有图片的时候,对应图片进行适当的压缩
(6),实现数据的分页加载
2.Service的onCreate回调在UI线程中吗?
Service生命周期的各个回调和其他的应用组件一样,是跑在主线程中,会影响到你的UI操作或者阻塞
主线程中的其他事情(尤其是bind Service时)
3.请介绍下AsyncTask的内部实现,适用的场景是?
AsyncTask内部也是Handler机制来完成的,只不过Android提供了执行框架来提供线程池来执行相应的任务,因为线程池
的大小问题,所以AsyncTask只应该用来执行耗时时间较短的任务,比如http请求,大规模的下载和数据库的更改不适用于
AsyncTask,因为会导致线程池阻塞,没有线程来执行其他任务,导致的情形会发生AsyncTask根本执行不了的问题
4.谈谈你对binder机制的理解
binder是一种IPC机制,进程间通讯的一种工具
java层可以利用aidl工具来实现相应的接口(生成通讯代码)
5.Android中进程间通讯有哪些实现方式?
Intent, Binder(AIDL), Messenger, BroadcastReceiver
6.自定义view的基本流程
(1),自定义view的属性,编写attr.xml文件
(2),在layout布局文件中引用,同时引用命名空间
(3),在view的构造方法中获得我们自定义的属性,在自定义控件中进行读取(构造方法拿到attr.xml文件值)
(4),重写onMesure (如果自定义ViewGroup还要重写onLayout )
(5),重写onDraw(如果自定义ViewGroup可以不用重写该项)
7.Android多线程的实现方式有哪些?
Thread 和 AsyncTask
Thread可以与Loop和Handler共用建立消息处理队列
AsyncTask可以作为线程池并进行处理多任务
8.ANR是什么?怎么避免和解决ANR?
ANR: Appliaction Not Responding,即应用无响应
ANR一般有三种类型:
1:KeyDispatchTimeout( seconds) - - 主要类型
按键或者触摸事件在特定时间内无响应
2:BroadcastTimeout(10 seconds) BroadcastReceiver在特定时间内无法处理完成
3:ServiceTimeout(20 seconds) –小概率类型
Service在特定的时间内无法处理完成 超时的原因一般有两种:
(1)当前的事件没有机会得到处理(UI线程正在处理前一个事件没有及时完成或者looper被某种原因 阻塞住)
(2)当前的事件正在处理,但没有及时完成 UI线程尽量只做跟UI相关的工作,耗时的工作(数据库操作,I/O,连接网络或者其他可能阻碍UI线 程的操作)放入单独的线程处理,尽量用Handler来处理UI thread和thread之间的交互。
UI线程主要包括如下: Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick() AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel() Mainthread handler: handleMessage(), post(runnable r)
9.Android下解决滑动冲突的常见思路是什么?
相关的滑动组件重写onInterceptTouchEvent,然后判断根据xy值,来决定是否拦截当前操作
10,内存泄漏检测有什么方法?
检测:
(1),ddms Heap发现内存泄漏
dataObject totalSize的大小,是否稳定在一个范围内,如果操作程序,不断增加,说明内存泄漏
(2),使用Heap Tool 进行内存快照前后对比
BlankActivity手动触发gc进行前后对比,对象是否被及时回收
定位:
(1),MAT插件打开.hprof具体定位内存泄漏
查看histogram顶,选中某一个对象,查看它的gc 引用链,以为存在gc引用链的,说明无法回收
(2),AndroidStudio的Allocation Tracker:
观测到期间的内存分配,哪些对象被创建,什么时候被创建,从而准确定位;
11.谈谈你对Android中Context的理解?
Context包含上下文信息(外部值)的一个参数,android中的Context分三种,
Application Context, Activity Context, Service Context;
它描述的是 一个应用程序环境的信息,通过它我们可以获取应用程序的资源和类,页包括一些应用级别的操作,
例如:启动一个Activity,发送广播,接收Intent信息等
12,请问在平时开发过程中,你是如何做到多分辩率适配的?
(1),根据不同分辨率建立不同的布局
(2),根据分辨率不同建立不同分辨率的资源图片
(3),在程序启动时,获取当前 屏幕的分辨率和密度,在代码中进行适配
(4),为不同分辨率的写不同的dimen文件
(5),其实还有就是使用fragement
13.如何在不失真的条件下显示 一张超清的图片或者长图?
(1),通过计算BitmapFactory.Optons 对象的inSamleSize值等比的压缩图片
(2),使用WebView来加载图片
(3),使用MapView或者TileView来显示图片(类似地图的机制)
(4),BitmapRegionDecoder局部加载(不过响应用户手势加载不同区域是个难点)
14.、如何理解Bitmap,以及相关的优化方式?
Bitmap是android中经常使用的一个类,它代表了一个图片资源,
Bitmap消耗内存很严重,如果不注意优化代码,经常出现oom问题,优化方式通常有:
(1),使用缓存
(2),压缩图片
(3),及时回收;至于什么时候需要手动调用recycle,这就看具体场景了,原则是当我们不再使用Bit mao时,需要回收之。另外,我们需要注意,2.3之前Bitmap对象与像素数据是分开存放的,Bitmap 对象存在Java Heap中而像素数据存放在Native Memory中,这时很有必要调用recycle回收内存 。但是2.3之后,Bitmap对象和像素数据都是存在Heap中,GC可以回收其内存。
15.Http无状态是指什么?
无状态是指服务器不知道客户端是什么状态
HTTP是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive没能改变这个结果。 HTTP无状态的特性严重阻碍了这些
交互式应用程序的实现,毕竟交互是需要承前启后的, 简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种
用于保持HTTP状
态的技术就应运而生了,一个是Cookie,而另一个则是Session。
16.怎么实现ListView多种布局?
(1)、重写 getViewTypeCount() – 该方法返回多少个不同的布局
(2)、重写 getItemViewType(int) – 根据position返回相应的Item
(3)、根据view item的类型,在getView中创建正确的convertView
17.Android的几种存储方式?
5种,分别为数据库Sqlite,本地文件,网络,ContentProvider,SharePreference
18.如何安全的退出已调用多个Activiy的Application?
(1),循环遍历退出用的最多,在Activity打开时记录,并在需要退出时,遍历所有Activity,并 调用finish方法。
(2), 其他还有抛异常退出,使用startActivityForResult方法进行连续判断退出,杀进程以及杀 死主线程等方法。
19,activity启动模式?
(1),standard
默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下 ,可以有多个相同的实例,也允许多个相同Activity叠加。
(2), singleTop
可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启 动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
(3),singleTask 8. 只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建 一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它 的onNewIntent方法。
如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,si ngleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask 的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。
(4),singleInstance 12. 只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的 Activity存在。
20.从一个ActivityA跳转到另外一个ActivityB后,在返回后,ActivityA的生命?
(1),ActivityB如果为透明或者窗口化,那么将执行onPause-onResume
(2),ActivityB是全屏的,并非透明,那么将执行onPause-onStop-onRestart-onStart-o nResume
(3),ActivityA因内存不足被回收,那么会执行onPause-onStop-onDestory-onCreate-on Start-onResume
21.handle机制主要用途,他的实现原理?
Handler是android用来实现 线程间通信的工具,一般在开发中用户子线程更新UI,以及延迟 操作等。
(1),创建一个Handler必须要有循环者Looper对象,而主线程已经实现了Looper,所以在主线程 中可以直接创建Handler对象,我们也可以在子线程中往主线程发消息,
(2),如果需要其他线程往子线程发消息,那么必须将子线程提升为循环者Looper线程,在子线程入 口run()方法中调用Looper的prepare以及Looper.loop()方法提升,注意loop()以后的代 码不会执行到。
(3),当子线程提升为Looper对象后,会在Looper中创建一个消息队列(MessageQueue),这是 我们的Handler就和这个消息队列绑定在了一起,当我们的Handler在任意线程发消息时,都 会放到MessageQueue中,而Looper不断的将这些消息取出来,并且交给发消息的Handler中 的handlerMessage方法进行处理