• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

《程序员面试宝典与进阶秘籍》—— Android篇

互联网 diligentman 2周前 (04-07) 7次浏览

《程序员面试宝典与进阶秘籍》—— Android篇

一、初级要求:

Android UI 基础:四层系统架构的掌握和理解、环境的搭建、View常用属性和常用控件、界面布局、Style的作用及基本用法、Android常用资源

1、android五种基本布局:线性LinearLayout、相对RelativeLayout、帧布局FrameLayout、绝对布局AbsoluteLayout、表格布局TableLayout;

2、单位:

dip:device independent pixels(设备独立像素),不依赖像素,不同设备有不同显示效果,与设备硬件有关;

px:pixels(像素),不同设备显示效果相同,HVGA代表320×480像素;

pt:point,标准的长度单位,1pt=1/72英寸,用于印刷业;

sp:scaled pixels(放大像素),用于字体显示,TextView默认使用sp。

3、MVC模式:

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

视图层View:一般采用XML文件进行界面的描述;

控制层controller:Activity实现了这个职责;不要在activity中写代码,要通过activity交割model业务逻辑层处理,因为activity的响应时间只有5s;

4、android中有3种菜单:

(1)选项菜单Options menus:一个Activity只能有1个选项菜单,在按下menu键时,显示在屏幕下方;

(2)上下文菜单Context menus:为Activity中的任何一个视图注册一个上下文菜单,长按时出现;

(3)弹出式菜单Popup menus:依赖于Activity中的某个视图。

5、Android系统架构:应用程序层、应用程序框架层、系统运行库层、Linux核心层;

6、log打印:Android.util.log常用方法5个:VERBOSE、DEBUG、INFO、WARN、ERROR

Log.v:黑色,verbose(啰嗦);

Log.d:蓝色,debug(调试);.

Log.i:绿色,information(提示性的信息);

Log.w:橙色,warning(警告),需要我们这注意优化android的代码;

Log.e:红色,error(错误),需要认真分析,查找栈的信息;

7、资源目录:

res/anim/ 用来放置动画

res/xml/ 用来放置style theme等XML定义

res/raw/ 用来放置data数据

res/drawable 存放png、jpg等图标文件,或自定义drawable

res/layout 存放xml界面文件

res/values 存放使用到的各种类型数据

8、构造对话框

AlertDialog.Builder db = new Builder(this); db.create().show();

PregressDialog pDialog = new ProgressDialog(context);

9、Android系统的5大不足

(1)安全和隐私;

(2)首先开卖Android手机的不是最大的运营商;

(3)运营商仍然能够影响到Android手机;

(4)同类机型用户减少;

(5)过分依赖开发商,缺少标准配置;

Android系统的5大优势:

(1)开放性;

(2)挣脱运营商的束缚;

(3)丰富的硬件选择;

(4)不受任何限制的开发商;

(5)无缝结合的Google应用;

10、ListView的优化方案:

(1)如果自定义适配器,那么在getView方法中要考虑方法传进来的参数contentView是否为null,如果为null,就创建contentView并返回,如果不为null,则直接使用。在这个方法中尽可能少创建view;

(2)给contentView设置tag(setTag()),传入一个viewHolder对象,用于缓存要显示的数据,可以达到图像数据异步加载的效果;

(3)如果listView需要显示的item很多,就要考虑分页加载。比如一共显示100条或者更多的时候,可以先加载20条,等用户拉到列表底部的时候再去加载接下来的20条;

11、列表显示需要3个元素:

(1)ListView:用来显示列表的View;

(2)适配器:用来把数据映射到ListView的中介;

(1)数据源:具体的将被映射的字符串、图片、或者基本组件;

 

Java核心:java面向对象编程的核心、常用API—Java Web编程以及JavaSE核心内容,特别是IO和多线程;初步具备面向对象设计和编程的能力;掌握基本的JVM优化策略。

1、java虚拟机采用“自适应”的垃圾回收技术,有两种回收方式:

(1)“停止-复制”:先暂停程序的运行,将存活的对象从当前堆复制到另一个堆,没有复制的全是垃圾。被复制到新堆上的对象是一个挨着一个的,保持紧凑排列。就可以按前述方法简单、直接的分配内存了。这将导致大量内存复制行为,内存分配是以较大的“块”为单位的。有了块之后,垃圾回收器就可以不往堆里拷贝对象了,直接就可以往废弃的块里拷贝对象了。

(2)“标记-清除”:它的思路同样是从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象,每当它找到一个存活对象,就会给对象一个标记。这个过程中不会回收任何对象,只有全部标记完成时,没有标记的对象将被释放,不会发生任何复制工作,所以剩下的堆空间是不连续的,然后垃圾回收器重新整理剩余的对象,使他们是连续排列的。

2、JNI的调用过程:

(1)安装和下载Cygwin,下载Android NDK;

(2)在NDK项目中进行JNI接口的设计;

(3)使用C/C++实现本地方法;

(4)JNI生成动态链接库.so文件;

(5)将动态链接库复制到Java工程,在Java工程中调用,运行Java工程即可。

3、ArrayList、Vector、LinkedList:

(1)ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接按序号索引元素,但是插入元素要涉及数组元素等内存操作,所以索引数据快而插入数据慢;

(2)Vector由于使用了synchronized方法(线程安全),性能上较ArryList差;

(3)LinkedList使用双向链表实现存储,按序号索引数据,需要进行向前或向后便利,但插入数据时,只需要记录本项的前后项即可,所以插入速度较快;

4、HashMap和HashTable的区别:

(1)HashMap是HashTable的轻量级实现(非线程安全的实现),都实现了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于HashTable;

(2)HashMap允许将null作为一个entry的key或者value,二HashTable不允许;

(3)HashMap把HashTable的contains方法去掉了,改成containsKey和containsValue;HashTable继承自Dictionary类,而HashMap是Java1.2引进的一个Map interface实现;

(4)最大的不同是,HashTable的方法是Synchronize的,而HashMap不是,在多个线程访问HashTable时,不需要自己为它的方法实现同步,而HashMap必须为之提供外同步;

(5)采用的hash/rehash算法大概一样,所以性能不会有很大的差异。

5、与(&)和短路与(&&)、或(|)和短路或(||)的区别:

&&(逻辑与),全真才为真;||(逻辑或),有真则为真;

使用短路与,只要第一个结果为false,则结果为false,不会继续执行下去;如果不是短路与,第一个结果为false,仍然继续执行下面的判断;

6、构造函数:与类同名、没有返回值、没有return语句;

7、“==”和equals的区别:

“==”比较两个变量的值是否相等,也就是变量对应内存中存储的数值是否相同,比较基本数据类型的数据或两个引用变量是否相等,用“==”;

equals用于比较两个独立对象的内容是否相同;

8、方法的重写Overriding和重载Overloading:是java多态性的不同表现

重写Overriding:是父类与子类之间多态性的一种表现,子类可以重写(覆盖)父类的方法

重载Overloading:是一个类中多态性的一种表现,一个类中定义多个同名的方法,或有不同的参数个数或不同的参数类型。

9、面向对象的特征:

封装:

继承:

多态:

10、静态变量和实例变量:

静态变量:在内存中只有1份,所有实例共享该变量,可以用具体实例加.来引用,也可以直接类名加.来引用;

实例变量:随实例不同可以不同,在别的类中只能先实例化,再用具体实例加.来调用;

11、final、finally、finalize

final:final修饰的类不能不继承,final修饰的方法不能被覆盖,final修饰的字段为常量;

finally:异常处理中来执行任何清除操作;

finalize:做必要的清理工作;

12、接口和抽象类的区别:

一个类可以实现多个接口,只能继承一个抽象类;

抽象类可以有构造方法,接口不能有构造方法;

抽象类可以有普通成员变量,接口不能有普通成员变量;

抽象类中可以包含静态方法,接口不能包含静态方法;

 

Android应用核心组件:四大组件(Activity、Service、BroadcastReceiver、ContentProvider)、Activity生命周期及页面跳转传值、启动模式、Intent七大属性A

1、Activity的生命状态:

Active/Running:处于屏幕最上层,系统堆栈的最顶端;

Paused:失去焦点但还看得到画面;

Stopped:被完全遮蔽;

Inactive:被杀死时,会从activity栈中移除;

2、Activity的启动模式:

standard:每次都会实例化

singleTop:复用栈顶元素

singleInstance:独占1个task,且只有一个activity

singleTask:栈内复用,清除其上的元素

3、Android的四大组件:

Activity:是android程序与用户交互的窗口,保持各界面状态,做很多持久化的事情,管理生命周期及一些跳转逻辑;

Service:后台

Content Provider:是Android提供的第三方应用数据的访问方案

Broadcast Receiver:广播接收器

4、URI:

是ContentResolver和ContentProvider进行数据交换的标识;

URI的标准前缀:以“content://”为前缀;

URI的authority部分:完整的类名(小写的形式);

URI的path部分(资源部分、数据部分):用于决定哪类数据被请求

5、GC内存泄露的情况:

数据库的cursor没有关闭;

Bitmap对象不使用时采用recycle释放;

Activity中对象的生命周期大于Activity的生命周期;

没有使用contentView;

 

Android消息机制:Android 通过Looper、Handler来实现消息循环机制;Android的消息循环是针对线程的,每个线程都可以有自己的消息队列和消息循环;Looper负责管理线程的消息队列和消息循环;通过Looper.myLooper()得到当前线程的Looper对象,通过Looper.getMainLooper()得到当前进程主线程的Looper对象。

1、Handler、Looper

Looper:一个线程可以产生一个Looper对象,来管理此线程里的MessageQueue(消息队列);

Handler:构造Handler对象,来与Looper沟通,以便push新消息到MessageQueue中,或者接收Looper从MessageQueue取出送来的消息;

MessageQueue:用来存放线程放入的消息;

线程:主线程,Android启动程序时会替它建立一个MessageQueue;

2、sleep()和wait()的区别

sleep:是线程类(Thread)的方法,使此线程暂停指定时间,把执行机会给其他线程,但监控状态依然保持,到时会自动恢复,不会释放对象锁;

wait:是Object类的方法,导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify火灾notifyAll方法后,本线程才获得对象锁进入运行状态;

3、Android进程的重要程度由高到低:

前台进程 > 可见进程 > 服务进程 > 后台进程 > 空进程

 

Android异步操作:Android提供了一个工具类AsyncTask(异步执行任务),处理后台比较耗时的任务,不再需要子线程和Handler就可以完成异步操作并且刷新用户界面

1、Android处理耗时操作的方式有哪些

AsyncTask、Handler、Thread、Loaders

2、AsyncTask定义了3种泛型类型

AsyncTask是抽象类,定义了3种泛型类型:Params、Progress、Result

3、Handler的主要用途

确定在将来的某个时间点执行一个或者一些Message和Runnable对象;

在其他线程中排入一些要执行的动作;

4、AsyncTask作用:

开发过程中,要用多线程来进行操作,将耗时的操作放在单独的线程中执行,避免占用主线程给用户带来不好的体验;但在子线程中无法操作主线程,因此用Handler类在子线程中更新UI线程,用发消息的机制更新UI界面,呈现给用户;但耗时的任务会启动一些匿名的子线程,太多的子线程给系统带来巨大的负担,随之带来一些性能问题;因此用一个工具类AsyncTask,来出来一些后台的耗时任务,不需要子线程和Handler就可以完成异步操作,并且刷新用户界面。

 

二、中级要求:

Android核心:高级UI的使用和定制、Android视图系统和核心实践处理、派发机制、绘图原理和高级控件动画的使用、广播接收器、联系人提供程序、短信技术、电话技术、Android设备各种传感器的使用

1、广播的注册方式:

静态注册:在清单文件中声明,是常驻型,当应用程序关闭后,如果有信息广播来到,程序也会被系统调用自动运行;

动态注册:使用代码进行注册,不是常驻型,跟随程序的生命周期;

数据存储:对存储空间及文件存储的掌握、SD卡存储、Sharedpreferences存储、数据库SQLite存储技术等

1、Android只有一种轻量级数据库,就是SQLite;

2、Preference、File、DataBase这3种存储方式的存储路径:

Preference:/data/data/包名/Shared_Prefs

File:/data/data/包名/files

DataBase:/data/data/包名/database

网络:Socket、HTTP、TCP/IP、UDP等各种网络协议的特点和使用方法的掌握、了解基于局域网点对点通信、掌握网络请求方式和乱码处理、掌握常见的数据交换格式XML和

JSON、熟悉各种解析方式

1、json和xml的优缺点比较

流行度方面,xml被广泛使用,json才刚刚开始;

json和xml同样拥有丰富的解析手段;

json相对于xml来讲,数据的体积小;

json与javascript的交互更加方便;

2、Socket通信编程中,客户端的编程步骤是:

创建客户端套接字(指定服务器端IP地址与端口号);

连接(Android创建Socket时会自动连接);

与服务器端进行通信;

关闭套接字;

3、Socket通信编程中,服务器端的编程步骤是:

创建一个ServerSocket,用于监听客户端Socket的连接请求;

采用循环不断接收来自客户端的请求;

每当接收到客户端Socket的请求,服务器端也对应产生一个Socket;

4、JSON解析类有哪些:

JSONObject、JSONStringer、JSONArray、JSONTokener、JSONException

5、XML解析方式:SAX、DOM、Pull

 

二、高级要求:

Android高级技术:LBS相关技术、第三方分享、推送、OpenFile框架和XMPP协议等

1、Android代码优化技术:java内存控制、循环使用、图片优化

 

 


程序员灯塔
转载请注明原文链接:《程序员面试宝典与进阶秘籍》—— Android篇
喜欢 (0)