zoukankan      html  css  js  c++  java
  • 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 //标准较重要显示优先级,对于输入事件同样适用。

     

     

     

     

     

     

    1. 什么是Activity?
    2. 请描述一下Activity生命周期。
    3. 两个Activity之间跳转时必然会执行的是哪几个方法。
    4. 横竖屏切换时候Activity的生命周期。
    5. 如何将一个Activity设置成窗口的样式。
    6. 你后台的Activity被系统 回收怎么办?
    7. 如何退出Activity?如何安全退出已调用多个Activity的Application?
    8. 如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
    9. 两个Activity之间怎么传递数据?
    10. 怎么让在启动一个Activity是就启动一个service?
    11. 同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?
    12. Activity怎么和service绑定,怎么在activity中启动自己对应的service?
    13. 什么是Service以及描述下它的生命周期。
    14. Service有哪些启动方法,有什么区别,怎样停用Service?
    15. 不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放?
    16. 什么是IntentService?有何优点?
    17. 什么时候使用Service?
    18. 请描述一下Intent 和 Intent Filter。
    19. Intent传递数据时,可以传递哪些类型数据?
    20. 说说Activity,Intent,Service是什么关系 。
    21. 请描述一下Broadcast Receiver。
    22. 在manifest和代码中如何注册和使 用 broadcast receiver 。
    23. 请介绍下ContentProvider是如何实现数据共享的。
    24. 请介绍下Android的数据存储方式。
    25. 为什么要用ContentProvider?它和sql的实现上有什么差别?
    26. 请介绍下Android中常用的五种布局。
    27. 谈谈UI中, Padding和Margin有什么区别?
    28. widget相对位置的完成在antivity的哪个生命周期阶段实现。
    29. 请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。
    30. AIDL的全称是什么?如何工作?能处理哪些类型的数据?
    31. 请解释下Android程序运行时权限与文件系统权限的区别。
    32. 系统上安装了多种浏览器,能否指定某浏览器访问指定页面?
    33. 对多线程的运用和理解,及多线程之间handle的传值。
    34. 对android虚拟机的理解,包括内存管理机制垃圾回收机制。
    35. Framework工作方式及原理,Activity是如何生成一个view的,机制是什么。
    36.  android本身的一些限制,比如apk包大小限制,读取大文件时的时间限。
    37. 如何加载的音乐信息,如何改善其效率。
    38. ListView如何提高其效率?
    39. 启动应用后,改变系统语言,应用的语言会改变么?
    40. 启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?
    41. Android程序与Java程序的区别?
    42. Android中Task任务栈的分配。
    43. 在Android中,怎么节省内存的使用,怎么主动回收内存?
    44. 不同工程中的方法是否可以相互调用?
    45. 在Android中是如何实现判断区分通话记录中的电话状态,去电,来电、未接来电?
    46. dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
    47. sim卡的EF 文件有何作用
    48. 如何判断是否有SD卡?
    49. 嵌入式操作系统内存管理有哪几种, 各有何特性。
    50. 什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?
    51. 一条最长的短信息约占多少byte? 
    52. Linux中跨进程通信的几种方式 。
    53. 谈谈对Android NDK的理解。
    54. 谈谈Android的优点和不足之处。
    55. Android系统中GC什么情况下会出现内存泄露呢?
    56. Android UI中的View如何刷新。
    57. 简单描述下Android 数字签名。
    58. 什么是ANR 如何避免它?
    59. android中的动画有哪几类,它们的特点和区别是什么?
    60. handler机制的原理。
    61. android中线程与线程,进程与进程之间如何通信。
    62. 说说mvc模式的原理,它在android中的运用。
    63. android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别。
    64. DDMS与TraceView的区别? 
    65. res目录有默认几项resource。
    66. android的哪个版本是一次重大的升级?

     

    • 12点的小鬼

      【解3】 startActivity(Intent intent) ;   startActivityForResult (Intent intent, int requestCode) ; onActivityResult (int requestCode, int resultCode, Intent data);  setResult(int resultCode);

      2011-4-1  14:10回复(0)

    • 12点的小鬼

      【解8】onSaveInstanceState() 当你的程序中某一个Activity A在运行时,主动或被动地运行另一个新的Activity B,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate()了。

      2011-4-5  16:42回复(0)

    • 12点的小鬼

      【解26】FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)

      2011-4-5  16:46回复(0)

    • 12点的小鬼

       介绍下Android的数据存储方式。           一.SharedPreferences方式           二.文件存储方式           三.SQLite数据库方式           四.内容提供器(Content provider)方式           五.网络存储方式

      2011-4-5  16:48回复(0)

    • 12点的小鬼

      【解55】  (一) 查询数据库没有关闭游标 描述:程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor后没有关闭的情况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险。 (二) 构造Adapter时,没有使用缓存的 convertView (三)Bitmap对象不在使用时调用recycle()释放内存 (四) 释放对象的引用

     

    【Java核心】
    1) What is the purpose of serialization?
    为了传输,将java对象串行化以后变成01串方便传输或者保存,可以很容易的反串行变回原来的java对象。其中@tranxx的一个什么注解可以让java忽略某个属性不做串行化,比如某个巨大的字符串,有效减小串行化后的数据量。
     
    2) What is the difference between JDK and JRE?
    JDK是有开发功能的,比如javac什么的,javap什么的;JRE就是一个runtime environment,跑java字节码的
     
    3) What is the difference between equals and ==?
    ==是比较引用,equals是Object类的一个方法,可以通过重写equals方法达到比较内容的目的
     
    4) When will you use Comparator and Comparable interfaces?
    比较大小有的很容易,比如说2>1, "abc">"aba", 这种可以通过自然特性比较的容易理解,但是如果比较两个对象的时候怎么比呢,比如说比较两个人,是比年龄?身高?还是体重?
    所以可以通过实现Comparable来实现比较大小的功能,还是用人来说,就比较年龄,A的年龄比B大,就认为A>B
    这样的好处有很多,比如说实现了Comparable的以后,就可以用Collections.sort方法来排序。
    问题是并不是每次都以年龄比较的,如果下次要比较体重怎么办?那么就要写一个实现了Comparator的比较器来比较传入的两个对象的大小。所以用Collections.sort方法排序的时候传入一个List和一个Comparator
     
    5) What is the wait/notify mechanism?
    wait和notify的机制。。我没深入研究过,不过我想应该是通过共享锁的方法,比如说将某个对象设为锁(用那个synchronized关键字),某个线程占用了该锁以后,其它线程无法获得该锁就等着,知道那个占用线程释放锁,唤醒等待线程。
    这个瞎掰的,按照对操作系统的的了解吹吹。。。
     
    6) What is the difference between checked and unchecked exceptions?
    我不知道什么叫checked 和unchecked exception,我只知道有check exception 和runtime exception,前者必须用try catch来处理的,后者不需要,比如数组越界之类和除以0这样的异常就是runtime exception。
     
    7) What is the difference between final, finally and finalize?
    这个太普通了,要写起来也太多了,只说一下finally的时候也可以没有catch,但是必须有try
    finalize方法在对象被回收时调用,但是被调用的时候不代表一定马上就被回收,且他只会执行一次,比如说自己手动调用一次以后,等他被回收的时候也不会被执行了。

    【Java企业版】
    8) What is the difference between web server and app server?
    web server: 就是提供一个网站的,比如apache,IIS等,处理一个http 请求,将静态网页或者图片什么的发回去
    app server:可以执行程序的,比如说tomcat什么的。
    这也是我瞎掰的。。。觉得自己说的不够清楚。。
     
    9) Explain the Struts1/Struts2/MVC application architecture?
    这个要写就太多了,就是模型-视图-控制三层架构,比如Struts2中,FilterAction对应着Control,Action返回的那些result对应着视图,strut2支持的视图层就多了,比如jsp,甚至是pdf等。。。模型就对应着后来的业务逻辑吧
     
    10) What is the difference between forward and sendredirect?
    sendredirect重新开一个request

    【一般问题】
    11) How does a 3 tier application differ from a 2 tier one?
    三层模型和两层模型的区别?什么业务逻辑和展示层分离等等,有效分工,有利于后期维护等等。。。
     
    12) How does the version control process works?
    版本控制,目前有两大类吧,CVS,SVN等属于集中式的,Git属于分布式的,目前Git很火啊。
    process就是check out > update > modify > check in, 如果发现冲突那么 merge > check in.
     
    13) What is the difference between JAR and WAR files?
    jar和war都是zip格式压缩,war是web项目压缩的意思,里面有WEB-INF文件夹,下面有web.xml配置文件

    【数据库】
    14) What is a Left outer join?
    左外连接,就是将左表对应于右表中没有关联的数据也列出来,比如
    表 A
    a b
    c d
    e f
    表 B
    b 1
    d 2
    c 3
    A left outer join B的结果为:
    a b 1
    c d 2
    e f
    好久没有写SQL语句了,不记得是不是这样了。。
    15) What is the difference between UNION and UNION ALL?
    前者去除重复记录,后者不去除
  • 相关阅读:
    可伸缩的菜单
    Microsoft.AspNet.Identity: UserID用整型数据表示, 而不是GUID
    需要了解的技术
    微信公众号开发一些链接
    SQL Server Connection Strings for ASP.NET Web Applications https://msdn.microsoft.com/en-us/library/jj653752.aspx
    ASP.NET MVC 4 (三) 过滤器
    quick Cocos 2dx 学习网站
    获取SQL server 中的表和说明
    在 fragment 里面调用 findViewById
    gravity 和 layout_gravity
  • 原文地址:https://www.cnblogs.com/Cherry-B/p/3421702.html
Copyright © 2011-2022 走看看