1. Activity与Fragment的生命周期。
2. Acitivty的四种启动模式与特点。
当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中。Activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode=""设置。
1. Standared模式(默认)
我们平时直接创建的Activity都是这种模式的Activity,这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,退出Activity则会在任务栈中销毁该实例。
2. SingleTop模式
这种模式会考虑当前要激活的Activity实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。
3. SingleTask模式
如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的newInstance()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。
4. SingleInstance模式
当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity。
3. Activity缓存方法。
使用内存缓存:不回收,容易爆内存溢出。内存缓存速度很快,但是您无法确定图片是否在缓存中存在。像
GridView
这种控件可能具有很多图片需要显示,很快图片数据就填满了缓存容量。
同时您的程序还可能被其他任务打断,比如打进的电话 — 当您的程序位于后台的时候,系统可能会清楚到这些图片缓存。一旦用户恢复使用您的程序,您还需要重新处理这些图片。
使用硬盘缓存:当这些图片在内存缓存中不可用的时候,可以从磁盘缓存中加载从而省略了图片处理过程。
当然, 从磁盘载入图片要比从内存读取慢很多,并且应该在非UI线程中载入磁盘图片。
注意: 如果缓存的图片经常被使用的话,可以考虑使用ContentProvider
,例如在图库程序中就是这样干的。
4. Service的生命周期,两种启动方法,有什么区别。
Service有两种使用方法:
1>以调用Context.startService()启动,而以调用Context.stopService()结束
2>以调用Context.bindService()方法建立,以调用Context.unbindService()关闭
service重要的生命周期方法
当用户调用startService ()或bindService()时,Service第一次被实例化的时候系统会调用,整个生命周期只调用1次这个方法,通常用于初始化设置。注意:多次调用startService()或bindService()方法不会多次触发onCreate()方法
通过startService()方法启动的服务
初始化结束后系统会调用该方法,用于处理传递给startService()的Intent对象。如音乐服务会打开Intent 来探明将要播放哪首音乐,并开始播放。注意:多次调用startService()方法会多次触发onStart()方法
void onStart(Intent intent)
通过bindService ()方法启动的服务
初始化结束后系统会调用该方法,用来绑定传递给bindService 的Intent 的对象。注意:多次调用bindService()时,如果该服务已启动则不会再触发此方法
IBinder onBind(Intent intent)
5. 怎么保证service不被杀死。
(1)建立两个service互相监听,当一个service被kill掉的时候马上启动另一个
(2)在onDestory里自监听。service +broadcast 方式,就是当service走ondestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service
(3)提升进程优先级(有6个优先级)
(4)将APK安装到/system/app,变身系统级应用(流氓方法,一般不使用,只在做测试demo的时候用)
6. 广播的两种注册方法,有什么区别。
(1)在AndroidManifest.xml文件中注册。
7. Intent的使用方法,可以传递哪些数据类型。
8. ContentProvider使用方法。
为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider,比如联系人、短信、图片信息、通话记录等等;
ContentProvider使用表的形式来组织数据,无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格;
提供的方法:增删改查获取回调;
每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包当中。
9. Thread、AsycTask、IntentService的使用场景与特点。
Thread:线程
AsycTask:是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
使用的优点:简单,快捷,过程可控
IntentService: 异步处理服务,新开一个线程:handlerThread在线程中发消息,然后接受处理完成后,会清理线程,并且关掉服务。
IntentService有以下特点:
(1) 它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。
(2) 创建了一个工作队列,来逐个发送intent给onHandleIntent()。
(3) 不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。
(4) 默认实现的onBind()返回null
(5) 默认实现的onStartCommand()的目的是将intent插入到工作队列中
10. 五种布局: FrameLayout 、 LinearLayout 、 AbsoluteLayout 、 RelativeLayout 、 TableLayout各自特点及绘制效率对比。
11. Android的数据存储形式。
SharedPeferences、文件存储、ContentProvider、SQLite数据库存储、网络存储
12. Sqlite的基本操作。
13. Android中的MVC模式。
MVC:模型(model)-视图(view)-控制器(controller)
14. Merge、ViewStub的作用。
15. Json有什么优劣势。(ps.阿里有fastjson,Google有Gson,还有json-smart,速度最快)
(1) 在可读性方面,JSON和XML的数据可读性基本相同。JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。
(2) 在可扩展性方面,XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。
(3) 在编码难度方面,XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
(4) 在解码难度方面,XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。
(5) 在流行度方面,XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。
(6) JSON和XML同样拥有丰富的解析手段。
(7) JSON相对于XML来讲,数据的体积小。
(8) JSON与JavaScript的交互更加方便。
(9) JSON对数据的描述性比XML较差。
(10) JSON的速度要远远快于XML。
16. 动画有哪两类,各有什么特点?
17. Handler、Loop消息队列模型,各部分的作用。
18. 怎样退出App。
//在onCreate() 中将Activity 实例 放到 线性容器中, 退出时不停地((Activity)list.gert(i)).finsh();
Android经典完美退出方法,使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activity,并且容易理解、易于操作,非常不错!
AppUtils类(储存每一个Activity,并实现关闭所有Activity的操作)
在每一个Activity中的onCreate方法里添加该Activity到AppUtils对象实例容器中
在需要结束所有Activity的时候调用exit方法
AppUtils.getInstance().exit();
19. Asset目录与res目录的区别。
20. Android怎么加速启动Activity。
21. Android内存优化方法:ListView优化,及时关闭资源,图片缓存等等。
22. Android中弱引用与软引用的应用场景。
23. Bitmap的四种属性,与每种属性队形的大小。
24. View与View Group分类。自定义View过程:onMeasure()、onLayout()、onDraw()。
25. Touch事件分发机制。
26. Android长连接,怎么处理心跳机制。
27. Zygote的启动过程。
28. Android IPC:Binder原理。
29. 你用过什么框架,是否看过源码,是否知道底层原理。
30. Android5.0、6.0新特性。
31.Android ANR异常及解决方法
ANRs (“Application Not Responding”),意思是”应用没有响应“。
在如下情况下,Android会报出ANR错误:
– 主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件
– BroadcastReceiver 没有在10秒内完成返回
通常情况下,下面这些做法会导致ANR
1、在主线程内进行网络操作
2、在主线程内进行一些缓慢的磁盘操作(例如执行没有优化过的SQL查询)
应用应该在5秒或者10秒内响应,否则用户会觉得“这个应用很垃圾”“烂”“慢”…等等
逻辑应该是
1. new出一个新的线程,进行数据请求
2. 获取数据后,调用handler.sendMessage方法
3. 在handler的handle()方法中更新UI
Android的话,多是一些项目中的实践,使用多了,自然就知道了,还有就是多逛逛一些名人的博客,书上能讲到的东西不多。另外android底层的东西,有时间的话可以多了解一下,加分项。
推荐书籍:《疯狂android讲义》《深入理解android》