Android工程师面试准备知识点

听+7哥说,把下面的全弄懂,面试必过,所以我就试着去把所有题目补充了一下,各位能耐的网友们,如果有吐槽或者补充的尽管给我留言,在这里谢过大家了。

1.   android的多线程如何通信

答:Android提供了Handler和Looper来满足线程间的通信。

Handler是消息的处理者,可以发布或者处理或者操作一个Runnable, handler接受消息后调用handleMessage进行处理。

Looper是Handler与消息队列之间通讯桥梁,程序组件通过Handler把消息传递给Looper,Looper把消息放入队列。

2.   android的多进程通信原理

答:Android实现跨进程通信的方式是采用的是AIDL方式

AIDL(Android 接口描述语言)是一种接口口描述语言; 编译器可以通过aidl 文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的.  如果需要在一个Activity 中, 访问另一个Service 中的某个对象, 需要先将对象转化成AIDL 可识别的参数(可能是多个参数), 然后使用AIDL 来传递这些参 数, 在消息的接收端, 使用这些参数组装成自己需要的对象.

原理:进程之间的通信信息,首先会被转换成AIDL协议消息,然后发送给对方,对方收到AIDL协议消息后再转换成相应的对象。由于进程之间的通信信息需要双向转换,所以android采用代理类在背后实现了信息的双向转换,代理类由android编译器生成,对开发人员来说是透明的。

3.   Android五大组件 怎么使用

答:Activity、Intent、Service、Content Provider,Broadcast Receiver

Activity:字面意思为“活动”,简单来说就是一个屏幕,通过调用setContentView()来设置要显示的界面。

Intent:表示“意图”,可以实现Activity与Activity之间的交互,传递数据。

Service:表示服务,与Activity一样默认运行于主线程,但是它没有可视化界面,是运行在后台。通过调用startService或bindService方法来启动来启动服务。

Content Provider:为解决应用程序间数据通信、共享的问题而引入的。

Broadcast Receiver: 广播接收器,Android的广播要么来自系统,要么来自普通程序。

可以在AndroidMenifest.xml注册广播接收器或在代码中注册。

4.   service启动默认是什么线程

答:默认启动的是主线程

5.  使用过哪些设计模式进行开发

答:单例模式、工厂模式、观察者模式

6.   线程池有什么优点缺点

答:优点就是减少创建线程的消耗,每次创建线程都从线程池中拿。

缺点是一直占用内存。

7. 多种布局方式的特点,怎么使用

答:

线性布局-LinearLayout

orientation-容器内元素的排列方式。

vertical:子元素们垂直排列

horizontal:子元素水平排列

这是用得最多的一种布局,通过设置orientation来决定子元素是按照什么方式排列。

绝对布局-AboluteLayout

layout_x:x坐标。以左上角为顶点。

layout_y:y坐标。以做上角为顶点。

这个布局被摒弃了,不够灵活

相对布局-RelativeLayout

layout_centerInParent – 将当前元素放置到其容器内的水平方向和垂直方向的中央位置(类似的属性有:layout_centerHorizontal,layout_alignParentLeft等)

layout_marginLeft – 设置当前元素相对于其容器的左侧边缘的距离

layout_below – 放置当前元素到指定的元素的下面

layout_alignRight – 当前元素与指定的元素右对齐

这个布局也是经常用的,一般想要复杂的布局,它少不了,因为它可以很好的定位。

表格布局-TableLayout

表格布局主要以行列的方式来管理子控件,其中每一行即一个TableRow对象,每个TableRow对象可以添加子控件,并且每假如一个控件即相当于添加了一列。

帧布局-FrameLayout

也叫层叠布局。以左上角为起点,将FrameLayout内的元素一层覆盖一层地显示,在帧布局中,先添加的图片被后添加的图片覆盖。

8.android的数据库使用是否熟悉

答:SQLite是Android内嵌的一个轻量级数据库,说实在我用得并不多,不太熟悉。

9.android的xml解析有哪些 有什么区别

答:在Android平台上可以使用SAX(Simple API for XML)、Document Object Model(DOM)和Android附带的Pull解析器解析XML文件。

DOM解析:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问

解析过程:

1.      获取factory

DocumentBuilderFactory  builderFactory =DocumentBuilderFactory.newInstance();

2.      获取builder

builder =builderFactory.newDocumentBuilder();

3.      解析为Document对象

Document document  = builder.parse(xmlFile);

4.      获取根元素

Element root = document.getDocumentElement();

5.      获取根元素下的子节点

NodeList childNodes =root.getChildNodes();

SAX解析:不像DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问。

1.      获取factory

SAXParserFactory factory =SAXParserFactory.newInstance();

2.      获取Parser

SAXParser parser =factory.newSAXParser();

3.      开始解析

parser.parser(xmlFile, newMySAXListener());

PULL解析: 除了可以使用 SAX和DOM解析XML文件,大家也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。

1.      获取parser

XmlPullParserparser = Xml.newPullParser();

2.      设置输入

parser.setInput(instream, “UTF-8”);

3.      获取事件类型

int eventType = parser.getEventType();

4.      开始解析

10.android的基础类库有哪些 例如 List 、Set、 HashSet有什么区别,如何排除重复的数据

答:

android.app :提供高层的程序模型、提供基本的运行环境

android.content :包含各种的对设备上的数据进行访问和发布的类

android.database :通过内容提供者浏览和操作数据库

android.graphics :底层的图形库,包含画布,颜色过滤,点,矩形,可以将他们直接绘制到屏幕上.

android.location :定位和相关服务的类

android.media :提供一些类管理多种音频、视频的媒体接口

android.net :提供帮助网络访问的类,超过通常的 java.net.* 接口

android.os :提供了系统服务、消息传输、 IPC 机制

android.opengl :提供 OpenGL 的工具

android.provider :提供类访问 Android 的内容提供者

android.telephony :提供与拨打电话相关的 API 交互

android.view :提供基础的用户界面接口框架

android.util :涉及工具性的方法,例如时间日期的操作

android.webkit :默认浏览器操作接口

android.widget :包含各种 UI 元素(大部分是可见的)在应用程序的屏幕中使用

List按对象进入的顺序保存对象,不做排序或编辑操作。Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于Set,而不关心它的顺序--否则应该使用List)。

具体查看http://blog.csdn.net/wwj_748/article/details/7883988

11.做过什么东西,介绍一下。

答:我做过一个新闻客户端,还有一个音乐播放器,实习正在做的是一个语音邮箱客户端,正在开发当中的一个新浪微博客户端。

1.      新闻客户端是我在大学参加软件开发大赛的一个作品,它是一款手机应用,用来显示新闻信息,可供用户查看和评论新闻。

2.      简、美音乐播放器是我自主研发的一个音乐播放器,本着想做一款简单、漂亮的音乐播放器给自己用。

3.      语言邮箱是我自己在实习公司参与开发的一款产品,是我们公司的一款产品。

4.      新浪微博客户端是我的一个进阶项目,想熟悉新浪微博开发平台API的使用,为自己开发其他开放平台做一个铺垫,现在还在开发当中。

12.触屏处理流程

答:事件传递顺序为ViewGroup::onInterceptTouchEvent()–>ViewGroup或View的onTouchEvent() –> Activity::onTouchEvent()

1.      当ViewGroup::onInterceptTouchEvent()返回值为false,事件(按下、移动、抬起等)都传递给目标View。如果在ViewGroup触发,就调用ViewGroup::OnTouchEvent(),如果在View触发,则调用View::OnTouchEvent();

2.      当ViewGroup::onInterceptTouchEvent()返回值为true,事件会直接传递到ViewGroup::onTouchEvent()处理。也就是说,事件后面的移动、抬起动作不会经过onInterceptTouchEvent(),而是直接传到onTouchEvent()。

3.      当ViewGroup::OnTouchEvent()/View::OnTouchEvent()返回值为true,表示按下动作事件被处理,意味着事件的移动、抬起等后续动作将会传到此方法。如果是View处理的话,则ViewGroup::OnTouchEvent()将不会获得该事件; 如果是ViewGroup处理,则Activity::OnTouchEvent()将不会活动该事件。

4.      当ViewGroup::OnTouchEvent()/View::OnTouchEvent返回值为false,表示不处理事件,系统将把事件传递给其父级处理。

5.      Activity::OnTouchEvent()这个是最后被处理的地方,如果不处理,系统将抛弃这个事件。

小结:onInterceptTouchEvent()是用来分发事件,OnTouchEvent()是用来处理事件的,谁不处理就交给上一级处理,层层传递。

13.activity流程

答:创建onCreate-  启动onStart – 开始onResume – 暂停 onPause – 结束onStop – 销毁onDestroy

在一个Activity正常启动的过程中,他们被调用的顺序是 onCreate ->onStart -> onResume, 在Activity被干掉的时候顺序是onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期

详细介绍一下这几个方法中系统在做什么以及我们应该做什么:

  onCreate: 在这里创建界面 ,做一些数据 的初始化工作

  onStart: 到这一步变成用户可见不可交互 的

  onResume: 变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个

  Activity的最上面,运行完弹出栈,则回到上一个Activity)

  onPause: 到这一步是可见但不可交互 的,系统会停止动画 等消耗CPU 的事情

  从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候

  你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在

  onResume里读出来,注意:这个方法里做的事情时间要短,因为下一

  个activity不会等到这个方法完成才启动

  onstop: 变得不可见 ,被下一个activity覆盖了

  onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方

  法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判

  断它,如果你有一个ProgressDialog在线程中转动,请在onDestroy里

  把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛

  异常的。

  onPause,onStop, onDestroy,三种状态 下 activity都有可能被系统干掉

为了保证程序的正确性,你要在onPause()里写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般都是数据库 )。实际工作中因为生命周期的变化而带来的问题也很多,比如你的应用程序起了新的线程在跑,这时候中断了,你还要去维护那个线程,是暂停还是杀掉还是数据回滚,是吧?因为Activity可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了,一般都是采用Android的消息机制 [Handler ,Message]来处理多线程和界面交互的问题。

14.如何提高程序的优先级,避免系统内存不足的时候被杀掉

答:为了提高我们的Activity中的线程的线程优先级(Thread-Priority),我们可以在AndroidManifest.xml使用uses-permission标签。可以这么做:

<uses-permissionid="android.permission.RAISED_THREAD_PRIORITY"/>

然后在Activity代码中设置线程优先级

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);//设置线程优先为后台,这样当多个线程并发后很多无关紧要的线程分配的CPU时间将会减少,有利于主线程的处理,相关的Thread优先级定义罗列有以下几种:

int THREAD_PRIORITY_AUDIO //标准音乐播放使用的线程优先级

int THREAD_PRIORITY_BACKGROUND //标准后台程序

int THREAD_PRIORITY_DEFAULT // 默认应用的优先级

int THREAD_PRIORITY_DISPLAY //标准显示系统优先级,主要是改善UI的刷新

int THREAD_PRIORITY_FOREGROUND //标准前台线程优先级

int THREAD_PRIORITY_LESS_FAVORABLE //低于favorable

int THREAD_PRIORITY_LOWEST //有效的线程最低的优先级

int THREAD_PRIORITY_MORE_FAVORABLE //高于favorable

int THREAD_PRIORITY_URGENT_AUDIO //标准较重要音频播放优先级

int THREAD_PRIORITY_URGENT_DISPLAY //标准较重要显示优先级,对于输入事件同样适用。

时间: 2024-10-24 12:44:55

Android工程师面试准备知识点的相关文章

Android工程师进阶之路 :《Android开发进阶:从小工到专家》上市啦!

封面 目录1 目录2 - 当当购买链接 - 京东购买链接 为什么写这本书 写这本书的念头由来已久了.也许是从我打算写<Android源码设计模式解析与实战>那时起就萌生了这个念头,因为设计模式属于仅次于架构之下的局部战术,阅读这类书籍能够让具备一定工作经验的开发人员提升自己的设计能力,构建更灵活的软件.但是,对于初.中级工程师而言,最重要的还是在于基础知识以及知识广度的掌握上.因此,在<Android源码设计模式解析与实战>交稿之后,我就立即开始了本书的写作之旅. 从面试经历和与开

.NET工程师面试宝典

.Net工程师面试笔试宝典 传智播客.Net培训班内部资料 这套面试笔试宝典是传智播客在多年的教学和学生就业指导过程中积累下来的宝贵资料,大部分来自于学员从面试现场带过来的真实笔试面试题,覆盖了主流的.Net笔试面试题.很多学员面试回来都会说“这次面试出的题几乎都在面试笔试宝典上有”,比如下面就是一个老学员的来信: 这套面试题主要目的是帮助那些还没有.Net软件开发实际工作经验,而正在努力寻找.Net软件开发工作的朋友在笔试时更好地赢得笔试和面试.由于这套面试题涉及的范围很泛,很广,很杂,大家不

年后想跳槽?这里有一份Android中高级面试总结

转眼又到年底了,不知道有多少人在心里盘算着拿到年终奖之后就立马提交辞职申请,我相信有这种想法的人应该不在少数.在经历了一年的浴血奋战,受尽了各种委屈和折磨,仍然坚守岗位直到年底的,绝对不是出于对工作的热爱,大多数人都是因为舍不得即将到手的年终奖才选择忍气吞声的. 此文希望能给那些想跳槽的朋友一些参考. 随着工作时间的增加和技术经验的积累.原先的公司不一定能提供给你想要的发展空间与前景.说简单点,家里还有老婆孩子还有老父母,我们需要更高的薪酬.所以跳槽是个不错的选择. 夏末的时候我就有了跳槽的想法

这是一份集合一线大厂Android工程师必备技能体系+学习路线!

一份学习路线图,非常赞,推荐给大家. 目录 Java基础 Java Object类方法 HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理 HashMap 和 HashTable 区别 HashCode 作用,如何重载hashCode方法 ArrayList与LinkList区别与联系 GC机制 Java反射机制,Java代理模式 Java泛型 Synchronized原理 Volatile实现原理 方法锁.对象锁.类锁的意义和区别 线程同步的方法:Synchronized.lo

2019最新Android中级面试题目汇总解答

注:因为实际开发与参考答案会有所不同,再者怕误导大家,所以这些面试题答案还是自己去理解!面试官会针对简历中提到的知识点由浅入深提问,所以不要背答案,多理解. Android进阶延伸点 1.如何进行单元测试,如何保证App稳定 ? 参考回答: 要测试Android应用程序,通常会创建以下类型自动单元测试 本地测试:只在本地机器JVM上运行,以最小化执行时间,这种单元测试不依赖于Android框架,或者即使有依赖,也很方便使用模拟框架来模拟依赖,以达到隔离Android依赖的目的,模拟框架如Goog

Android开发面试经——4.常见Android进阶笔试题(更新中...)

Android开发(29)  版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44301359 上一篇文章我们已经了解了Android笔试的一些基础题目, [<Android开发面试经——2.常见Android基础笔试题> ] (http://blog.csdn.net/finddreams/a

Linux运维工程师面试-部分题库(答案版)

最近两个月有意跳槽,看到了一篇Linux运维工程师面试-部分题,就试着做了一下,感觉对Linux基础部分挺有帮助,在这里整理一份参考答案给大家,错误之处还望多多指出. 博文原地址 http://wgkgood.blog.51cto.com/1192594/1627684 一.Linux操作系统知识 1.常见的Linux发行版本都有什么?你最擅长哪一个?它的官网网站是什么?说明你擅长哪一块? 答: 常见的Linux发现版本有Redhat.Centos.Debian.Ubuntu.Suse 最擅长R

Android开发面试经——6.常见面试官提问Android题②(更新中...)

版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44560061 1.HttpURLConnection和HttpClient他们各自的优缺点是什么? HttpUrlConnection 在 2.3 以前的版本是有 bug 的,所以之前的版本推荐使用 HttpClient,但是 google 现在

Android 工程师如何快速学会web前段

Android 工程师如何快速学会web前段 今天主要聊一下本人最近在学习web前段的感受,最近html5是越来越火了,前段时间公司做了一个项目然后让我们"android"的程序猿过去帮忙把客户 端框架搭建一下,其实所谓的框架其实就是一个android套了一个壳,然后嵌入webview各个页面都加载html5,发现html5做的客户端和 android原生的做出来效果真没差多少,看来公司如此的看中h5的趋势下,本人狠下心来,坚持学h5,. 刚开始学的时候感觉很陌生,首先安装sublim