Android工程师面试准备知识点
Android工程师面试准备知识点
听说,把下面的全弄懂,面试必过,所以试着去把所有题目补充了一下,各位能耐的网友们,如果有吐槽或者补充的尽管留言,在这里谢过大家了。
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 //标准较重要显示优先级,对于输入事件同样适用。
- 什么是Activity?
- 请描述一下Activity生命周期。
- 两个Activity之间跳转时必然会执行的是哪几个方法。
- 横竖屏切换时候Activity的生命周期。
- 如何将一个Activity设置成窗口的样式。
- 你后台的Activity被系统 回收怎么办?
- 如何退出Activity?如何安全退出已调用多个Activity的Application?
- 如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
- 两个Activity之间怎么传递数据?
- 怎么让在启动一个Activity是就启动一个service?
- 同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?
- Activity怎么和service绑定,怎么在activity中启动自己对应的service?
- 什么是Service以及描述下它的生命周期。
- Service有哪些启动方法,有什么区别,怎样停用Service?
- 不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放?
- 什么是IntentService?有何优点?
- 什么时候使用Service?
- 请描述一下Intent 和 Intent Filter。
- Intent传递数据时,可以传递哪些类型数据?
- 说说Activity,Intent,Service是什么关系 。
- 请描述一下Broadcast Receiver。
- 在manifest和代码中如何注册和使 用 broadcast receiver 。
- 请介绍下ContentProvider是如何实现数据共享的。
- 请介绍下Android的数据存储方式。
- 为什么要用ContentProvider?它和sql的实现上有什么差别?
- 请介绍下Android中常用的五种布局。
- 谈谈UI中, Padding和Margin有什么区别?
- widget相对位置的完成在antivity的哪个生命周期阶段实现。
- 请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。
- AIDL的全称是什么?如何工作?能处理哪些类型的数据?
- 请解释下Android程序运行时权限与文件系统权限的区别。
- 系统上安装了多种浏览器,能否指定某浏览器访问指定页面?
- 对多线程的运用和理解,及多线程之间handle的传值。
- 对android虚拟机的理解,包括内存管理机制垃圾回收机制。
- Framework工作方式及原理,Activity是如何生成一个view的,机制是什么。
- android本身的一些限制,比如apk包大小限制,读取大文件时的时间限。
- 如何加载的音乐信息,如何改善其效率。
- ListView如何提高其效率?
- 启动应用后,改变系统语言,应用的语言会改变么?
- 启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?
- Android程序与Java程序的区别?
- Android中Task任务栈的分配。
- 在Android中,怎么节省内存的使用,怎么主动回收内存?
- 不同工程中的方法是否可以相互调用?
- 在Android中是如何实现判断区分通话记录中的电话状态,去电,来电、未接来电?
- dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
- sim卡的EF 文件有何作用
- 如何判断是否有SD卡?
- 嵌入式操作系统内存管理有哪几种, 各有何特性。
- 什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?
- 一条最长的短信息约占多少byte?
- Linux中跨进程通信的几种方式 。
- 谈谈对Android NDK的理解。
- 谈谈Android的优点和不足之处。
- Android系统中GC什么情况下会出现内存泄露呢?
- Android UI中的View如何刷新。
- 简单描述下Android 数字签名。
- 什么是ANR 如何避免它?
- android中的动画有哪几类,它们的特点和区别是什么?
- handler机制的原理。
- android中线程与线程,进程与进程之间如何通信。
- 说说mvc模式的原理,它在android中的运用。
- android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别。
- DDMS与TraceView的区别?
- res目录有默认几项resource。
- android的哪个版本是一次重大的升级?
-
【解3】 startActivity(Intent intent) ; startActivityForResult (Intent intent, int requestCode) ; onActivityResult (int requestCode, int resultCode, Intent data); setResult(int resultCode);
-
【解8】onSaveInstanceState() 当你的程序中某一个Activity A在运行时,主动或被动地运行另一个新的Activity B,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate()了。
-
【解26】FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)
-
介绍下Android的数据存储方式。 一.SharedPreferences方式 二.文件存储方式 三.SQLite数据库方式 四.内容提供器(Content provider)方式 五.网络存储方式
-
【解55】 (一) 查询数据库没有关闭游标 描述:程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor后没有关闭的情况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险。 (二) 构造Adapter时,没有使用缓存的 convertView (三)Bitmap对象不在使用时调用recycle()释放内存 (四) 释放对象的引用
【Java企业版】
【一般问题】
【数据库】