[ 面试题 ] 常见题

View部分

================================================

  1. Android自定义组件实现思路

帧布局(框架布局)FrameLayout,在这个布局中,所有的子元素统统放于这块区域的左上角,并且后面的子元素直接覆盖在前面的子元素之上,将前面的子元素部分和全部遮挡。
线性布局LinearLayout,最常用的一种布局方式,所有子控件的对齐方式,取决于如何定义 orientation的属性:vertical 垂直方向 ,如果按照这种方向所有的子控件将按照垂直的方式分布在布局上,每行只允许有一个子元素,horizontal水平方向 ,这时子控件将会以水平的方向分布在布局中。
绝对布局AbsoluteLayout,又可以叫做坐标布局,可以直接指定子元素的绝对位置,这种布局简单直接,直观性强,但是由于手机屏幕尺寸差别比较大,使用绝对定位的适应性会比较差。
相对布局RelativeLayout,允许子元素指定它们相对于其父元素或兄弟元素的位置,这是实际布局中最常用的布局方式之一。它灵活性大很多,当然属性也多,操作难度也大,属性之间产生冲突的的可能性也大,使用相对布局时要多做些测试。
表格布局TableLayout,表格布局TableLayout以行列的形式管理子元素,每一行是一个TableRow布局对象,当然也可以是普通的View对象,TableRow里每放一个元素就是一列,总列数由列数最多的那一行决定。
网格布局 GridLayout,在Android 4.0中,新引入的GridLayout网格布局,GridLayout布局使用虚细线将布局划分为行,列和单元格,也支持一个控件在行,列上都有交错排列。而GridLayout使用的其实是跟LinearLayout类似的API,只不过是修改了一下相关的标签而已,所以对于开发者来说,掌握GridLayout还是很容易的事情。

  • UI中padding和margin的区别

Padding 用来指定组件内的内容距离组件边界的距离;
Margin用来指定控件与控件之间的距离

  • 哪个组件可以实现手风琴效果,用来实现设置界面的类,实现抽屉效果, 悬浮窗口?

答:实现手风琴效果(ExpandableListView)
设置界面的类(preferenceActivity)保存到sharedpreference中
抽屉效果(slidingDrawer)组件
悬浮窗口: PopWindow,可以实现类似Dialog和菜单的效果

  • gravity与layout_gravity的区别

Gravity用来指定组件内的内容相对于组件本身的位置
Layout_gravity用来指定组件相对于其父组件的位置

  • 如何自定义一个Adapter

继承自BaseAdapter实现里面的方法,listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度,然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必 须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的 布局。我们用LayoutInflater的方法将定义好的main.xml文件提取成View实例用来显示。然后 将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定 义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得 要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面 首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那 再绘制下一行,直到绘完为止。在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了

  • ViewFlipper和ViewPager的区别

1.ViewFilpper类继承于ViewAnimator类。而ViewAnimator类继承于FrameLayout。
查看ViewAnimator类的源码可以看出此类的作用主要是为其中的View切换提供动画效果。该类有如下几个和动画相关的方法。
2.ViewPager用于实现多页面的切换效果,该类存在于Google的兼容包里面,所以在引用时记得在BuilldPath中加入“android-support-v4.jar”

  • View更新页面的五种方式

Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable,long);
View.postInvalidate();
View.Invalidate();
在需要刷新的地方调用handle的sendMessage来发送消息,然后在handle的getMessage里执行 invaliate 或 postinvaliate

  • 如何根据权重实现布局

//权重和父容器orientation有关
horizontal 指水平方向权重 android:layout_width
vertical 指垂直方向权重 android:layout_height
Layout_weight是线性布局,也就是LinearLayout里面用到的
在layout_width设置为fill_parent的时候,layout_weight代表的是你的控件要优先尽可能的大,但尽可能大是有限度的,即fill_parent.
在layout_width设置为wrap_content的时候,layout_weight代表的是你的控件要优先尽可能的小,但这个小是有限度的,即wrap_content.

  • 如何实现ViewPager

先在布局文件中调用v4包下的ViewPager,在java代码中初始化ViewPager,并设置adapter(继承PagerAdapter),再设置监听onPageChangeListener

  • SurfaceView实现的原理

SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面。由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独立的线程中进行行绘制。又由于不占用主线程资源,SurfaceView一方面可以实现复杂而高效的UI,另一方面又不会导致用户输入得不到及时响应

  • PathImage是什么

.9.PNG是安卓开发里面的一种特殊的图片,这种格式的图片通过ADT自带的编辑工具生成,使用九宫格切分的方法,使图片支持在android 环境下的自适应展示。

就是异步下载图片的时候把图片添加到scrollview中,
你需要几列就在scrollview中放置几个linearlayout,在scrollview滑动的的时候动态的测量linearlayout随机生成linearlayout的高度

音视频

================================================

  1. 简述音乐播放的方式与区别?

1):MediaPlayer:主要用于播放音频,可以播放视频,但是一般不用其进行视频播放。
2):SoundPool: 主要用于播放一些短促的声音片段,主要优势是cpu资源占有量低,反应延迟小。

  • 播放视频的实现方式

1)使用系统自带的播放器来播放,指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型。
//调用系统自带的播放器
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, “video/mp4”);
startActivity(intent);
2)使用VideoView组件来播放, 可以结合MediaController来实现播控, 只是不能随意更改视频的大小及位置。
3)使用MediaPlayer和SurfaceView来实现,这种方式很灵活,可以自定义视频播放的大小和位置。

其他

================================================

  1. 工作中如何利用线程池的?

Java通过Executors提供四种线程池,分别为:
1)newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
2)newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3)newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
4)newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

1.throw则是指抛出的一个具体的异常类型。
2.通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。
3.throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;
throw则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后在将包装后的异常信息抛出。
如果在方法中会有异常被抛出而你又不希望在这个方法体内对此异常进行处理,可以使用throws在声明方法的时候同时声明他可能会跑出的异常。
4.两者位置不同.

  • 如何将SQLite数据库(dictionary.db文件)与apk文件一起发布?

解答:可以将dictionary.db文件复制到Eclipse Android工程中的res aw目录中。所有在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将dictionary.db文件复制到res aw目录中

  • 通过Intent传递一些二进制数据的方法有哪些?

A.使用Serializable接口实现序列化,这是java常用的方法
B.实现Parcelable接口,这里Andriod的部分分类比如Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见

  • 如何把一个字符串转换成URI?

uri uri=uri.parse("content://com.changcheng.provider.contactprovider/contact")

  • SIM卡的EF文件有何作用?

    SIM卡的文件系统有自己的规范,主要是为了和手机通讯,SIM本身可以有自己的操作系

  • Android中项目升级注意的问题

在清单文件里面的android:versionCode和android:versionName有版本文件, 客户端同时存储该应用当前版本号 (SharedPreferences/Sqlite), 每次打开应用,去检测服务器版本号与本地版本号是否一致,如果不一 致,则自定义对话框提示是否下载更新

  • 如何实现消息推送,有哪些方式,各自优缺点,最常使用哪种?

答:实现消息推送的方式有五种,分别是轮询,SMS,C2DM,MQTT,XMPP最常使用的是XMPP, 我们做项目时采用的是XMPP协议
1.XMPP协议,它是一种基于XML的传递协议,具有很强的灵活性和可扩展性。它的特点是将复杂性从客户端转移到了服务器端。GTalk、QQ、IM等都用这个协议。
2.轮询:客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送, 而是去服务端拽数据。但是实现简单,主要缺点:耗电,浪费用户流量等
3.Google的C2DM,具体不细说,缺点,服务器在国外,不是很稳定。
4.通过短信方式, 但是很难找到免费短信平台
5.MQTT协议, IBM提供的一种推送服务,不太灵活

  • 如何控制耗电量

【在以下情况下耗电比较多:】
1、 大数据量的传输。
2、 不停的在网络间切换。
3、 解析大量的文本数据。
【控制耗电量:】
1、 在需要网络连接的程序中,首先检查网络连接是否正常,如果没有网络连接,那么就不需要执行相应的程序。
2、 使用效率高的数据格式和解析方法。(fastJson,LoganSquare-master)
3、使用GZIP压缩方式下载数据,能减少网络流量
4、 其它一些优化方法:A. 回收java对象,特别是较大的java对像; B.对定位要求不是太高的话尽量不要使用GPS定位,可能使用wifi和移动网络cell定位即可,GPS定位消耗的电量远远高于移动网络定位; C.尽量不要使用浮点运算; D.获取屏幕尺寸等信息可以使用缓存技术,不需要进行多次请求。

  • Gps定位和网络定位的区别

GPS定位需设置权限android.permission.ACCESS_LOCATION_FINE
网络定位需设置权限android.permission.ACCESS_LOCATION_COARSE
即GPS定位比网络定位在精确度方面更精准,但在速度方面稍差一些,而且GPS定位适合在室外环境下使用,网络定位在室内,室外都可以。

  • 安卓的系统架构

详细链接
应用层:使用Java语言进行开发的一些应用程序
应用框架层:主要是谷歌发布的一些操作支持的类库(API框架),开发人员可以使用这些类库方便的进行程序开发,但是在开发时必须遵守框架的开发原则
系统运行库层:当使用安卓框架层进行开发时,安卓操作系统会自动使用一些c/c++的库文件来支持所使用的各个组件,使其可以更好的为程序服务;
Linux内核层:安卓操作系统主要是基于Linux内核,程序的安全性,驱动程序,进程管理等都由Linux内核提供。

  • 安卓上安装了多个浏览器,能否指定页面访问;

通过直接发送URI把参数带过去,或者通过Manifest里的intentfilter的data属性

  • Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念?

DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。

  • 根据自己的理解描述下Android数字签名。

(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
(3)如果要正式发布一个Android程序,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。
(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。

答: 客户端缓存机制是android应用开发中非常重要的一项工作,使用缓存机制不仅仅可以为用户节省3G流量,同时在用户体验方面也是非常好的选择,比如有些新闻客户端支持离线模式,也是通过缓存机制实现的.缓存机制分为两部分,一部分是文字缓存,另一部分是多媒体文件缓存.
文字缓存有两种实现:
1)可以将与服务器交互得到的json数据或者xml数据存入sd卡中,并在数据库添加该数据的记录.添加数据库记录时,提供两个关键字段,一个是请求的URL,另一个则是本地保存后的文件地址,每次加载数据之前都会根据URL在数据库中检索
2)将JSON数据解析后装入List<Map>对象中,然后遍历List,将数据统统写入相应的数据库表结构中,以后每次向服务器发起请求之前可以先在数据库中检索,如果有直接返回.
多媒体文件缓存:主要指图片缓存
图片的缓存可以根据当前日期,时间为名字缓存到SD卡中的指定图片缓存目录,同时数据库中做相应记录,记录办法可以采用两个关键字段控制,一个字段是该图片的URL地址,另一个字段是该图片的本机地址.取图片时根据URL在数据中检索,如果没有则连接服务器下载,下载之后再服务器中作出相应记录
缓存文件删除策略:
1.每一个模块在每次客户端自动或者用户手动更新的时候删除相应模块的缓存文件,并重新下载新的缓存文件.
2.在设置界面中提供删除缓存的功能,点击后删除本机所有缓存.

  • Ddms和Traceview的区别

DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器

  • 程序之间的亲和性的理解

1.默认情况下一个应用的所有Activity都是具有相同的affinity,都是从application中继承,application的affinity默认就是manifest的包名。
2.affinity对Activity来说,就像是身份证一样,可以告诉所在的Task,自己属于其中的一员。
3.应用场合:
a:根据affinity重新为Activity选择合适的宿主Task;
b:与allowTaskReparenting属性配合;
c:启动Activity使用Intent设置了FLAG_ACTIVITY_NEW_TASK标记。

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节.
简单来说,就是一套可供调用的系统接口.

  • Android项目的目录结构

1)src目录:src(即SourceCode),src目录用来存放应用程序中所有的源代码,代码的源文件一般存放在该目录下的相应的包下。
2)gen目录:gen目录,该目录下一般只有一个文件,即R文件。该文件夹下面有个R.java文件,R.java是在建立项目时自动生成的,定义该项目所有资源的索引。
3)Android4.1目录:该文件夹下包含android.jar文件,这是一个Java归档文件,其中包含构建应用程序所需的所有的AndroidSDK库(如Views、Controls)和APIs。
通过android.jar将自己的应用程序绑定到AndroidSDK和AndroidEmulator,这允许你使用所有Android的库和包,且使你的应用程序在适当的环境中调试。
4)assets目录:该目录存放应用程序中使用的外部资源文件,如声音视频等,在Android程序中可以通过输入/输出流对该目录中的文件进行读写。
5)res目录:该目录用来存放程序这用到的图片、界面布局文件及XML格式的描述文件。该目录下有多个目录。新建一Android项目,在res目录下一般会有drawable,layout,valuse三个目录。drawable用来存放图片资源,目录下一般会有三个目录分别存放高中低三种不同分辨率的图片,layout目录用来存放应用程序的界面布局文件,values目录下存放字符串资源,颜色资源,数组资源等XML文件。
6)AndroidManifest.xml

  • Manifest中放什么东西

AndroidManifest.xml是每个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities,services,等等),他们各自的实现类,各种能被处理的数据和启动位置。除了能声明程序中的Activities,ContentProviders,Services,和IntentReceivers,还能指定permissions和instrumentation(安全控制和测试),四大组件,意图,权限,第三方key,版本号等

  • Application类的作用

Application和Actovotu,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如果需要创建自己 的Application,也很简单创建一个类继承 Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的 Application的名字定入即可)。
android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局 的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些,数据传递,数据共享 等,数据缓存等操作。

  • Activity中 this、getApplicationContext和getActivity的区别

this:代表当前,在Activity当中就是代表当前的Activity,换句话说就是Activity.this在Activity当中可以缩写为this.
getActivity()指的是在fragment当中调用得到他所在的Activity
getApplicationContext():生命周期是整个应用,应用摧毁,它才摧毁。

  • asset和res的区别

答:res/raw和assets的相同点:
两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
res/raw和assets的不同点:
1)res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即 R.raw.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
2)res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹
3)读取文件资源举例:
读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作
InputStream is = getResources().openRawResource(R.raw.filename);
读取assets下的文件资源,通过以下方式获取输入流来进行写操作

AssetManager am = null; 
am = getAssets(); 
InputStream is = am.open("filename");
  • webservice的UDDI是什么

UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。UDDI,英文为 “Universal Description, Discovery and Integration”,可译为“通用描述、发现与集成服务”。

  • 程序运行的权限和文件系统权限的区别

运行时权限 Dalvik( android 授权) 文件系统 linux 内核授权

  • 对android系统的理解

5大优势:
一、 开放性
二、 挣脱运营商的束缚
三、 丰富的硬件选择
四、 不受任何限制的开发商
五、 无缝结合的Google应用
Android的5大不足
一、 安全和隐私
二、 首先开卖Android手机的不是最大运营商
三、 运营商仍然能够影响到Android手机
四、 同类机型用户减少
五、 过分依赖开发商缺少标准配置

  • 手机上使用的传感器有什么

define SENSOR_TYPE_ACCELEROMETER 1 //加速度
define SENSOR_TYPE_MAGNETIC_FIELD 2 //磁力
define SENSOR_TYPE_ORIENTATION 3 //方向
define SENSOR_TYPE_GYROSCOPE 4 //陀螺仪
define SENSOR_TYPE_LIGHT 5 //光线感应
define SENSOR_TYPE_PRESSURE 6 //压力
define SENSOR_TYPE_TEMPERATURE 7 //温度
define SENSOR_TYPE_PROXIMITY 8 //接近
define SENSOR_TYPE_GRAVITY 9 //重力
define SENSOR_TYPE_LINEAR_ACCELERATION 10//线性加速度
define SENSOR_TYPE_ROTATION_VECTOR 11//旋转矢量

================================================
【ListView相关解析和面试题】
【关于Android四大组件的相关面试题】
【自定义View全解】
【View事件分发】
【自动登录的实现】
更多内容请关注 我的专题
转载请注明 原文链接:
http://www.jianshu.com/users/c1b4a5542220/latest_articles

点赞