android面试专题(8)

1.横竖屏切换:configchanges可设置三种值,不设置时,横切竖生命周期走两次,竖切横走1次。
Configchanges=“orientation”横竖屏方法都走一次。横切竖执行一次onConfigChanged方法
Configchanges=“oritation||keyboardhidden”横竖屏方法都走一次。横切竖执行两次onConfigChanged方法,竖切横执行一次。

启动模式:4种。
Standard(标准):activity实例一定创建,具体就是onCreate一定会执行。
SingleTop(单顶):任务栈中,顶部相同不走onCreate方法,适用于刷新页面的
SingleTask(单任务):一个任务栈中,只有一个任务,onCreate只走一次,如果想再次调回该页面,把任务栈上的其他页面实例全部弹出。
SingleInstance(单实例):类似于共享,在其他任务栈中,onCreate方法只走一次。

2.Intent六大属性:
Action:唯一标识该intent的动作,我们可以使用他来进行隐式跳转。
Category:进一步的过滤,它代表种类。
Extra:我们通常用它来存储一些数据。
Data:里面都是URI,通常为了满足一些跳转后数据的需求
Flag:标记,用来标记属于哪个任务栈(再开机启动广播中用过)
Component Name:组件名,标识这个intent属于哪个组件,不常用。

Android六大布局:
LinearLayout:线性布局:按照水平或者垂直的排布方式,进行组件的显示,其中主要用两个特殊的属性:weight和layout_gravity。
RelativeLayout:相对布局:通常需要参照物标识位置,适合在父类viewgroup中进行居中,居左等位置显示方便。
FrameLayout:帧布局:适合布局的层叠显示。
TableLayout:表格布局:继承自linearlayout,适合比较规范的数据。是有tablerow决定一行的显示内容。
AbsoluteLayout:绝对布局:用像素标识控件的位置。
GridLayout:网格布局:4.0以后新布局属性。 详见计算器。

GridLayout和TableLayout之间的区别:
TableLayout继承自LinearLayout,特点:只能在一个方向做控件的对齐,不能同时向水平和垂直方向做空间的对齐。不能跨行跨列:TableLayout不明确指定包含多少行,多少列,而是通过向TableRow里面添加其他组件,每添加一个组件该表格就增加一列。如果向TableLayout里面添加组件,该组件就直接占用一行。
GridLayout的单元格可以跨越多行,用columnCount设置列数后,增加的控件在超过列数后自动换行进行排列,比如键盘布局,计算器布局。

3.Padding和Margin的区别:
Padding 控件内部内容距离控件边界的距离,或者该布局的边界与布局内容的距离(内边距)
Margin 控件与外部控件的距离,控件与其所在布局边界的距离(外边距)
4.Gravity与Layout_Gravity的区别:
Gravity指布局或者控件内的内容相对于布局或控件本身的位置
Layout_gravity用来控件或布局相对于其父布局的位置

5.ScrollView中嵌套ListView会不会出现问题?
出现2个问题:
1.里面的ListView高度无法计算出来,通常只能显示ListView的其中一行
2.ListView不能滚动。
提供几种解决方案的思路:
1 根据ListView的Item重置ListView的高度,Item的布局文件必须是LinearLayout,不能是其它的。但是这样ListView就不需要滚动了,因为ListView的高度已经达到最大,不需要滚动。ListView的优点就是能够复用convertView,如果把ListView撑到最大,等于没有复用。(没有意义)
2.自定义ListView,重写onMeasure方法(不会玩)
3.ScrollView有一个方法,requestDisallowInterceptTouchEvent(boolean),这个方法是设置是否交出onTouch权限,如果让外层的scrollView.requestDisallowInterceptTouchEvent(false),那么外层的onTouch权限会失去,这样里面的listView就能拿到onTouch权限了,listView也就能滚了。当手指触到ListView的时候,让外面的ScrollView交出权限,当手指松开后,外面的scrollView重新获得权限。用这种方法最好给ListView和高度一个固定值,但是不能超出总高度。

7.处理OOM的问题。
这里通常都是因为吃内存大户Bitmap导致的
1尽量不要使用setImageBitmap或setImageResource或
BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存,可以通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source
2 使用BitmapFactory.Options对图片进行压缩
InputStreamis=this.getResources().openRawResource(R.drawable.pic1); BitmapFactory.Optionsoptions=newBitmapFactory.Options(); options.inJustDecodeBounds = false;options.inSampleSize = 10; //width,hight设为原来的十分一 Bitmap btp =BitmapFactory.decodeStream(is,null,options); 3 运用Java软引用,进行图片缓存,将需要经常加载的图片放进缓存里,避免反复加载,及时销毁不再使用的Bitmap对象
4 咱们自己使用LruCache写的ImageLoader
5 借助三方框架,picasso,xUtils中的bitmapUtils,volley

8.三级缓存:
实现分别是以内存–文件–网络的缓存模式,使用主要在图片上,当获取的时候我们首先在内存上进行查找,主要通过lrucache进行键值对的获取bitmap加载,如果内存上没有我们访问本地的文件(本应用绑定的cache文件)如果有先加载到内存中,放入lrucache,然后进行加载,如果本地和内存都没有我们访问网络获取到图片,先存入文件,再存入内存进行显示。

9.内存泄露和内存溢出的区别:
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如:我要存储一个long型的,用int型来收。就造成了内存溢出。如加载一张很大的bitmap。

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。Cursor没有及时关闭。通常都是大资源没有关闭。

10.Listview的优化:
1.对convertView进行判空,是当convertView不为空的时候直接重新使用convertView从而减少了很多不必要的View的创建,减少了内存的消耗
2.定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可,这样不用每次都要findviewbyid了。
3.当ListView加载数据量较大时可以采用分页加载
4.listview中进行图片异步加载
11.Cursor的安全性:
http://blog.sina.com.cn/s/blog_618199e60101fskp.html
http://blog.csdn.net/oney139/article/details/8279364
Activity.startManagingCursor方法:
将获得的Cursor对象交与Activity管理,这样Cursor对象的生命周期便能与当前的Activity自动同步,省去了自己对Cursor的管理。
1.这个方法使用的前提是:游标结果集里有很多的数据记录。
所以,在使用之前,先对Cursor是否为null进行判断,如果Cursor != null,再使用此方法
2.如果使用这个方法,最后也要用stopManagingCursor()来把它停止掉,以免出现错误。
3.使用这个方法的目的是把获取的Cursor对象交给Activity管理,这样Cursor的生命周期便能和Activity自动同步,省去自己手动管理。
有一种情况下,我们不能直接将Cursor关闭掉,这就是在CursorAdapter中应用的情况,但是注意,CursorAdapter在Acivity结束时并没有自动的将Cursor关闭掉,因此,你需要在onDestroy函数中,手动关闭。
12.Android的性能优化:
http://blog.csdn.net/hewence1/article/details/39004301
http://bbs.gfan.com/android-8002522-1-1.html
http://www.linuxidc.com/Linux/2013-07/87359.htm
本文主要通过如下的5R方法来对ANDROID内存进行优化:

1.Reckon(计算)
首先需要知道你的app所消耗内存的情况,知己知彼才能百战不殆
通过ActivityManager获取当前所占内存,缓存等了解所消耗内存
2.Reduce(减少)
消耗更少的资源
如:Bitmap压缩,修改对象引用类型(从强引用->软引用和弱引用),能减少创建对象就减少,能局部就局部。
3.Reuse(重用)
当第一次使用完以后,尽量给其他的使用
如:图片的缓存,AdapterView中的自定义View,池的概念,如线程池等
5.Recycle(回收)
返回资源给生产流
如流的回收,Cursor的回收,GC垃圾回收机制
4.Review(检查)
回顾检查你的程序,看看设计或代码有什么不合理的地方
代码的检查,设计的检查,以及视图层级的检查
13.IPC通信:
IPC(Inter-Process Communication,进程间通信),四大组件都可以完成进程间通信,但是IPC我们通常是说不同进程的服务和页面的交互,其中AIDL是 Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口.编译器可以通过扩展名为aidl的文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的.

14.Handler机制:
1、是使用sendMessage():通过Handler将消息发送给消息队列
2、在发送消息的时候,使用message.target=this为handler发送的message贴上当前handler的标签
3、开启HandlerThread线程,执行run方法。
4、在HandlerThread类的run方法中开启轮询器进行轮询:调用Looper.loop()方法进行轮询消息队列的消息
5、在消息队列MessageQueue中enqueueMessage(Message msg, long when)方法里,对消息进行入列,即依据传入的时间进行消息入列(排队)
6、轮询消息:与此同时,Looper在不断的轮询消息队列
7、在Looper.loop()方法中,获取到MessageQueue对象后,从中取出消息(Message msg = queue.next()),如果没有消息会堵塞
8、分发消息:从消息队列中取出消息后,调用msg.target.dispatchMessage(msg);进行分发消息
9、将处理好的消息分发给指定的handler处理,即调用了handler的dispatchMessage(msg)方法进行分发消息。
10、在创建handler时,复写的handleMessage方法中进行消息的处理
11、回收消息:在消息使用完毕后,在Looper.loop()方法中调用msg.recycle(),将消息进行回收,即将消息的所有字段恢复为初始状态。

15.SQLite数据库的使用:
我们使用使用数据库都用到了SQLiteDataBase对象,可以通过两种方式,一种是借助sqliteopenhelper获取一个可读可写的数据库对象,一种是通过context打开一个已有的数据库,通过SQLitedatabase对象,进行对数据库的增删改查,同时,这种方式可以有三种:字符串拼接,占位符,系统自带。

16.service启动方式以及生命周期,如何停止service?
第一种是通过startService(intent)启动服务,调用Service生命周期的onCreate和onStartcommand方法,onCreate方法只在服务创建时调用一次,onStartCommand方法可以多次调用;通过stopService()方法终止服务,调用生命周期的onDestroy方法。
第二种方式是通过bindService()启动,调用生命周期的onCreate,onBind方法,二者都只执行一次;通过unbindservice()结束服务,调用生命周期的onDestroy方法。

都可以在服务内部调用stopself停止
16.广播的使用,引用广播的用意
使用:注册广播接收器,通过intent对象,确定给谁发广播,广播接收器内部调用onreceive方法处理。
a:从MVC的角度考虑(应用程序内)
其实回答这个问题的时候还可以这样问,android为什么要有那4大组件,现在的移动开发模型基本上也是照搬的web那一套MVC架构,只不过 是改了点嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一 种补充关系,引入广播机制可以方便几大组件的信息和数据交互。
b:程序间互通消息(例如在自己的应用程序内监听系统来电)
c:效率上(参考UDP的广播协议在局域网的方便性)
d:设计模式上(反转控制的一种应用,类似监听者模式)

17.Android四大组件以及作用:
Android有四大组件:Activity、Service、Broadcast Receiver、Content Provider。
Activity :应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。
Service 服务:一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。
BroadcastReceive广播接收器:你的应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息。
Content Provider内容提供者 :主要用于多个应用间数据共享。这些数据可以存储在文件系统中或SQLite数据库。

18.contentprovider如何实现数据共享,它有什么优点?
新建一个类继承ContentProvider,在AndroidManifest.xml文件中添加provider标签,注明该authority信息,该信息可以唯一地标识该provider,外界也是通过该信息找到该provider。最终提供给外界一个URI——content://authority信息+数据路径。
在需要访问数据的程序中获取contentResolver对象,该对象通过URI对要访问的数据增删改查的操作。
优点:一个程序可以通过ContentProvider自己的数据暴露出去。外界看不到,也不用看到这个应用暴露的数据在应用当中是如何存储的,或者是用数据库存储,或者用文件,外界可以通过统一的接口——URI对数据进行增删改查

19.如何保证后台服务不被杀死。
1.重写service的onStartCommand方法,返回值改为START_STICKY.START_STICKY:如果服务被kill,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand方法,如果在此期间没有任何启动命令被传递到service,那么参数intent将为null。
2.在onDestroy方法中重启服务,但有时强制停止时不会执行onDestroy方法的,所以服务也不会重启。
3.提升Service进程优先级,使用startForeground将service放到前台状态。
startForeground(int,notification)
4.监听系统广播,判断service状态,比如手机重启时启动服务。
5.也说同一个应用开启两个进程,相互监听,如果一个被kill,另一个启动,做到最大程度的存活。

20.自定义控件的步骤:
Android自定义组件有三种实现思路:
继承某个现有组件,在其基础上添加额外功能,如继承Gallery实现CoverFlow效果
继承某个Layout,实现复合组件自定义,如TextView和EditText组合实现登录注册组件
继承View,实现onDraw()方法,实现自己绘制组件,如翻页效果组件

21.http请求方式,tcp和udb的区别(三次握手)
请求方式分为:get和post。
二者的区别在于:get携带信息少,安全性能低,速度快,在URL上能显示。
Post携带信息多,安全性能高,速度慢,在URL上不显示。
TCP协议是首先要完成三次握手,建立完整通路,类似于打电话,信息一定能传达到,主要使用流或者二进制数组传递信息。
UDP协议不用进行三次握手,速度快,信息不能保证被接收到,类似于广播。主要使用数据打包解包使用。

22.fragment的生命周期以及fragment之间的通信,以及fragment和activity之间的通信
Fragment的生命周期依附于Activity

Fragment和activity通信:实际可以使用广播,文件进行通信,但是消耗资源,所以使用了生命周期方法,具体为:activity定义一个成员变量,在Fragment中定义一个接口,fragment生命周期的第一个方法onattach传递了一个activity参数,我们可以通过它访问activity的成员变量,而activity想获取fragment的参数时,只要实现了fragment的接口,通过回调方式获取fragment中的参数。

23.进程的优先级
1.前台进程:正在和用户进行交互的页面所在的进程
2.可见进程:当一个activity页面使用对话框呈现的时候处于对话框下面的页面所在的进程就是可见进程
3.服务进程:带有推送功能的app,微信
4.后台进程:点击home按钮,置于后台的进程就是后台进程.
5.空进程
24.pulltorefresh的使用
这是一个上拉刷新,下拉加载的adapterView,可以完成上拉刷新,下拉加载。我们通常使用在listview上,实际上是通过onscroll接口里的方法完成的。我们可以获取到一个可见的item,屏幕内看到的item和总的item,判断是否到底或者到头,此时我们可以添加头和尾来控制刷新和加载。
//支持模式只支持上拉刷新,下拉加载,或者二者都可以
listView.setMode(Mode.BOTH);
//在刷新的时候支持滑动
listView.setScrollingWhileRefreshingEnabled(true);
//设置上拉和下拉的监听,通过refreshView获取当前的位置,进行自己的操作
listView.setOnRefreshListener(new OnRefreshListener() {

        @Override
        public void onRefresh(PullToRefreshBase<ListView> refreshView) {

            int y = refreshView.getScrollY();
            setDatas( y<0 );
        }
    }); 

25.face++怎么使用,使用方式以及有哪些方法
Face++用在人脸识别上,可以通过传递一个简单的二进制流文件,访问服务器,根据json串获取年龄和性别,主方法是detectiondetect,但是根据要求需要使用的是二进制文件流,而且大小有分别,所以我们需要先进行图片信息的压缩,在转换成二进制流,作为参数传入。
比较相似度的时候,主方法为recognitionidentify,需要给定一个已经有脸的库,这个库的生成时因为有人的信息,组的信息和脸的信息,所以我们要新建组,新建人,新建脸,然后加入后,进行train,方法为:
group/create
group/add_person
完成了添加组和人,但是需要训练,所以使用了train/identify和train/verify来进行组和人的训练

26.Xutils的使用:
XUtils主要的四大模块
 DbUtils模块:
 android中的orm框架,一行代码就可以进行增删改查;
 支持事务,默认关闭;
 可通过注解自定义表名,列名,外键,唯一性约束,NOT NULL约束,CHECK约束等(需要混淆的时候请注解表名和列名);
 支持绑定外键,保存实体时外键关联实体自动保存或更新;
 自动加载外键关联实体,支持延时加载;
 支持链式表达查询,更直观的查询语义,参考下面的介绍或sample中的例子。

 ViewUtils模块:
 android中的ioc框架,完全注解方式就可以进行UI,资源和事件绑定;
 新的事件绑定方式,使用混淆工具混淆后仍可正常工作;
 目前支持常用的20种事件绑定,参见ViewCommonEventListener类和包com.lidroid.xutils.view.annotation.event。

 HttpUtils模块:
 支持同步,异步方式的请求;
 支持大文件上传,上传大文件不会oom;
 支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求;
 下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件;
 返回文本内容的请求(默认只启用了GET请求)支持缓存,可设置默认过期时间和针对当前请求的过期时间。

 BitmapUtils模块:
 加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象;
 支持加载网络图片和本地图片;
 内存管理使用lru算法,更好的管理bitmap内存;
 可配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等…

27.volley框架
http://blog.csdn.net/xyz_lmn/article/details/12165391
包括了JsonRequest和ImageRequest,就是为了httpClient和异步加载图片的封装,同时结局了如果此时Activity异常退出时的情况。

28.picasso原理,有哪些功能
Picasso是异步加载图片的三方JAR包,原理是我们滑动listview会出现错位,通过给图片打上标签,在最后加载的时候比较标签和图片的URL不一致不加载,解决错位。使用三级缓存存储图片(详见第8条)。
29.sharedSDK,应用分享
我们需要配置SDK,
1)获取ShareSDK的AppKey
2)下载SDK
3)第一步:使快速工具进行集成

第二步:配置AndroidManifest.xml

完成上述操作后即可进行shareSDK的操作如三方登陆以及分享。

30.MVC在安卓中的使用(M/V/C,以及在web中的使用)
Android中界面部分也采用了当前比较流行的MVC框架,在Android中:
  1) 视图层(View):一般采用XML文件进行界面的描述,使用的时候可以非常方便的引入。也可以使用JavaScript+HTML等的方式作为View层,通过WebView组件加载,同时可以实现Java和JavaScript之间的通信。
  2) 控制层(Controller):这句话也就暗含了不要在Acitivity中写代码,要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Acitivity的响应时间是5s,如果耗时的操作放在这里,Android的控制层的重任通常落在了众多的Acitvity的肩上,程序就很容易被回收掉。
3) 模型层(Model):对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。在Android SDK中的数据绑定,也都是采用了与MVC框架类似的方法来显示数据。在控制层上将数据按照视图模型的要求(也就是Android SDK中的Adapter)封装就可以直接在视图模型上显示了,从而实现了数据绑定。

比如显示Cursor中所有数据的ListActivity,其视图层就是一个ListView,将数据封装为ListAdapter,并传递给ListView,数据就在ListView中显示。
Web中mode是Java代码,view是jsp或者http网页,controller是web.xml配置文件

31.Android中数据存储的方式:
1、使用SharedPreferences存储数据;
2、文件存储数据;
3、SQLite数据库存储数据;
4、使用ContentProvider存储数据;
5、网络存储数据;

32.ANR弹窗,如何避免:
ANR:Application is Not Responding,五秒在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现下列情况时,Android就会显示ANR对话框了:
对输入事件(如按键、触摸屏事件)的响应超过5秒
意向接受器(intentReceiver)超过10秒钟仍未执行完毕
Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intent broadcast)。
解决方案有两种:
1. AsyncTask异步任务中,doInBackground()和onPostExecute(Result)两个方法非常重要
doInBackground() 这个方法运行在后台线程中,主要负责执行那些很耗时的操作,如移动护理系统中的网络连接、解析XML等操作。该方法必须重载。
onPostExecute(Result) 这个方法也运行于UI线程,在doInBackground(Params…)方法执行后调用,该方法用于处理后台任务执行后返回的结果。
2. 子thread + handler
Handler的运行机制(运行原理)(Handler,Looper,MessageQueue,Message之间的关系)
一个Handler允许你发送和处理Message和Runable对象,每个线程都有自己的Looper,每个Looper中封装着MessageQueue。Looper负责不断的从自己的消息队列里取出队头的任务或消息执行。每个handler也和线程关联,Handler负责把Message和Runable对象传递给MessageQueue(用到post ,sendMessage等方法),而且在这些对象离开MessageQueue时,Handler负责执行他们(用到handleMessage方法)。 其中Message类就是定义了一个信息,这个信息中包含一个描述符和任意的数据对象,这个信息被用来传递给Handler.Message对象提供额外的两个int域和一个Object域。

33.java/安卓运行时的异常,error,exception(至少说出10个),并且这些异常什么时候发生
Arithmetic Exception:算术异常,出现在除数为0的时候
IllegalArgument Exception:非法参数异常,我们给入的参数并不符合我们方法需求的时候
IllegalStatement Exception:非法状态异常,我们出现添加视图的时候并不符合它原本的状态
ClassNotFoundException:类找不到异常,我们加载该类的时候,但是没有找到具有指定名称的类的定义。
InterruptedException:打断异常,当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常。
IOException:I/O异常 此类是失败或中断的 I/O 操作生成的异常

NoSuchMethodException:没有该方法异常,无法找到某一特定方法时,抛出该异常

ParseException解析异常,表示解析时出现意外错误

ClassCastException:类型转换异常,当转换类型时,不是其子类对象,就会出现。

IndexOutOfBoundsException:下标越界异常,出现在数组和字符串内。

FileNotFoundException:找不到文件异常,当我们指向一个文件时,可能该文件不存在

NullPointerException:空指针异常,通常我们尝试调用一个空的对象的时候出现

SecurityException:安全异常,发生在数据库中,有时候可能需要赋予权限。

OOM Error 内存溢出错误,出现在加载一张大图时
Have you declared your activity in your AndroidMainFest.xml?
Activity没有配置在清单文件中
Have you override your method in your method?
ViewPager我们没有重写方法
Can’t find the Resources in your R file:当setText 我们设置为int类型,实际找的是R文件的内容
34.安卓中,安卓的系统架构:
应用程序层 java语言 应用程序开发
应用程序框架层 java语言 OS定制 framework层开发
系统运行库层 C C++ 实现 so库
Linux内核层
android系统架构分从下往上为linux 内核层、运行库、应用程序框架层、和应用程序层
35.Android平台的优缺点:
Android平台手机 5大优势:
一、开放性
在优势方面,Android平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟
开发性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,随大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。
二、挣脱运营商的束缚
在 过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。从去年iPhone 上市 ,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中 的笑谈,当你可以通过手机IM软件方便地进行即时聊天时,再回想不久前天价的彩信和图铃下载业务,是不是像噩梦一样?
互联网巨头Google推动的Android终端天生就有网络特色,将让用户离互联网更近。
三、丰富的硬件选择
这 一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不 会影响到数据同步、甚至软件的兼容,好比你从诺基亚 Symbian风格手机 一下改用苹果 iPhone ,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移,是不是非常方便呢?
四、不受任何限制的开发商
Android平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如可控制正是留给Android难题之一。
五、无缝结合的Google应用
如今叱诧互联网的Google已经走过10年度历史,从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。
再说Android的5大不足:
一、安全和隐私
由于手机 与互联网的紧密联系,个人隐私很难得到保守。除了上网过程中经意或不经意留下的个人足迹,Google这个巨人也时时站在你的身后,洞穿一切,因此,互联网的深入将会带来新一轮的隐私危机。
二、首先开卖Android手机的不是最大运营商
众 所周知,T-Mobile在23日,于美国纽约发布 了Android首款手机G1。但是在北美市场,最大的两家运营商乃AT&T和Verizon,而目前所知取得Android手机销售权的仅有 T-Mobile和Sprint,其中T-Mobile的3G网络相对于其他三家也要逊色不少,因此,用户可以买账购买G1,能否体验到最佳的3G网络服 务则要另当别论了!
三、运营商仍然能够影响到Android手机
在国内市场,不少用户对购得移动定制机不满,感觉所购的手机被人涂画了广告一般。这样的情况在国外市场同样出现。Android手机的另一发售运营商Sprint就将在其机型中内置其手机商店程序。
四、同类机型用户减少
在 不少手机论坛都会有针对某一型号的子论坛,对一款手机的使用心得交流,并分享软件资源。而对于Android平台手机,由于厂商丰富,产品类型多样,这样 使用同一款机型的用户越来越少,缺少统一机型的程序强化。举个稍显不当的例子,现在山寨机泛滥,品种各异,就很少有专门针对某个型号山寨机的讨论和群组, 除了哪些功能异常抢眼、颇受追捧的机型以外。
五、过分依赖开发商缺少标准配置
在 使用PC端的Windows Xp系统的时候,都会内置微软Windows Media Player这样一个浏览器程序,用户可以选择更多样的播放器,如Realplay或暴风影音等。但入手开始使用默认的程序同样可以应付多样的需要。在 Android平台中,由于其开放性,软件更多依赖第三方厂商,比如Android系统的SDK中就没有内置音乐 播放器,全部依赖第三方开发,缺少了产品的统一性。
36.assets文件夹和res/raw的区别:
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”);
37.touch分发事件:

我们在点击最内层的View或者ViewGroup时,实际都是从最底层的DecorView进行向下传递,但是我们需要进行二次拦截,分别为dispatchTouchEvent及InterceptTouchEvent,默认返回值为false,当我们返回True的时候,就对其进行拦截,当我们不阻拦直接传递到最低层的时候会向上回传onTouchEvetnt,这个方法,默认的返回值也是false,当我们返回True的时候,我们就对该事件进行了消费,代表我们已经处理了本次Touch事件,后面不需处理,如果全部返回为false,那么这次Touch事件就被无视了

38.bitmap的压缩(bitmap的获取方式)
获取Bitmap的方法:
1.BitmapFactory.decodeXXX:这种方式获取的bitmap是从一些其他的资源中进行获取。 这些其他的资源包含:二进制的字节数组(byte[])、文件(file)、项目资源(res)、流(stream)、文件描述符(FileDescriptor)。
因为在从其他的外部资源获取Bitmap的时候有可能图片资源过大,这时候就容易发生OOM,具体使用options,参照下面标题二。(BitmapFactory.options)
2.使用Bitmap.createBitmap(XXX,XXX,XXX…):这种方式创建的Bitmap对象一般是根据一个现有的Bitmap对象来创建一个新的Bitmap对象。(使用设计模式中的原型模式)

39.布局文件中include用法,merge
如果在一个项目中需要用到相同的布局设计,可以通过 标签来重用layout代码
使用 标签来减少视图层级结构:
如果能在layout文件中把FrameLayout声明去掉就可以进一步优化布局代码了。 但是由于布局代码需要外层容器容纳,如果
直接删除FrameLayout则该文件就不是合法的布局文件。这种情况下就可以使用 标签了
40.JNI调用过程(背):
1)安装和下载Cygwin,下载 Android NDK
2)在ndk项目中JNI接口的设计
3)使用C/C++实现本地方法
4)JNI生成动态链接库.so文件
5)将动态链接库复制到java工程,在java工程中调用,运行java工程
41.java垃圾回收机制、

从以前开始的对象回收是由我们自己进行的,如析构函数及销毁等,而Java中我们使用的是系统的Garbage Collection(GC)来进行管理的,虽然我们省略了回收的步骤,但是如果想要影响并不容易,我们只能通过System.gc()通知垃圾管理器来进行回收,垃圾管理器当发现一个对象为空或者不指向一个引用时,就会不定时的进行回收,每个对象继承自Object,所以GC完成了finalize()方法来进行回收,如果我们实现了Closeable接口,我们就需要手动关闭,因为此时GC已经不再进行这部分资源的关闭了。

42.屏幕适配:
最好可以通过权重(layout_weight)的方式来分配每个组件的大小,也可以通过具体的像素(dip)来确定大小。
尽量使用Relativelayout 。
已知应用支持平台设备的分辨率,可以提供多个layout_320*480 …
drawable-hdpi,drawable-mdpi,drawable-ldpi分别代表分辨率为480*800,360*480,240*360, 放置图片大小相差1.5倍
最后还需要在AndroidManifest.xml里添加下面一段,没有这一段自适应就不能实现:

你可能感兴趣的:(android,面试)