android面试题会出现什么内容 最近在找android开发的工作,总结了有些面试题还是不会,...
android \u9762\u8bd5\u98981\u3001\u524d\u8a00
6 \u6708 26 \u65e5\uff0c Google Android \u53d1\u5e03\u4e86 NDK \uff0c\u5f15\u8d77\u4e86\u5f88\u591a\u53d1\u4eba\u5458\u7684\u5174\u8da3\u3002 NDK \u5168
\u79f0\uff1a Native Development Kit \u3002\u4e0b\u8f7d\u5730\u5740\u4e3a\uff1a
http://developer.android.com/sdk/ndk/1.5_r1/index.html \u3002
2\u3001\u8bef\u89e3
\u65b0\u51fa\u751f\u7684\u4e8b\u7269\uff0c\u9664\u4e86\u60ca\u559c\u5916\uff0c\u4e5f\u4f1a\u7ed9\u6211\u4eec\u5e26\u6765\u4e00\u5b9a\u7684\u8ff7\u60d1\u3001\u8bef\u89e3\u3002
2.1\u3001\u8bef\u89e3\u4e00\uff1a NDK \u53d1\u5e03\u4e4b\u524d\uff0c Android \u4e0d\u652f\u6301\u8fdb\u884c C \u5f00\u53d1
\u5728 Google \u4e2d\u641c\u7d22 \u201cNDK\u201d \uff0c\u5f88\u591a \u201cAndroid \u7ec8\u4e8e\u53ef\u4ee5\u4f7f\u7528 C++ \u5f00\u53d1 \u201d \u4e4b\u7c7b
\u7684\u6807\u9898\uff0c\u8fd9\u662f\u4e00\u79cd\u5bf9 Android \u5e73\u53f0\u7f16\u7a0b\u65b9\u5f0f\u7684\u8bef\u89e3\u3002\u5176\u5b9e\uff0c Android \u5e73\u53f0\u4ece\u8bde\u751f\u8d77\uff0c\u5c31\u5df2
\u7ecf\u652f\u6301 C \u3001 C++ \u5f00\u53d1\u3002\u4f17\u6240\u5468\u77e5\uff0c Android \u7684 SDK \u57fa\u4e8e Java \u5b9e\u73b0\uff0c \u8fd9\u610f\u5473\u7740\u57fa\u4e8e Android
SDK \u8fdb\u884c\u5f00\u53d1\u7684\u7b2c\u4e09\u65b9\u5e94\u7528\u90fd\u5fc5\u987b\u4f7f\u7528 Java \u8bed\u8a00\u3002\u4f46\u8fd9\u5e76\u4e0d\u7b49\u540c\u4e8e \u201c \u7b2c\u4e09\u65b9\u5e94\u7528\u53ea\u80fd\u4f7f
\u7528 Java\u201d \u3002\u5728 Android SDK \u9996\u6b21\u53d1\u5e03\u65f6\uff0c Google \u5c31\u5ba3\u79f0\u5176\u865a\u62df\u673a Dalvik \u652f\u6301 JNI \u7f16\u7a0b
\u65b9\u5f0f\uff0c\u4e5f\u5c31\u662f\u7b2c\u4e09\u65b9\u5e94\u7528\u5b8c\u5168\u53ef\u4ee5\u901a\u8fc7 JNI \u8c03\u7528\u81ea\u5df1\u7684 C \u52a8\u6001\u5e93\uff0c\u5373\u5728 Android \u5e73\u53f0\u4e0a\uff0c
\u201cJava+C\u201d \u7684\u7f16\u7a0b\u65b9\u5f0f\u662f\u4e00\u76f4\u90fd\u53ef\u4ee5\u5b9e\u73b0\u7684\u3002
\u5f53\u7136\u8fd9\u79cd\u8bef\u89e3\u7684\u4ea7\u751f\u662f\u6709\u6839\u6e90\u7684\uff1a\u5728 Android SDK \u6587\u6863\u91cc\uff0c\u627e\u4e0d\u5230\u4efb\u4f55 JNI \u65b9\u9762\u7684
\u5e2e\u52a9\u3002\u5373\u4f7f\u7b2c\u4e09\u65b9\u5e94\u7528\u5f00\u53d1\u8005\u4f7f\u7528 JNI \u5b8c\u6210\u4e86\u81ea\u5df1\u7684 C \u52a8\u6001\u94fe\u63a5\u5e93\uff08 so \uff09\u5f00\u53d1\uff0c\u4f46\u662f so
\u5982\u4f55\u548c\u5e94\u7528\u7a0b\u5e8f\u4e00\u8d77\u6253\u5305\u6210 apk \u5e76\u53d1\u5e03\uff1f\u8fd9\u91cc\u9762\u4e5f\u5b58\u5728\u6280\u672f\u969c\u788d\u3002\u6211\u66fe\u7ecf\u82b1\u4e86\u4e0d\u5c11\u65f6\u95f4\uff0c
\u5b89\u88c5\u4ea4\u53c9\u7f16\u8bd1\u5668\u521b\u5efa so \uff0c\u5e76\u901a\u8fc7 asset \uff08\u8d44\u6e90\uff09\u65b9\u5f0f\uff0c\u5b9e\u73b0\u6346\u7ed1 so \u53d1\u5e03\u3002\u4f46\u8fd9\u79cd\u65b9\u5f0f\u53ea
\u80fd\u5c5e\u4e8e\u53d6\u5de7\u7684\u65b9\u5f0f\uff0c\u5e76\u975e\u5b98\u65b9\u652f\u6301\u3002\u6240\u4ee5\uff0c\u5728 NDK \u51fa\u6765\u4e4b\u524d\uff0c\u6211\u4eec\u5c06 \u201cJava+C\u201d \u7684\u5f00\u53d1
\u6a21\u5f0f\u79f0\u4e4b\u4e3a\u7070\u8272\u6a21\u5f0f\uff0c\u5373\u5b98\u65b9\u65e2\u4e0d\u58f0\u660e \u201c \u652f\u6301\u8fd9\u79cd\u65b9\u5f0f \u201d \uff0c\u4e5f\u4e0d\u58f0\u660e \u201c \u4e0d\u652f\u6301\u8fd9\u79cd\u65b9
\u5f0f \u201d \u3002
2.2\u3001\u8bef\u89e3\u4e8c\uff1a\u6709\u4e86 NDK \uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u7eaf C \u5f00\u53d1 Android \u5e94\u7528
Android SDK \u91c7\u7528 Java \u8bed\u8a00\u53d1\u5e03\uff0c\u628a\u4f17\u591a\u7684 C \u5f00\u53d1\u4eba\u5458\u6392\u9664\u5728\u7b2c\u4e09\u65b9\u5e94\u7528\u5f00\u53d1\u5916
\uff08 \u6ce8\u610f\uff1a\u6211\u4eec\u6240\u6709\u8ba8\u8bba\u90fd\u662f\u57fa\u4e8e\u201c \u7b2c\u4e09\u65b9\u5e94\u7528\u5f00\u53d1 \u201d \uff0c Android \u7cfb\u7edf\u57fa\u4e8e Linux \uff0c\u7cfb
\u7edf\u7ea7\u522b\u7684\u5f00\u53d1\u80af\u5b9a\u662f\u652f\u6301 C \u8bed\u8a00\u7684\u3002 \uff09\u3002 NDK \u7684\u53d1\u5e03\uff0c\u8bb8\u591a\u4eba\u4f1a\u8bef\u4ee5\u4e3a\uff0c\u7c7b\u4f3c\u4e8e Symbian \u3001
WM \uff0c\u5728 Android \u5e73\u53f0\u4e0a\u7ec8\u4e8e\u53ef\u4ee5\u4f7f\u7528\u7eaf C \u3001 C++ \u5f00\u53d1\u7b2c\u4e09\u65b9\u5e94\u7528\u4e86\uff01\u5176\u5b9e\u4e0d\u7136\uff0c NDK
\u6587\u6863\u660e\u786e\u8bf4\u660e\uff1a it is not a good way \u3002\u56e0\u4e3a NDK \u5e76\u6ca1\u6709\u63d0\u4f9b\u5404\u79cd\u7cfb\u7edf\u4e8b\u4ef6\u5904\u7406\u652f\u6301\uff0c\u4e5f\u6ca1
\u6709\u63d0\u4f9b\u5e94\u7528\u7a0b\u5e8f\u751f\u547d\u5468\u671f\u7ef4\u62a4\u3002\u6b64\u5916\uff0c\u5728\u672c\u6b21\u53d1\u5e03\u7684 NDK \u4e2d\uff0c\u5e94\u7528\u7a0b\u5e8f UI \u65b9\u9762\u7684 API \u4e5f
\u6ca1\u6709\u63d0\u4f9b\u3002\u81f3\u5c11\u76ee\u524d\u6765\u8bf4\uff0c\u4f7f\u7528\u7eaf C \u3001 C++ \u5f00\u53d1\u4e00\u4e2a\u5b8c\u6574\u5e94\u7528\u7684\u6761\u4ef6\u8fd8\u4e0d\u5b8c\u5907\u3002
3\u3001NDK \u662f\u4ec0\u4e48
\u5bf9 NDK \u8fdb\u884c\u4e86\u7c97\u7565\u7684\u7814\u7a76\u540e\uff0c\u6211\u5bf9 \u201cNDK \u662f\u4ec0\u4e48 \u201d \u7684\u7406\u89e3\u5982\u4e0b\uff1a
1\u3001NDK \u662f\u4e00\u7cfb\u5217\u5de5\u5177\u7684\u96c6\u5408\u3002
NDK \u63d0\u4f9b\u4e86\u4e00\u7cfb\u5217\u7684\u5de5\u5177\uff0c\u5e2e\u52a9\u5f00\u53d1\u8005\u5feb\u901f\u5f00\u53d1 C \uff08\u6216 C++ \uff09\u7684\u52a8\u6001\u5e93\uff0c\u5e76\u80fd\u81ea\u52a8
\u5c06 so \u548c java \u5e94\u7528\u4e00\u8d77\u6253\u5305\u6210 apk \u3002\u8fd9\u4e9b\u5de5\u5177\u5bf9\u5f00\u53d1\u8005\u7684\u5e2e\u52a9\u662f\u5de8\u5927\u7684\u3002
NDK \u96c6\u6210\u4e86\u4ea4\u53c9\u7f16\u8bd1\u5668\uff0c\u5e76\u63d0\u4f9b\u4e86\u76f8\u5e94\u7684 mk \u6587\u4ef6\u9694\u79bb CPU \u3001\u5e73\u53f0\u3001 ABI \u7b49\u5dee\u5f02\uff0c
\u5f00\u53d1\u4eba\u5458\u53ea\u9700\u8981\u7b80\u5355\u4fee\u6539 mk \u6587\u4ef6\uff08\u6307\u51fa \u201c \u54ea\u4e9b\u6587\u4ef6\u9700\u8981\u7f16\u8bd1 \u201d \u3001 \u201c \u7f16\u8bd1\u7279\u6027\u8981\u6c42 \u201d
\u7b49\uff09\uff0c\u5c31\u53ef\u4ee5\u521b\u5efa\u51fa so \u3002
NDK \u53ef\u4ee5\u81ea\u52a8\u5730\u5c06 so \u548c Java \u5e94\u7528\u4e00\u8d77\u6253\u5305\uff0c\u6781\u5927\u5730\u51cf\u8f7b\u4e86\u5f00\u53d1\u4eba\u5458\u7684\u6253\u5305\u5de5\u4f5c\u3002
2\u3001NDK \u63d0\u4f9b\u4e86\u4e00\u4efd\u7a33\u5b9a\u3001\u529f\u80fd\u6709\u9650\u7684 API \u5934\u6587\u4ef6\u58f0\u660e\u3002
oogle \u660e\u786e\u58f0\u660e\u8be5 API \u662f\u7a33\u5b9a\u7684\uff0c\u5728\u540e\u7eed\u6240\u6709\u7248\u672c\u4e2d\u90fd\u7a33\u5b9a\u652f\u6301\u5f53\u524d\u53d1\u5e03\u7684 API \u3002
\u4ece\u8be5\u7248\u672c\u7684 NDK \u4e2d\u770b\u51fa\uff0c\u8fd9\u4e9b API \u652f\u6301\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u5305\u542b\u6709\uff1a C \u6807\u51c6\u5e93\uff08 libc \uff09\u3001
\u6807\u51c6\u6570\u5b66\u5e93\uff08 libm \uff09\u3001\u538b\u7f29\u5e93\uff08 libz \uff09\u3001 Log \u5e93\uff08 liblog \uff09\u3002
G
4\u3001NDK \u5e26\u6765\u4ec0\u4e48
1\u3001NDK \u7684\u53d1\u5e03\uff0c\u4f7f \u201cJava+C\u201d \u7684\u5f00\u53d1\u65b9\u5f0f\u7ec8\u4e8e\u8f6c\u6b63\uff0c\u6210\u4e3a\u5b98\u65b9\u652f\u6301\u7684\u5f00\u53d1\u65b9\u5f0f\u3002
\u4f7f\u7528 NDK \uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u8981\u6c42\u9ad8\u6027\u80fd\u7684\u5e94\u7528\u903b\u8f91\u4f7f\u7528 C \u5f00\u53d1\uff0c\u4ece\u800c\u63d0\u9ad8\u5e94\u7528\u7a0b\u5e8f\u7684\u6267
\u884c\u6548\u7387\u3002
\u4f7f\u7528 NDK \uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u9700\u8981\u4fdd\u5bc6\u7684\u5e94\u7528\u903b\u8f91\u4f7f\u7528 C \u5f00\u53d1\u3002\u6bd5\u7adf\uff0c Java \u5305\u90fd\u662f\u53ef\u4ee5\u53cd
\u7f16\u8bd1\u7684\u3002
NDK \u4fc3\u4f7f\u4e13\u4e1a so \u7ec4\u4ef6\u5546\u7684\u51fa\u73b0\u3002\uff08\u4e50\u89c2\u731c\u60f3\uff0c\u8981\u89c6\u4e4e Android \u7528\u6237\u7684\u6570\u91cf\uff09
2\u3001NDK \u5c06\u662f Android \u5e73\u53f0\u652f\u6301 C \u5f00\u53d1\u7684\u5f00\u7aef\u3002
NDK \u63d0\u4f9b\u4e86\u7684\u5f00\u53d1\u5de5\u5177\u96c6\u5408\uff0c\u4f7f\u5f00\u53d1\u4eba\u5458\u53ef\u4ee5\u4fbf\u6377\u5730\u5f00\u53d1\u3001\u53d1\u5e03 C \u7ec4\u4ef6\u3002\u540c\u65f6\uff0c
Google \u627f\u8bfa\u5728 NDK \u540e\u7eed\u7248\u672c\u4e2d\u63d0\u9ad8 \u201c \u53ef\u8c03\u5f0f \u201d \u80fd\u529b\uff0c\u5373\u63d0\u4f9b\u8fdc\u7a0b\u7684 gdb \u5de5\u5177\uff0c\u4f7f\u6211
\u4eec\u53ef\u4ee5\u4fbf\u6377\u5730\u8c03\u8bd5 C \u6e90\u7801\u3002\u5728\u652f\u6301 Android \u5e73\u53f0 C \u5f00\u53d1\uff0c\u6211\u4eec\u80fd\u611f\u89c9\u5230 Google \u82b1\u8d39\u4e86
\u5f88\u5927\u7cbe\u529b\uff0c\u6211\u4eec\u6709\u7406\u7531\u61a7\u61ac \u201cC \u7ec4\u4ef6\u652f\u6301 \u201d \u53ea\u662f Google Android \u5e73\u53f0\u4e0a C \u5f00\u53d1\u7684\u5f00\u7aef\u3002
\u6bd5\u7adf\uff0c C \u7a0b\u5e8f\u5458\u4ecd\u7136\u662f\u7801\u519c\u9635\u8425\u4e2d\u7684\u7edd\u5bf9\u4e3b\u529b\uff0c\u5c06\u8fd9\u90e8\u5206\u4eba\u6392\u9664\u5728 Android \u5e94\u7528\u5f00\u53d1\u4e4b\u5916\uff0c
\u663e\u7136\u662f\u4e0d\u5229\u4e8e Android \u5e73\u53f0\u7e41\u8363\u660c\u76db\u7684\u3002
1 \u5199\u4e00\u4e2aservice,application \u901a\u8fc7createservice
2 \u8fd0\u884c\u65f6\u4e00\u822c\u662f\u6839\u636euid\uff0c\u6587\u4ef6\u7cfb\u7edf\u6743\u9650\u8ddflinux\u4e00\u6837
3 \u53ef\u4ee5\uff0c\u77e5\u9053class\u540d\u5b57 \u6216\u8005\u77e5\u9053\u5177\u4f53manifest\u600e\u4e48\u5199\u7684
4 looper\u662f\u7ebf\u7a0b\uff0c\u5faa\u73af\u6765\u5904\u7406message queue\u7684message\uff0c\u800chandler\u5bf9\u53d1\u9001message\u7684\u76f8\u5173\u65b9\u6cd5\u7684\u4e00\u4e2a\u7c7b\u3002
5 binder\u673a\u5236\uff0cpipe \u4e0d\u592a\u6e05\u695a\uff0csocket\u662f\u901a\u8fc7\u5957\u63a5\u5b57\u6765\u53d1\u9001\u5185\u5bb9\u8fdb\u884cipc\uff0cbinder\u7684\u8bdd \u662f\u7528\u5171\u4eab\u5185\u5b58\uff0cservicemanager\u4f5c\u4e3aservice\u7684\u7ba1\u7406\u8005
6 surfaceflinger \u662f\u5bf9\u7a97\u53e3\u8fdb\u884c\u7ba1\u7406\uff0c
7 bionic\u662fglic\u7684\u7cbe\u7b80\u7248\u672c
1.android dvm 的进程和Linux的进程,应用程序的进程是否为同一个概念:
答:dvm是dalivk虚拟机。每一个android应用程序都在自己的进程中运行,都拥有一个dalivk虚拟机实例。而每一个dvm都是在linux的一个进程。所以说可以认为是同一个概念。
2.android的动画有哪几种?他们的特点和区别是什么?
答:两种,一种是tween动画,一种是frame动画。tween动画,这种实现方式可以使视图组件移动,放大或缩小以及产生透明度的变化。frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
3.handler进制的原理:
答:android提供了handler和looper来满足线程间的通信。Handler先进先出原则。looper用来管理特定线程内对象之间的消息交换(message Exchange).
1)looper:一个线程可以产生一个looper对象,由它来管理此线程里的message queue(消息队列)
2)handler:你可以构造一个handler对象来与looper沟通,以便push新消息到messagequeue里;或者接收looper(从messagequeue里取出)所送来的消息。
3)messagequeue:用来存放线程放入的消息。
4)线程:UI thread 通常就是main thread,而android启动程序时会为它建立一个message queue.
4.android view的刷新:
答:Android中对View的更新有很多种方式,使用时要区分不同的应用场合。我感觉最要紧的是分清:多线程和双缓冲的使用情况。
1).不使用多线程和双缓冲
这种情况最简单了,一般只是希望在View发生改变时对UI进行重绘。你只需在Activity中显式地调用View对象中的invalidate()方法即可。系统会自动调用 View的onDraw()方法。
2).使用多线程和不使用双缓冲
这种情况需要开启新的线程,新开的线程就不好访问View对象了。强行访问的话会报:android.view.ViewRoot$CalledFromWrongThreadException:Only the originalthread that created a view hierarchy can touch its views.
这时候你需要创建一个继承了android.os.Handler的子类,并重写handleMessage(Messagemsg)方法。android.os.Handler是能发送和处理消息的,你需要在Activity中发出更新UI的消息,然后再你的Handler(可以使用匿名内部类)中处理消息(因为匿名内部类可以访问父类变量,你可以直接调用View对象中的invalidate()方法 )。也就是说:在新线程创建并发送一个Message,然后再主线程中捕获、处理该消息。
3).使用多线程和双缓冲
Android中SurfaceView是View的子类,她同时也实现了双缓冲。你可以定义一个她的子类并实现SurfaceHolder.Callback接口。由于实现SurfaceHolder.Callback接口,新线程就不需要android.os.Handler帮忙了。SurfaceHolder中lockCanvas()方法可以锁定画布,绘制玩新的图像后调用unlockCanvasAndPost(canvas)解锁(显示),还是比较方便得。
5.说说mvc模式的原理,它在android中的运用:
答:android的官方建议应用程序的开发采用mvc模式。何谓mvc?
mvc是model,view,controller的缩写,mvc包含三个部分:
l模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
2视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
3控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给m哦得了处理。
android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下:
1)视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如何你对android了解的比较的多了话,就一定 可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通 信,幸运的是,android提供了它们之间非常方便的通信实现。
2)控制层(controller):android的控制层的重 任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理, 这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。
6.Activity的生命周期:
答:onCreate: 在这里创建界面,做一些数据 的初始化工作
onStart: 到这一步变成用户可见不可交互的
onResume:变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个Activity的最上面,运行完弹出栈,则回到上一个Activity)
onPause: 到这一步是可见但不可交互的,系统会停止动画 等消耗CPU 的事情从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在
onstop: 变得不可见,被下一个activity覆盖了
onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方法或者是系统为了节省空间将它暂时性的干掉
7.让Activity变成一个窗口:
答:Activity属性设定:有时候会做个应用程序是漂浮在手机主界面的。这个只需要在设置下Activity的主题theme,即在Manifest.xml定义Activity的地方加一句:
android :theme="@android:style/Theme.Dialog"
如果是作半透明的效果:
android:theme="@android:style/Theme.Translucent"
8.Android中常用的五种布局:
答:LinearLayout线性布局;AbsoluteLayout绝对布局;TableLayout表格布局;RelativeLayout相对布局;FrameLayout帧布局;
9.Android的五种数据存储方式:
答:sharedPreferences;文件;SQLite;contentProvider;网络
10.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系:
答:Handler获取当前线程中的looper对象,looper用来从存有Message的Message Queue里取出message,再由Handler进行message的分发和处理。
11.AIDL的全称是什么?如何工作?能处理哪些类型的数据?
答:AIDL(AndroidInterface Definition Language)android接口描述语言
12.系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由:
答:通过直接发送Uri把参数带过去,或者通过manifest里的intentfilter里的data属性。代码如下:
Intent intent = new Intent();
Intent.setAction(“android.intent.action.View”);
Uri uriBrowsers = Uri.parse(“http://www.sina.com.cn”);
Intent.setData(uriBrowsers);
//包名、要打开的activity
intent.setClassName(“com.android.browser”,”com.android.browser.BrowserActivity”);
startActivity(intent);
13.什么是ANR,如何避免?
答:ANR的定义:
在android上,如果你的应用程序有一段时间响应不移灵敏,系统会向用户提示“应用程序无响应”(ANR:application Not Responding)对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。
如何避免:
首先来研究下为什么它会在android的应用程序里发生和如何最佳构建应用程序来避免ANR.
android应用程序通常是运行在一个单独的线程(例如:main)里,这就意味你的应用程序所做的事情如果在主线程里占用了大长时间的话,就会引发ANR对话框,因为你的应用程序并没有给自己机会来处理输入事件或者Intent广播。
因此,运行在主线程里的任何访求都尽可能少做事情。特别是,activity应该在它的关键生命周期方法(onCreate()和onResume())里尽可能少的去作创建操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成。然而,不是说你的主线程阻塞在那里等待子线程的完成---也不是调用Thread.wait()或者Thread.sleep()。替代的方法是:主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由5秒输入事件的超时引发的ANR对话框。这种做法应该在其它显示UI的线程里效仿,因为它们都受相同的超时影响。
IntentReceiver执行时间的特殊限制意味着它应该做:在后台里做小的、琐碎的工作,如保存设定或注册一个Notification。和在主线程里调用的其它方法一样,应用程序应该避免在BroadcastReceiver里做耗时的操作或计算,但也不是在子线程里做这些任务(因为BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个Service。顺便提及一句,你也应该避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广播时需要向用户展示什么,你应该使用Notification Manager来实现。
一般来说,在应用程序里,100到200ms是用户能感知阻滞的时间阈值,下面总结了一些技巧来避免ANR,并有助于让你的应用程序看起来有响应性。
如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度(ProgressBar和ProgressDialog对这种情况来说很有用)。特别是游戏,在子线程里做移动的计算。如果你的程序有一个耗时的初始化过程的话,考虑可以显示一个Splash Screen或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为程序被冻结了。
14.什么情况会导致Force Close?如何避免?能否捕获导致其的异常?
答:如空指针等可以导致ForceClose;可以看Logcat,然后找到对应的程序代码来解决错误。
15.横竖屏切换时候的activity的生命周期:
答:
1) 新建一个activity,并把各个生命周期打印出来
2) 运行activity,得到如下信息:
onCreate()à
onStart()à
onResume()à
3) 按ctrl+F12切换成横屏时
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
4) 再按ctrl+f12切换成竖屏时,发现打印了两次相同的Log
onSaveInstanceState()à
onPause()à
onStop()à
onDestroyà
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
onSaveInstanceState()à
onPause()à
onStop()à
onDestroyà
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
5) 修改AndroidManifest.xml,把该Activity添加android:configChanges=“orientation”,执行步骤3
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
6) 修改AndroidManifest.xml,把该Activity添加android:configChanges=“orientation”,执行步骤4,发现不会再打印相同信息,但多打印了一行onConfigChanged
onSaveInstanceState()à
onPause()à
onStop()à
onDestroy()à
onCreate()à
onStart()à
onRestoreInstanceState()à
onResume()à
onConfigurationChanged()à
7) 把步骤5的android:configChanges=“orientation”改成
android:configChanges=“orientation|keyboradHidden”,执行步骤3,就只打印onConfigChanged
onConfigurationChanged()à
8) 把步骤5的android:configChanges=“orientation”改成
android:configChanges=“orientation|keyboradHidden”,执行步骤4
onConfigurationChanged()à
onConfigurationChanged()à
总结:
1) 不设置activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
2) 设置activity的android:configChanges=“orientation”时, 切屏会重新调用各个生命周期,切横屏、竖屏时都只会执行一次,但是竖屏最后多打印一条onConfigurationChanged()
3) 设置activity的android:configChanges=“orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged(),横屏一次,竖屏两次
再总结下整个activity的生命周期:
1) 当前activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变
2) Activity运行时按下HOME键(跟被完全覆盖一样的)
onSavaInstanceStateà
onPauseà
onStopà
onRestartà
onStartà
onResumeà
3) 未被完全覆盖,只是失去焦点:
onPauseà
onResumeà
16.如何将SQLite数据库(.db文件)与apk文件一起发布?
答:可以将.db文件复制到Eclipse Android工程中的res aw目录中。所有在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将.db文件复制到res aw目录中
17.如何将打开res aw目录中的数据库文件?
答:在Android中不能直接打开res aw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。
18.android 中有哪几种解析xml的类?官方推荐哪种?以及它们的原理和区别:
答:XML解析主要有三种方式,SAX、DOM、PULL。常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要采用SAX方 式,SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。而DOM方式会把整个XML文件加载到内存 中去,这里Android开发网提醒大家该方法在查找方面可以和XPath很好的结合如果数据量不是很大推荐使用,而PULL常常用在J2ME对于节点处 理比较好,类似SAX方式,同样很节省内存,在J2ME中我们经常使用的KXML库来解析。
19.DDMS和TraceView的区别?
答:DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器
20.谈谈Android的IPC机制:
答:IPC是内部进程通信的简称,是共享"命名管道"的资源。Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。
21.NDK是什么:
答:NDK是一系列工具的集合
NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和java应用打成apk包
NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu,平台等的差异,开发人员只需简单的修改mk文件就可以创建出so
22.描述一下android的系统架构:
答:android系统架构分从下往上为Linux内核层、运行库、应用程序框架层和应用程序层。
Linux内核层:负责硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。
运行库和androidruntion:运行库:即c/c++函数库部分,大多数都是开放源代码的函数库,例如webkit,该函数库负责android网页浏览器的运行;例如标准的c函数库libc、openssl、sqlite等,当然也包括支持游戏开发的2dsgl和3dopengles,在多媒体方面有mediaframework框架来支持各种影音和图形文件的播放与显示,如mpeg4、h.264、mp3、aac、amr、jpg和png等众多的多媒体文件格式。Androidruntion负责解释和执行生成的dalvik格式的字节码
应用软件架构:java应用程序开发人员主要是使用该层封装好的api进行快速开发的。
应用程序层:该层是java的应用程序层,android内置的googlemaps、email、IM、浏览器等,都处于该层,java开发人员工发的程序也处于该层,而且和内置的应用程序具有平等的地位,可以调用内置的应用程序,也可以替换内置的应用程序
1.android dvm 的进程和Linux的进程,应用程序的进程是否为同一个概念:
答:dvm是dalivk虚拟机。每一个android应用程序都在自己的进程中运行,都拥有一个dalivk虚拟机实例。而每一个dvm都是在linux的一个进程。所以说可以认为是同一个概念。
2.android的动画有哪几种?他们的特点和区别是什么?
答:两种,一种是tween动画,一种是frame动画。tween动画,这种实现方式可以使视图组件移动,放大或缩小以及产生透明度的变化。frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
3.handler进制的原理:
答:android提供了handler和looper来满足线程间的通信。Handler先进先出原则。looper用来管理特定线程内对象之间的消息交换(message Exchange).
1)looper:一个线程可以产生一个looper对象,由它来管理此线程里的message queue(消息队列)
2)handler:你可以构造一个handler对象来与looper沟通,以便push新消息到messagequeue里;或者接收looper(从messagequeue里取出)所送来的消息。
3)messagequeue:用来存放线程放入的消息。
4)线程:UI thread 通常就是main thread,而android启动程序时会为它建立一个message queue.
4.android view的刷新:
答:Android中对View的更新有很多种方式,使用时要区分不同的应用场合。我感觉最要紧的是分清:多线程和双缓冲的使用情况。
1).不使用多线程和双缓冲
这种情况最简单了,一般只是希望在View发生改变时对UI进行重绘。你只需在Activity中显式地调用View对象中的invalidate()方法即可。系统会自动调用 View的onDraw()方法。
2).使用多线程和不使用双缓冲
这种情况需要开启新的线程,新开的线程就不好访问View对象了。强行访问的话会报:android.view.ViewRoot$CalledFromWrongThreadException:Only the originalthread that created a view hierarchy can touch its views.
这时候你需要创建一个继承了android.os.Handler的子类,并重写handleMessage(Messagemsg)方法。android.os.Handler是能发送和处理消息的,你需要在Activity中发出更新UI的消息,然后再你的Handler(可以使用匿名内部类)中处理消息(因为匿名内部类可以访问父类变量,你可以直接调用View对象中的invalidate()方法 )。也就是说:在新线程创建并发送一个Message,然后再主线程中捕获、处理该消息。
3).使用多线程和双缓冲
Android中SurfaceView是View的子类,她同时也实现了双缓冲。你可以定义一个她的子类并实现SurfaceHolder.Callback接口。由于实现SurfaceHolder.Callback接口,新线程就不需要android.os.Handler帮忙了。SurfaceHolder中lockCanvas()方法可以锁定画布,绘制玩新的图像后调用unlockCanvasAndPost(canvas)解锁(显示),还是比较方便得。
5.说说mvc模式的原理,它在android中的运用:
答:android的官方建议应用程序的开发采用mvc模式。何谓mvc?
mvc是model,view,controller的缩写,mvc包含三个部分:
l模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
2视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
3控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给m哦得了处理。
android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下:
1)视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如何你对android了解的比较的多了话,就一定 可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通 信,幸运的是,android提供了它们之间非常方便的通信实现。
2)控制层(controller):android的控制层的重 任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理, 这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。
6.Activity的生命周期:
答:onCreate: 在这里创建界面,做一些数据 的初始化工作
onStart: 到这一步变成用户可见不可交互的
onResume:变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个Activity的最上面,运行完弹出栈,则回到上一个Activity)
onPause: 到这一步是可见但不可交互的,系统会停止动画 等消耗CPU 的事情从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在
onstop: 变得不可见,被下一个activity覆盖了
onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方法或者是系统为了节省空间将它暂时性的干掉
7.让Activity变成一个窗口:
答:Activity属性设定:有时候会做个应用程序是漂浮在手机主界面的。这个只需要在设置下Activity的主题theme,即在Manifest.xml定义Activity的地方加一句:
android :theme="@android:style/Theme.Dialog"
如果是作半透明的效果:
android:theme="@android:style/Theme.Translucent"
8.Android中常用的五种布局:
答:LinearLayout线性布局;AbsoluteLayout绝对布局;TableLayout表格布局;RelativeLayout相对布局;FrameLayout帧布局;
9.Android的五种数据存储方式:
答:sharedPreferences;文件;SQLite;contentProvider;网络
附上出处链接:http://www.51edu.com/it/bckf/36635.html
绛旓細1)瑙嗗浘灞(view)锛氫竴鑸噰鐢▁ml鏂囦欢杩涜鐣岄潰鐨勬弿杩锛屼娇鐢ㄧ殑鏃跺欏彲浠ラ潪甯告柟渚跨殑寮曞叆锛屽綋鐒讹紝濡備綍浣犲android浜嗚В鐨勬瘮杈冪殑澶氫簡璇濓紝灏变竴瀹 鍙互鎯冲埌鍦╝ndroid涓篃鍙互浣跨敤javascript+html绛夌殑鏂瑰紡浣滀负view灞傦紝褰撶劧杩欓噷闇瑕佽繘琛宩ava鍜宩avascript涔嬮棿鐨勯 淇★紝骞歌繍鐨勬槸锛宎ndroid鎻愪緵浜嗗畠浠箣闂撮潪甯告柟渚跨殑閫氫俊瀹炵幇銆2)鎺...
绛旓細绗竴绔: 绠楁硶涓庢暟鎹粨鏋勫熀纭绗簩绔: Java鏍稿績鍩虹锛屽寘鎷繁鍏ョ悊瑙d笌搴旂敤绗笁绔: 娉涘瀷涓庢敞瑙g殑Java楂樼骇鐗规х鍥涚珷: 闈㈠骞跺彂缂栫▼鎸戞垬锛屽浣曚紭闆呭簲瀵...绗崄绔: 鎺㈢储Android妗嗘灦鍐呮牳鐨勫ゥ绉樼鍗佷竴绔: Android缁勪欢鐨勫簳灞傚師鐞嗗墫鏋愮鍗佷簩绔: 鍏虫敞绋嬪簭鎬ц兘浼樺寲涓庢暟鎹寔涔呭寲鐨勫叧閿偣绗崄涓夌珷: 鐔熸倝寮婧愭鏋跺湪瀹為檯...
绛旓細鍦ˋndroid闈㈣瘯涓紝缁忓父浼氬嚭鐜板叧浜嶢ctivityManagerService锛圓MS锛夌殑闂銆侫MS鏄礋璐g鐞咥ctivity鐨勭被锛岀敱姝よ鐢熷嚭璁稿闂銆備互涓嬫槸瀵硅繖浜涢棶棰樼殑鎬荤粨锛1. 绠杩癆ctivityManagerService鐨勪綔鐢ㄥ強鍒濆鍖栨椂鏈恒侫ctivityManagerService涓昏璐熻矗绯荤粺涓洓澶х粍浠剁殑鍚姩銆佸垏鎹佽皟搴﹀強搴旂敤杩涚▼鐨勭鐞嗗拰璋冨害绛夊伐浣溿傚畠鐨勮亴璐d笌鎿嶄綔绯...
绛旓細鍦ㄥ骞寸殑Android寮鍙戜笌闈㈣瘯缁忛獙鍩虹涓婏紝鎴戞暣鐞嗕簡涓绯诲垪Android寮鍙戠浉鍏崇殑闈㈣瘯棰鍙婂叾绛旀瑙f瀽銆備互涓嬫槸瀵归棶棰樼殑鎬荤粨涓庡綊绾筹細1. **Activity鍚姩妯″紡鏈夊摢浜锛屽垎鍒鏈変粈涔涓嶅悓锛熺瓟妗堣В鏋愶細Activity鍚姩妯″紡涓昏鍖呮嫭鏍囧噯妯″紡銆佷换鍔℃爤妯″紡銆乻ingleTop妯″紡鍜宻ingleInstance妯″紡銆傛爣鍑嗘ā寮忔瘡娆″惎鍔閮戒細鍒涘缓鏂扮殑Activity瀹炰緥锛涗换...
绛旓細5.鎶鏈閲 姣斿瀵笰ndroid寮鍙戞柊鎶鏈殑浜嗚В涓庡涔狅紝瀵瑰叾瀹冩祦琛屾妧鏈鍩熺殑浜嗚В锛岃繖鍏跺疄涓庢垜鍒氭墠鎻愬埌鐨勬妧鏈箍搴︾殑鑰冨療鏈夊叧锛屽氨鎴戦潰璇曡繃绋嬩腑锛屽彂鐜板緢澶氶潪浜掕仈缃戣涓氱殑浠庝笟浜哄憳锛屽洜涓哄叕鍙稿悇绉嶆搷铔嬭瀹氫笌鍏徃鎶鏈皼鍥寸殑鍘熷洜锛屾妧鏈閲庣浉褰撶嫮绐勩傛垜涓汉瀵硅繖鐐规繁鏈変綋浼氾紝2011骞存垜杩樺湪浼犵粺琛屼笟浠庝簨杞欢鐮斿彂锛屽綋鏃剁殑鍏徃...
绛旓細Android闈㈣瘯棰锛氭繁鍏ョ悊瑙ttp涓嶩ttps鐨勫叧绯婚潰璇曞畼閫氬父閫氳繃姝ら鑰冨療姹傝亴鑰呭鍩烘湰缃戠粶鍗忚鐨勭悊瑙o紝鐗瑰埆鏄叧浜庢暟鎹紶杈撳畨鍏ㄦх殑璁よ瘑銆侶TTP涓嶩TTPS鏄疻eb閫氫俊涓殑涓ょ閲嶈鍗忚锛屽畠浠悇鏈夌壒鐐广侶TTP锛屽嵆瓒呮枃鏈紶杈撳崗璁紝鏄疻eb閫氫俊鐨勫熀纭銆傚畠宸ヤ綔鍦═CP鐨80绔彛锛岀敤浜庡彂閫佸拰鎺ユ敹HTML椤甸潰锛屼絾鍏堕氫俊鍐呭浠ユ槑鏂囧舰寮忎紶杈擄紝...
绛旓細鐗规剰鏁寸悊鍑轰簡鏈鍒嗙被鐩綍鐨Android闈㈣瘯棰锛屾柟渚垮ぇ瀹跺钩鏃跺涔犲拰鏀惰棌銆傝繖浜汚ndroid闈㈣瘯棰橀兘鏁寸悊鎵撳寘濂戒簡鈫掞細 鐐瑰嚮涓嬭浇 鎵鏈夌殑闈㈣瘯棰樼洰閮戒笉鏄竴鎴愪笉鍙樼殑锛岄潰璇曢鐩彧鏄粰澶у涓涓熼壌浣滅敤锛屾渶涓昏鐨勬槸缁欒嚜宸卞鍔犵煡璇嗙殑鍌ㄥ锛屾湁澶囨棤鎮c傚笇鏈涙鍦ㄥ噯澶囬潰璇曠殑鏈嬪弸浠兘椤洪『鍒╁埄鎵惧埌鑷繁蹇冧华鐨勫伐浣滐紒锛侊紒
绛旓細2.浣犲浣曡繘琛Android搴旂敤鐨勫竷灞璁捐锛熶富瑕侀氳繃XML甯冨眬鏂囦欢鏉ュ疄鐜板簲鐢ㄧ殑甯冨眬璁捐銆傚父瑙佺殑甯冨眬绫诲瀷鍖呮嫭LinearLayout銆丷elativeLayout銆丆onstraintLayout绛夈傚悓鏃讹紝涔熶細缁撳悎浠g爜鍔ㄦ佽皟鏁村竷灞鍙傛暟鍜屾牱寮忔潵婊¤冻澶嶆潅鐨勭晫闈㈤渶姹傘傚苟涓斿埄鐢ㄧ粍浠跺Button銆乀extView绛夋潵鍛堢幇鐢ㄦ埛鐣岄潰鐨勪笉鍚屽厓绱犮備笁銆佸叧浜庢ц兘浼樺寲闂 3.濡備綍浼樺寲...
绛旓細绗1绔犺嚦绗13绔犲垎鍒繁鍏ユ帰璁ㄥ悇涓富棰橈紝姣忕珷閮藉寘鍚簿蹇冭璁$殑闈㈣瘯棰浠ュ強璇︾粏鐨勮В绛旓紝鏃ㄥ湪甯姪浣犲珐鍥虹煡璇嗭紝鎻愬崌闈㈣瘯鎶宸с傛棤璁轰綘瀵Android寮鍙戠殑鍝釜鏂归潰鏈夌枒闂紝杩欓噷閮借兘鎵惧埌瑙g瓟銆傜幇鍦紝杩欏叏濂楄瑙g殑闈㈣瘯棰樺簱宸茬粡鏁寸悊瀹屾瘯锛岀瓟妗堜竴搴斾勘鍏紝鍙渶浣犵偣鍑昏幏鍙栵紝绁濅綘鍦ㄦ眰鑱岃矾涓婅秺璧拌秺椤猴紝鏃╂棩瀹炵幇鐞嗘兂涓殑鑱屼綅锛
绛旓細浼犻掔殑鏄肩殑鎷疯礉锛屾搷浣滀笉浼氬奖鍝嶅師濮嬪彉閲忥紱鑰屽浜庡紩鐢ㄧ被鍨嬶紝浼犻掔殑鏄紩鐢ㄥ湴鍧锛屽鏂规硶鍐呯殑鎿嶄綔涓嶄細鏀瑰彉鍘熷瀵硅薄鐨勭姸鎬侊紝杩欎篃鏄紩鐢ㄤ紶閫掍笌鍊间紶閫掔殑涓昏鍖哄埆銆傜悊瑙h繖浜涙蹇鏈鍔╀簬鍦ㄥ疄闄呯紪绋嬩腑閬垮厤娼滃湪鐨勯櫡闃憋紝浼樺寲浠g爜缁撴瀯銆傝嫢鎯虫繁鍏ヤ簡瑙e拰鎺屾彙杩欎簺闈㈣瘯瑕佺偣锛屽彲浠ュ叧娉ㄦ垜浠殑璧勬簮锛岃幏鍙栨洿澶闈㈣瘯棰璇﹁В銆