Android面试题

来源:互联网 发布:win10软件分辨率不正常 编辑:程序博客网 时间:2024/04/28 12:25

1.Android的四大组件是哪些,它们的作用

Android中四大组件分别是Activity、Service、BroadcastReceiver和ContentProvider。
Activity是一种展示型组件,用于向用户直接地展示一个界面,并且可以接受用户的输入信息进行交互。Activity的启动由Intent触发,其中又分为显示Intent和隐示Intent。Activity组件可以具有特定的启动模式,同一个Activity组件在不同的启动模式下会有不同的效果。

Service是一种计算型组件,用于在后台执行一系列的计算任务。与Activity不同的是:Activity组件只有一种运行模式,即启动状态,但是Service有两种运行状态,启动状态和绑定状态。当Service处于启动状态,这个时候Service内部可以做一些后台计算,并且不需要和外界有直接的交互。当Service处于绑定状态时,这个时候Service内部同样可以做一些后台计算,并且外界还可以方便的和Service组件进行通信。

BroadcastReceiver是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息。BroadcastReceiver也叫广播,这种广播有两种注册方法:静态注册和动态注册。静态注册是指在AndroidManifest中注册广播,这种广播在应用安装时会被系统解析,这种形式的广播不需要应用启动就可以收到相应的广播。动态注册广播需要通过Context.registerReceiver()来实现,并且在不需要的时候通过Context.unregisterReceiver()来解除广播,此种形态的广播必须要应用启动才能注册并接收广播,因为应用不启动就无法注册广播,无法注册广播就无法收到相应的广播。

ContentProvider是一种数据共享型组件,用于向其他组件乃至其他应用共享数据。对于ContentProvider组件来说,它的内部需要实现增删改查这四种操作,在他的内部维持着一份数据集合,这个数据集合既可以通过数据库来实现,也可以采用其他任何类型来实现,比如List,Map。

2.请介绍下Android中常用的五种布局

常用五种布局方式,分别是:FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)。
1.、FrameLayout:所有东西依次都放在左上角,会重叠,这个布局比较简单,也只能放一点比较简单的东西。

2、LinearLayout:线性布局,每一个LinearLayout里面又可分为垂直布局(android:orientation=”vertical”)和水平布局(android:orientation=”horizontal” )。当垂直布局时,每一行就只有一个元素,多个元素依次垂直往下;水平布局时,只有一行,每一个元素依次向右排列。

3、AbsoluteLayout:绝对布局用X,Y坐标来指定元素的位置,这种布局方式也比较简单,但是在屏幕旋转时,往往会出问题,而且多个元素的时候,计算比较麻烦。

4、RelativeLayout:相对布局可以理解为某一个元素为参照物,来定位的布局方式。主要属性有:相对于某一个元素android:layout_below、 android:layout_toLeftOf相对于父元素的地方android:layout_alignParentLeft、android:layout_alignParentRigh;

5、TableLayout:表格布局,每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素。每一个布局都有自己适合的方式,这五个布局元素可以相互嵌套应用,做出美观的界面。

3.Android 中有哪几种解析xml的类?官方推荐哪种?以及它们的原理和区别

在Android平台上可以使用SAX(SimpleAPI for XML)、DOM(DocumentObject Model)、以及Android自带的Pull解析器解析XML文件。

SAX解析XML文件采用的是事件驱动,也就是说,他读取单向并不需要解析完整个文档,在按内容顺序解析文档的过程中,SAX会判断当前读取到的字符是否符合XML语法中的某部分,如果符合就会触发事件,其实就是一些回调方法,然后进行判断处理。优点:解析速度快,占用内存少,适用于Android等移动设备。缺点:对于嵌套多个分支来说处理不是很方便。

DOM解析XML文件时,会将XML文件的所有内容以文档树方式存放在内存中,然后使用DOM API遍历XML树,检索所需的数据,主要用于PC机。优点:使用DOM解析XML的代码比较直观,基于SAX的实现更加简单。缺点:须将XML文件所有内容存放在内存中,所以消耗内存大,不适用Android等移动设备。

Pull解析器是Android内置解析XML文件的解析器,运行方式类似于SAX解析,只是产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。Pull解析器对节点处理比较好,同样也很省内存,官方推挤使用Pull解析器解析XML文件,而且Android系统本身用到的XML文件内部也是使用Pull解析器进行解析的。

4.listview你是怎么优化的

ListView的Adapter的作用如下图所示:
这里写图片描述
Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View。想过没有? 在我们的列表有1000000项时会是什么样的?是不是会占用极大的系统资源?

先看看下面的代码:

public View getView(int position, View convertView, ViewGroup parent) {    View item =mInflater.inflate(R.layout.list_item_icon_text, null);    ((TextView)item.findViewById(R.id.text)).setText(DATA[position]);    ((ImageView) item.findViewById(R.id.icon)).setImageBitmap(    (position & 1) == 1 ? mIcon1 : mIcon2);    return item;}

怎么样?如果超过1000000项时,后果不堪设想!您可千万别这么写!

我们再来看看下面的代码:

public View getView(int position, View convertView, ViewGroup parent) {    if (convertView == null) {        convertView = mInflater.inflate(R.layout.item, null);    }    ((TextView)convertView.findViewById(R.id.text)).setText(DATA[position]);    ((ImageView)convertView.findViewById(R.id.icon)).setImageBitmap(    (position & 1) == 1 ? mIcon1 : mIcon2);    return convertView;}

怎么样,上面的代码是不是好了很多?系统将会减少创建很多View。性能得到了很大的提升。

还有没有优化的方法呢? 答案是肯定的:

public View getView(int position, View convertView, ViewGroup parent) {    ViewHolder holder;    if (convertView == null) {        convertView =mInflater.inflate(R.layout.list_item_icon_text, null);        holder = new ViewHolder();        holder.text = (TextView)convertView.findViewById(R.id.text);        holder.icon = (ImageView) convertView.findViewById(R.id.icon);        convertView.setTag(holder);    } else {        holder = (ViewHolder) convertView.getTag();    }    holder.text.setText(DATA[position]);    holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);    return convertView;}static class ViewHolder {    TextView text;    ImageView icon;}

5.Android引入广播机制的用意?

a : 从MVC的角度考虑(应用程序内)
b:程序间互通消息(例如在自己的应用程序内监听系统来电)
c:效率上(参考UDP的广播协议在局域网的方便性)
d:设计模式上(反转控制的一种应用,类似监听者模式)

6.什么是ANR 如何避免它?

在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。

如何来避免:

考虑上面的ANR定义,让我们来研究一下为什么它会在Android应用程序里发生和如何最佳构建应用程序来避免ANR。

Android应用程序通常是运行在一个单独的线程(例如,main)里。这意味着你的应用程序所做的事情如果在主线程里占用了太长的时间的话,就会引发ANR对话框,因为你的应用程序并没有给自己机会来处理输入事件或者Intent广播。

因此,运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成。然而,不是说你的主线程阻塞在那里等待子线程的完成——也不是调用Thread.wait()或是Thread.sleep()。替代的方法是,主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由于5秒输入事件的超时引发的ANR对话框。这种做法应该在其它显示UI的线程里效仿,因为它们都受相同的超时影响。

IntentReceiver执行时间的特殊限制意味着它应该做:在后台里做小的、琐碎的工作如保存设定或者注册一个Notification。和在主线程里调用的其它方法一样,应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个Service。顺便提及一句,你也应该避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广播时需要向用户展示什么,你应该使用Notification Manager来实现。

一般来说,在应用程序里,100到200ms是用户能感知阻滞的时间阈值。因此,这里有一些额外的技巧来避免ANR,并有助于让你的应用程序看起来有响应性。

如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度(ProgressBar和ProgressDialog对这种情况来说很有用)。
特别是游戏,在子线程里做移动的计算。
如果你的应用程序有一个耗时的初始化过程的话,考虑可以显示一个Splash Screen或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为应用程序被冻结了。
http://blog.csdn.net/Zengyangtech/article/details/6025671

2.Android性能优化之ListView缓存机制
http://www.2cto.com/kf/201408/329966.html
http://jingyan.baidu.com/article/e5c39bf587cb8b39d76033bf.html

3.MVC和MVP在app中的对比分析以及实际应用
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0313/2599.html
http://blog.csdn.net/lmj623565791/article/details/46596109
http://www.cnblogs.com/tiantianbyconan/p/5036289.html

4.java中Runnable和Thread的区别
http://blog.csdn.net/wwww1988600/article/details/7309070

0 0
原创粉丝点击