1. 请介绍下android大众常用的五种布局。
FrameLayout(框架布局):只可以有一个控件,并且不能设计这个控件的位置,控件会放在左上角。
LinearLayout(线性布局):一行只能控制一个控件的线性布局,所以当有很多控件需要在一个界面中列出时,可以用 LinearLayout布局。
AbsoluteLayout(绝对布局):可以放置多个控件,并且可以自己定义控件的x,y的位置。
RelativeLayout(相对布局):比如要在一行上显示多个控件,这时就要用到相对布局。
TableLayout(表格布局):将子元素的位置分配到行或列中,一个TableLayout由许多的TableRow组成。
2. Android中4大组件有哪些?他们的作用是什么?
Activity: Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的 事情,妥善管理生命周期以及一些跳转逻辑。
service: 后台服务于Activity, 封装有一个完整的功能逻辑实现,接受上层指令,完成相关的事务,定义好需要接受的Intent提 供同步和异步的接口。
Content Provider: 是Android提 供的第三方应用数据的访问方案,可以派生Content Provider类,对外提供数据,可以像数据库一样进行选择排 序,屏蔽内部数据的存储细节,向外提供统一的接口模型,大大简化上层应用,对数据的整合提 供了更方便的途径。
BroadCast Receiver: 接受一种或者多种Intent作 触发事件,接受相关消息,做一些简单处理,转换成一条Notification, 统一了Android的 事件广播模型。
3. 请解释下在单线程模式中Message,Handler,MessageQueue,Looper之间的关系解释下.
Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message, 再有Handler进行Message的分发和处理.
Message Queue(消息队列): 用来 存放通过Handler发 布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得 到当前线程的消息队列.
Handler: 可以发布或者处理一个消息或者操作一个Runnable,通过Handler发 布消息,消息将只会发送到与它关联的消息队列,然也只能处理该消息队列中的消息.
Looper: 是Handler和消息队列之间通讯桥梁,程序组件首先通过Handler把消息传递给Looper,Looper把 消息放入队列。 Looper也把消息队列里的消息广播给所有的Handler:Handler接 受到消息后调用handleMessage进 行处理.
4. 横竖屏切换时activity的生命周期
(1)不设置Activity的 android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行 两次。
(2)设置Activity的 android:configChanges=”orientation”时,切横,竖屏时生命周期只会执行一次。
(3)设置Activity的 android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用声明周 期,只会执行onConfigurationChanged方法。
5. Android 中的动画有哪几类,他们的特点和区别是什么?
有两种,特点:
一种是Tween动画(补间动画)。Tween动画:使试图组件移动,放大,缩小以及产生透明度的变化。
一种是Frame动画(逐帧动画)。 Frame动画:传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
区别:
补间动画的所有操作是通过矩阵变换对同一个物体(绘制的一个view或者图片)进行操作产生动画。
而逐帧动画是多个物体(多张图片)进行绘制,可以说这多张图片是不相关的(从播放的角度来看只能说是内容相关)。
6. 如何将一个Activity设置成窗口样式。
在AndroidManifest.xml中Activity定义处添加:
android:theme=”@android:style/Theme.Dialog”
或android:theme=”@android:style/Theme.Translucent” (半透明的)。
7. 说说mvc模式的原理,它在android中的运用
答:android的官方建议应用程序的开发采用mvc模 式。何谓mvc?
mvc是model,view,controller的 缩写,mvc包 含三个部分:
<1>模型(model) 对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
<2>视图(view) 对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架 构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
<3>控制器(control) 对象:是根据用户的输入,控制用户界面数据显示及更新model对 象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给m哦得了 处理。
在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里面处理,当然对业务计算等操作也是必须放在的该层的。
8. 请描述下Activity的生命周期.
onCreate(Bundle savedInstanceState):创建activity时调用。设置在该方法中,还以Bundle的形式提供对以前储存的任何状态的访问!
onStart():activity变 为在屏幕上对用户可见时调用。
onResume():activity开 始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。
onPause():activity被暂停或收回cpu和其他 资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!
onStop():activity被 停止并转为不可见阶段及后续的生命周期事件时调用。
onRestart():重新启动activity时 调用。该活动仍在栈中,而不是启动新的活 动。
OnDestroy():activity被完全从系统内存中移除时调用该方法。
9. 从操作系统角度请阐述一下线程与进程的区别
答:进程是系统进行资源分配和调度的一个独立单位,线程是CPU调度和分派的基本单位。
进程和线程的关系:
(1)一个线程 只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配 给进程,同一进程的所有线程共享该进程的所有资源。
(3)线程在执 行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
(4)线程是指 进程内的一个执行单元,也是进程内的可调度实体。
线程与进程的区别:
(1)调度:线 程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
(2)并发性: 不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行。
(3)拥有资 源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
(4) 系统开销:在创建或撤销进程的时候,由于系统都要为之分配和回收资源,导致系统的明显大于创建或撤销线程时的开销。但进程有独立的地 址空间,进程崩溃后, 在保护模式下不会对其他的进程产生影响,而线程只是一个进程中的不同的执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的 地址空间,一个线程死 掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但是在进程切换时,耗费的资源较大,效率要差些。
10. Android的数据存储的方式?
Android提 供了5种方式存储数据:
(1)使用SharedPreferences存 储数据;它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将 数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用。
(2)文件 存储数据;文件存储方式是一种较常用的方法,在Android中 读取/写 入文件的方法,与Java中 实现I/O的 程序是完全一样的,提供了openFileInput()和openFileOutput()方 法来读取设备上的文件。
(3)SQLite数 据库存储数据;SQLite是Android所 带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。
(4)使用ContentProvider存 储数据;主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。
(5)网络 存储数据;通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在 网络空间中的数据信息。
11. 注册广播有几种方式,这些方式有何特点?
(1)动态代码注册不是常驻型广播,也就是说广播跟随程序的生命 周期。
(2)清单文件注册是常驻型,也就是说当应用程序关闭后,如果有 信息广播来,程序也会被系统调 用自动运行。
12. 谈谈对android内存优化的方法,方案,规则及对内存泄漏如何避免?
OOM即Out Of Memory,一般是由程序编写者对内存使用不当,如对该释放的内存资源没有释放,导致其一直不能被再次使用而使 内存被耗尽的现象。根本的解决办法是对代码进行优化:在内存引用 上做些处理,使用软引用、虚引用、和弱引用;在内存中加载图片时直接在内存中做处理,如边界压缩等;建立动态回收内存机制;优化Dalvik虚 拟机的堆内存分配;自定义堆内存大小等。
一般而言,android中 常见的原因主要有以下几个:
1. 数据库的cursor没有关闭。
2. 构造adapter没有使用缓存contentview。
3. 调用registerReceiver()后未调用unregisterReceiver()。
4. 未关闭InputStream/OutputStream。
5. Bitmap使用后未调用recycle()。
6. Context泄漏。
7. static关键字等。
13. Android中什么是ANR,如何应对或者如何避免它?
ANR 就 是application not responding。 在android中Activity的 最长执行时间是5秒、BroadcastReceiver的最长执行时间则是10秒、超出执行时间就会产生ANR。
解决方法:
(1). 运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应 该在它的关键生命周期方法 (如onCreate()和onResume()) 里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message 的方式做一些操作,比如更新主线程中的ui等)
(2). 应用程序应该避免在BroadcastReceiver里 做耗时的操作或计算。但不再是在子线程里做这些任务(因为 BroadcastReceiver的 生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。
14. AIDL 的全称是什么?如何工作?能处理哪些类型的数据?
AIDL: (Android Interface Definition Language)跨进程通信传输语言。
如何工作:
AIDL文 件由自己定义,在被绑定的Service中和绑定的客户端中都要部署。
(1)、创建AIDL文件, 在这个 文件里面定义接口, 该接口定义了可供客户端访问的方法和属性。
(2)、编译AIDL文件, 用Ant的话, 可能需 要手 动, 使 用Eclipse plugin的话,可以根据adil文件 自动生产java文 件并编译, 不 需要人为介入.
(3)、在Java文件 中, 实 现 AIDL中 定义的接口。编 译器会根据AIDL接 口, 产 生一个JAVA接 口。这个接口有一个名为Stub的内部抽象类,它继承扩展 了 接口并实现了远程调 用需要的几个方法(是Binder的 子类)。 接下来就需要自己去实现自定义的几个接口了。
(4)、第一个程序的Service:因 为跨进程传递时利用Binder对 象来实现的,所 以我们要在Service端 构建Binder对 象,又 因为我们定义的接口AIDL文 件在编译转成.java时 的内部类Sub实 现了Binder,所 以我们构建Binder对 象时构建实例内部类直接继承Sub内部类,在类中我们 可以调用Service中 的方法,此 类的对象也就是Binder对 象.
(5)、第二个程序的Activity:在Activity中 我们利用bindService方 法启动一个绑定的Service的 同时需要传入连接对象,所 以我们先在Activity中 构建Service的 连接对象, 在 该对象的匿名内部类中重写获得Binder对象的方法, 参数含 有Binder对 象,将 此对象强制转换成我们在Service中继承Sub的类的 对象, 强 转后我们可以利用该对象调用Service中的方法,从而实现跨 进程通信,控 制Service.
15. 怎么优化listview?
<1>如果自定义适配器,那么在getView方 法中要考虑方法传进来的参数contentView是否为null,如果为null就创 建contentView并返回,如果不为null则直接使用。在这个方法中尽可能少创建view。
<2>给contentView设 置tag(setTag()), 传入一个viewHolder对象,用于缓存要显示的数据,可以达到图像数据 异步加载的效果。
<3>如果listview需 要显示的item很多,就要考虑分页加载。比如一共要显示100条或者更多的时候,我们可以考虑先加载20条, 等用户拉到列表底部的时候再去加载接下来的20条。
<4>设置listview的 监听器,如果listview是飞快滑动状态则不更新view。
<5>使用RecyclerView代替ListView。
16. View、surfaceView、GLSurfaceView有什么区别?
View: 显示视图,内置画布,提供图形绘制函数、触屏事 件、按键事件函数等,必须在UI主线程内更新画面,速度较慢
SurfaceView: 基于view视 图进行拓展的视图类,更适合2D游戏的开发,是view的 子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快
GLSurfaceView: 基于SurfaceView视 图再次进行拓展的视图类,专用于3D游戏开发的视图,是surfaceView的 子类。
17. 曾经用到的Android手机访问服务端的方式有哪些?
Android手机访问服务端的方式有两种,分别是:通过socket访 问和通过Http协 议发送Post和Get请求。
<1> Socket是长连接,服务端和客户端之间通过Socket建 立连接,首先ServerSocket将 在服务端监听某个端口,当发现客户端有Socket来试图连接它时,它会接受该Socket的 连接请求,同时在服务端建立一个对应的Socket与之进行通信。这样就有两个Socket了, 客户端和服务端各一个。
<2> 发送get和post请 求,通过HTTP协 议建立短连接。客户端发送请求(Request),服务器端收到后根据请求的类型返回相应的响应(response)。
18. 什么是TCP和IP,它们位于网络模型的哪层?
TCP是传输控制协议,IP是internet协 议,TCP在 网络模型中与UDP一 样同属于第二层(传输层),IP属 于三层(网络层),IP用 于确定主机在网络中的位置,而TCP与UDP用于标示不同的服务,即应用程序。
19. Xml和json的区别
<1>.可读性: JSON和XML的 可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负。
<2>. 可扩展性: XML天生有很好的扩展性,JSON当然也有,没有什么是XML能 扩展,JSON不 能的。
<3>. 编码难度: XML有 丰富的编码工具,比如Dom4j、JDom等,JSON也 有json.org提 供的工具,但是JSON的编码明显比XML容 易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就 不太容易了。
<4>.解码难度: XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。
<5>. 流行度: XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。
20. SAX 、DOM4J 、PULL解析的区别
Sax特点:
- 解析效率高,占用内存少
2.可以随时停止解析
3.不能载入整个文档到内存
4.不能写入xml
5.SAX解析xml文 件采用的是事件驱动
pull与sax的不同之处:
1.pull读取xml文 件后触发相应的事件调用方法返回的是数字。
2.pull可以在程序中控制,想解析到哪里就可以停止到哪里
3.Android中更推荐使用pull解 析
DOM的特点:
优点
1.整个文档树在内存中,便于操作;支持删除、修改、 重新排列等多种功能
2.通过树形结构存取xml文 档
3.可以在树的某个节点上向前或向后移动
缺点
1.将整个文档调入内存(包括无用的节点),浪费时间 和空间
适用场合
一旦解析了文档还需多次访问这些数据;硬件资源充 足(内存,cpu)
21. 简述String和StringBuffer、ArrayList和LinkedList、HashMap和HashTable的特点及区别。
(1)String对象的长度一旦定义就固定就不可以改变,对于已经存在的String对象的修改都是创建一个新的对象,然后把新的值存 进去,String类不能被继承。StringBuffer是一个可变对象,当对它进行修改的时候不会像String那样重新建立对象。它只能通过构造函数来建立对象。另外StringBuffer还是一个线程安全的类。
(2)ArrayList是实现了基于动态数组的数据结构用于,LinkedList基于连表的数据结构,二者都可以存储对象的引用。对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
(3)HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,在只有一个线程访问的情况下,效 率要高于Hashtable。HashMap允许将null作 为一个entry的key或 者value,而Hashtable不 允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。Hashtable继承自Dictionary类, 而HashMap是Java1.2引 进的Map interface的一个实现。最大的不同是,Hashtable的方法是Synchronize(线 程安全或者同步的)的,而HashMap不是,在多 个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。Hashtable和HashMap采 用的hash/rehash算法都大概一样,所以性能不会有很大的差 异。
22. Android系统的架构,采 用了分层的架构,从高层到底层分别是:
(1)Android系统架构之应用程序:Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短 消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语 言编写的。
(2)Android系统架构之应用程序框架:开发人员可以完全访问核心应用程序所使用的API框架(android.jar)。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可 以使用其所发布的功能块。
(3)Android系统架构之系统运行库:Android 包含一些C/C++库, 这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。
(4) Android系统架构之Linux 内核:Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。
23. Java基础题: 描述一下java的事件委托机制、垃圾回收机制、Java反射机制
Java事件委托机制: 一个源产生一个事件时,把他送到一个或多个监听器那里,在这种机制中,监听器只是等待,一旦收到事件,处理事件并返回;
Java垃圾回收: 是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用,以免造成内存泄露。
Java反射机制: 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法和属性。