面试题

1.怎么实现通知栏到聊天界面的跳转
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); //这样可以清掉所有历史activity
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
new一个新的Intent然后用上述方法即可实现跳转。

2.聊天界面左右分隔怎么实现,怎么实现优化使其不出现错位
我们可以在adapter里对消息的发放者进行判断,如果不是本人发送的那就设置靠左,否则设置靠右,具体实现如下:
封装消息实体类时,将消息的发送者类型作为Boolean类型存入。在适配数据时,准备两种item_layout布局文件,一种用于别人的信息展示,另一种用于自己的信息。getView方法加载布局文件之前对消息的发放者进行判断,如果是本人发送,则加载靠右的布局,否则则使用靠左的布局文件,从而实现动态的位置改变

3.视频,音频的上传
Android的视频音频上传主要就是通过java的socket来进行与服务器的交流,socket通信可以指定一个服务器的地址,然后可以通过io流实现视频音频的上传。

4.http协议和soap协议的区别
HTTP(超文本传输协议)是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议。客户端使用Web浏览器发起HTTP请求给Web服务器,Web服务器发送被请求的信息给客户端。

SOAP(Simple Object Access Protocal,简单对象访问协议) 技术有助于实现大量异构程序和平台之间的互操作性,根据我有限的了解,SOAP是把成熟的基于HTTP的WEB技术与XML的灵活性和可扩展性组合在了一起。比如我们.NET中的WEB服务,就是基于SOAP。

简单对象访问协议(SOAP)是W3C组织的一个Note, 它描述了一种在分散的或分布式的环境中如何交换信息的轻量级协议。SOAP是一个基于XML的协议,它包括三个部分:SOAP封装(Envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(Encoding Rules),用于表示应用程序需要使用的数据类型的实例;SOAP RPC表示(RPC Representation),表示远程过程调用和应答的协定;SOAP可以和多种传输协议绑定(Binding),使用底层协议交换信息。在这个文档中,目前只定义了SOAP如何和HTTP以及HTTP扩展进行绑定的框架。

SOAP是个通信协议, SOAP在HTTP协议的基础上,把编写成XML的REQUEST参数, 放在HTTP BODY上提交个WEB SERVICE服务器(SERVLET,ASP什么的) 处理完成后,结果也写成XML作为RESPONSE送回用户端, 为了使用户端和WEB SERVICE可以相互对应,可以使用WSDL作为这种通信方式的描述文件,利用WSDL工具可以自动生成WS和用户端的框架文件,SOAP具备把复杂对象序列化捆绑到XML里去的能力。

SOAP的前身是RPC, 就是远程呼叫处理的协议,这个协议安全性不是很好,多数防火墙都会阻挡RPC的通信包,而SOAP则使用HTTP协议作为基本的协议,使用端口80使得SOAP可以透过防火墙,完成RPC的功能。

SOAP协议和HTTP协议一样,都是底层的通信协议,只是请求包的格式不同而已,SOAP包是XML格式的,现在我们编写WEB SERVICE不需要深入理解SOAP也没关系。如果SERVICE和CLIENT在同样的环境下使用SOAP,由于一般情况下都有自动生成SOAP程序框架的工具,因此不知道细节也没关系. 可是, 如果CLIENT和SERVICE的环境不同,比如说JAVA的Client和.NET的SERVICE进行通信,或者是VB CLIENT和TOMCAT下的JAVA SERVICE通信,还是要知道一点细节为好. 特别是, WSDL或者UDDI都不是标准,如果不让用就只好手工配制SOAP MESSAGE啦。

5.http和https的区别
在URL前加https://前缀表明是用SSL加密的。你的电脑与服务器之间收发的信息传输将更加安全。 Web服务器启用SSL需要获得一个服务器证书并将该证书与要使用SSL的服务器绑定。 http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议
要比http协议安全

HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议
它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。
它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的安全全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。
HTTPS和HTTP的区别:
https协议需要到ca申请证书,一般免费证书很少,需要交费。
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议
http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全
HTTPS解决的问题:
1 . 信任主机的问题. 采用https 的server 必须从CA 申请一个用于证明服务器用途类型的证书. 改证书只有用于对应的server 的时候,客户度才信任次主机. 所以目前所有的银行系统网站,关键部分应用都是https 的. 客户通过信任该证书,从而信任了该主机. 其实这样做效率很低,但是银行更侧重安全. 这一点对我们没有任何意义,我们的server ,采用的证书不管自己issue 还是从公众的地方issue, 客户端都是自己人,所以我们也就肯定信任该server.
2 . 通讯过程中的数据的泄密和被窜改
1. 一般意义上的https, 就是 server 有一个证书.
a) 主要目的是保证server 就是他声称的server. 这个跟第一点一样.
b) 服务端和客户端之间的所有通讯,都是加密的.
i. 具体讲,是客户端产生一个对称的密钥,通过server 的证书来交换密钥. 一般意义上的握手过程.
ii. 加下来所有的信息往来就都是加密的. 第三方即使截获,也没有任何意义.因为他没有密钥. 当然窜改也就没有什么意义了.
2. 少许对客户端有要求的情况下,会要求客户端也必须有一个证书.
a) 这里客户端证书,其实就类似表示个人信息的时候,除了用户名/密码, 还有一个CA 认证过的身份. 应为个人证书一般来说上别人无法模拟的,所有这样能够更深的确认自己的身份.
b) 目前少数个人银行的专业版是这种做法,具体证书可能是拿U盘作为一个备份的载体.
HTTPS 一定是繁琐的.
a) 本来简单的http协议,一个get一个response. 由于https 要还密钥和确认加密算法的需要.单握手就需要6/7 个往返.
i. 任何应用中,过多的round trip 肯定影响性能.
b) 接下来才是具体的http协议,每一次响应或者请求, 都要求客户端和服务端对会话的内容做加密/解密.
i. 尽管对称加密/解密效率比较高,可是仍然要消耗过多的CPU,为此有专门的SSL 芯片. 如果CPU 信能比较低的话,肯定会降低性能,从而不能serve 更多的请求.
ii. 加密后数据量的影响. 所以,才会出现那么多的安全认证提示

6.listview的逐行显示
可以将每一条数据先加载到list集合中,然后通过适配器将每一条数据加载到listview中实现listview对数据的逐行显示。

7.edittext中文字的下划线效果
自定义一个·EditText的派生类,LineEditText,在LineEditText类的OnDraw函数中实现画一条下划线的功能

8.activity以及service的生命周期
activity
onCreate(Bundle savedInstanceState) 第一次创建时调用
onStart() 被用户可见时调用
onRestart() 当Activity处于stop状态又被重新启动时调用
onResume() 当获得焦点即可与用户交互时调用
onPause() 当失去焦点时调用
onStop() 当不可见时调用
onDestroy() 当销毁时调用

service
startService:onCreate()- >onStartCommand()->startService()->onDestroy()
BindService:onCreate()->onBind()->onUnbind()->onDestroy()

9.安卓系统的理解,优缺点
Android一词的本义指“机器人”,同时也是Google于2007年11月5日 宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。

版本:每个版本代表的甜点的尺寸越变越大,然后按照26个字母数序:纸杯蛋糕(Android 1.5),甜甜圈(Android 1.6),松饼(Android 2.0/2.1),冻酸奶(Android 2.2),姜饼(Android 2.3),蜂巢(Android 3.0),冰激凌三明治(Android 4.0),果冻豆(Jelly Bean,Android4.1和Android 4.2)。

Android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。

Android开发四大组件分别是:活动(Activity): 用于表现功能。服务(Service): 后台运行服务,不提供界面呈现。广播接收器(BroadcastReceiver):用于接收广播。内容提供商(Content Provider): 支持在多个应用中存储和读取数据,相当于数据库。
优点:开放性,挣脱束缚,丰富硬件,Google应用
缺点:版本过多,升级过快
用户体验不一致
10.sim卡EF文件是什么
SIM卡里的所有文件按树来组织:
1> 主文件MF(Master File)——每一块SIM卡只有一个唯一的主文件, 其他所有文件都是它的子孙, 主文件只有文件头,里面存放着整个SIM卡的控制和管理信息
2>专用文件DF(Dedicated File)——也是只有一个文件头, 里面存放着整个目录的管理控制信息, 专用文件相当于一个目录的根.
3>基本文件EF(Elementary File)——既有文件头,也有文件体, 文件头存放该文件的位置和控制信息, 文件体存放真正的数据, 整个SIM卡中只有基本文件有文件体, 也只有基本文件才用来存放数据.

11.四大组件哪些能动态注册
广播

12.安卓文件存储方式
文件的操作模式:Context.MODE_PRIVATE 为默认的操作模式,代表该文件私有,只能被应用本身使用,覆盖源文件
  Context.APPEND 为追加模式,私有的。存在就往文件追加内容
  Context.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取
  Context.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入
  如果希望文件被其他应用读和写,可以传入:
  openFileOutput(“zhgang.txt”,Context.MODE_WORLD_READABLE+
  Context.MODE_WORLD_WRITEABLE);
  android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候
  就需要userid匹配。默认情况下,任何应用创建文件,sharedprefernces,数据库都应该是私有的(位于/data/data//files),
  其他程序无法访问,除非在创建时指定了Context.MODE_WORLD_READABLE,Context.MODE_WORLD_WRITEABLE,只有这样其他程序才能正确访问

13.intent的功能,如何定义显示intent,隐式intent?
在一个Android应用中,主要是由一些组件组成,(Activity,Service,ContentProvider,etc.)在这些组件之间的通讯中,由Intent协助完成。
Intent传递过程中,要找到目标消费者(另一个Activity,IntentReceiver或Service),也就是Intent的响应者,有两种方法来匹配:
显示intent:代码简洁明了,执行了函数,就会马上跳转到指定的Activity中( Intent i = new Intent(Test.this, TestB.class);
this.startActivity(i);)。
隐式intent:隐式匹配,首先要匹配Intent的几项值:Action(要执行的动作), Category(要执行动作的目标所具有的特质或行为归类), Data/extras(即执行动作要操作的数据和传递到目的的附加信息),type(要执行的目标Activity所能处理的MIME数据类型)Component
如果填写了Componet就是上例中的Test.class)这就形成了显示匹配。

14.内存泄露遇见过哪些问题,解决办法,回收的算法
问题:运行两次后的输出结果,程序退出了,后台仍然有两个线程在跑,无法被释放,如果是大程序,就会导致:一、耗电;二、内存泄露。
解决方法:
在程序销毁的时候,要通过Handler的removeCallbacks(Runnable r)方法来手动释放掉该线程,当然要把Runnable单独提出来写。使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。

回收算法:tracing算法(Tracing Collector),compacting算法(Compacting Collector),copying算法(Coping Collector),generation算法(Generational Collector),adaptive算法(Adaptive Collector)

15.接口和抽象类的区别?
abstract可以修饰抽象方法,而一个类只要有一个抽象方法,就必须用abstract定义该类,即抽象类。
用interface修饰的类,里面的方法都是抽象方法,因此在定义接口的时候,可以直接不加那些修饰,系统会默认的添上去。接口里面的字段都是公有常量,即public static final修饰的字段。(继承一个类,实现多个接口)

16.string和stringbuffer和stringbuilder区别?
STRING的长度是不可变的,STRINGBUFFER的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法。
stringbuilder类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

17.html5?
HTML5是用于取代1999年所制定的 HTML 4.01 和 XHTML 1.0 标准的 HTML [1](标准通用标记语言下的一个应用)标准版本;现在仍处于发展阶段,但大部分浏览器已经支持某些 HTML5 技术。HTML 5有两大特点:首先,强化了 Web 网页的表现性能。其次,追加了本地数据库等 Web 应用的功能。广义论及HTML5时,实际指的是包括HTML、CSS和JavaScript在内的一套技术组合。它希望能够减少浏览器对于需要插件的丰富性网络应用服务(plug-in-based rich internet application,RIA),如Adobe Flash、Microsoft Silverlight,与Oracle JavaFX的需求,并且提供更多能有效增强网络应用的标准集。
是一种标记语言。

18.自定义一个不带系统边框的Dialog?
首先定义样式文件style.xml,边框设计windowframe属性为@null,将背景设置为自己想要的背景,将自定义dialog继承Dialog,将布局文件载入,创建dialog,并将自己设置的样式文件加载进去,最终实现自定义的Dialog.

19.定义一个跑马灯效果的textview?
显示跑马灯效果的前提条件就是你的文本内容要比显示文本的外部组件长,即外部组件无法完整的显示。
内部的文本内容。
1、layout_width=””设置为成比文本内容短的固定值,最好不要写成wrap_content或者fill_parent。
2,android:singleLine=”true” 表示使用单行文字
android:ellipsize=”marquee” 设置了文字过长时如何切断文字,可以有
none,start,middle, end, 如果使用走马灯效果则设为marquee。
android:focusableInTouchMode=”true”
android:focusable=”true”
android:marqueeRepeatLimit=”marquee_forever” Android的缺省行为是在控件获得
Focus时才会显示走马灯效果。

20.图片的异步加载的方法?
1.利用软引用来缓存图片Bitmap,用图片的URL作为缓存查找的Key;
2.设两级缓存,一级是SoftReference,二级是本地SD卡;
3.如果两级缓存都没取到图片,则从服务器获取,并加入缓存;
4.加载完后通过回调接口通知UI更新;

21.瀑布流实现方式?
1)自定义scrollView,动态代码添加LinearLayout及ImageView
a.自定义scrollView,并且使用监听器模式,对其滚动到最顶部、及最底部进行监听操作。
b.在Activity里对scrollView的横向的LinearLayout动态添加列数,每一列是一个竖向的linearLayout.
c.根据列数以及list.size()对每一列的linearLayout添加ImageView.
d.根据监听器对其滚动到顶部(不做操作)、滚到最底部(加载更多数据)、正在滚动进行操作(滚动超过两屏,回收两屏之前图片回收及回滚到之前屏幕图片重载)。

22.把一张特别大的图片,分成几十张小的图片,在最短的时间内给处理?
http://www.linuxidc.com/Linux/2012-11/73939p2.htm
方法1:如果你将return-data设置为“true”,你将会获得一个与内部数据关联的Action,并且bitmap以此方式返回:(Bitmap)extras.getParcelable(“data”)。注意:如果你最终要获取的图片非常大,那么此方法会给你带来麻烦,所以你要控制outputX和outputY保持在较小的尺寸。鉴于此原因,在我的代码中没有使用此方法((Bitmap)extras.getParcelable(“data”))。
方法2: 如果你将return-data设置为“false”,那么在onActivityResult的Intent数据中你将不会接收到任何Bitmap,相反,你需要将MediaStore.EXTRA_OUTPUT关联到一个Uri,此Uri是用来存放Bitmap的。但是还有一些条件,首先你需要有一个短暂的与此Uri相关联的文件地址,当然这不是个大问题(除非是那些没有sdcard的设备)。
23.Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念?
DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM进程都是在Linux系统中的一个进程,所以可以认为是同一个概念。
Dalvik和Java运行环境的区别  [
1:Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能。   
2:Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。   
3:不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex    4:dex文件格式可以减少整体文件尺寸,提高I/o操作的类查找速度。   
5:odex是为了在运行过程中进一步提高性能,对dex文件的进一步优化。   
6:所有的Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制   
7:有一个特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生,它会完成虚拟机的初始化,库的加载,预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的数据提供给系统。对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域。
24.嵌入式操作系统内存管理有哪几种,各有何特性 ?
1、虚拟内存管理机制: 有一些嵌入式处理器提供了MMU,在MMU具备内存地址映射和寻址功能,它使操作系统的内存管理更加方便。如果存在MMU ,操作系统会使用它完成从虚拟地址到物理地址的转换, 所有的应用程序只需要使用虚拟地址寻址数据。 这种使用虚拟地址寻址整个系统的主存和辅存的方式在现代操作系统中被称为虚拟内存。MMU 便是实现虚拟内存的必要条件。 虚拟内存的管理方法使系统既可以运行体积比物理内存还要大的应用程序,也可以实现“按需调页”策略,既满足了程序的运行速度,又节约了物理内存空间。 在L inux系统中,虚拟内存机制的实现实现为我们提供了一个典型的例子:在不同的体系结构下, 使用了三级或者两级页式管理,利用MMU 完成从虚拟地址到物理地址之间的转换。基于虚拟内存管理的内存最大好处是:由于不同进程有自己单独的进程空间,十分有效的提高了系统可靠性和安全性。 2、非虚拟内存管理机制: 在实时性要求比较高的情况下,很多嵌入式系统并不需要虚拟内存机制:因为虚拟内存机制会导致不确定性的 I/O阻塞时间, 使得程序运行时间不可预期,这是实时嵌入式系统的致命缺陷;另外,从嵌入式处理器的成本考虑,大多采用不装配MMU 的嵌入式微处理器。所以大多嵌入式系统采用的是实存储器管理策略。因而对于内存的访问是直接的,它对地址的访问不需要经过MMU,而是直接送到地址线上输出,所有程序中访问的地址都是实际的物理地址;而且,大多数嵌入式操作系统对内存空间没有保护,各个进程实际上共享一个运行空间。一个进程在执行前,系统必须为它分配足够的连续地址空间,然后全部载入主存储器的连续空间。

25.什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?
嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。
嵌入式操作系统主要用于工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而 android 是基于 linux 内核的,因此属于软实时。
26.一条最长的短信息约占多少byte?
一条最长的短信息约占140byte

27.android中的动画有哪几类,它们的特点和区别是什么?
答:Android中动画可以分为两大类:帧动画、补间动画
1)补间动画:(你定义一个开始和结束,中间的部分由程序运算得到。就是对场景里的对象不断的进行图像变化来产生动画效果(旋转、平移、放缩和渐变))AlphaAnimation(渐变型动画)、scaleAnimation(缩放型动画)、 TranslateAnimation(平移型动画)、 RotateAnimation(旋转型动画)、
2)逐帧动画:Frame(把一连串的图片进行系列化连续播放,如同放电影的效果),它是通过播放一张一张图片来达到动画的效果;
28.handler机制的原理,looper通过什么方法开始的?
一个Handler允许你发送和处理Message和Runable对象,每个线程都有自己的Looper,每个Looper中封装着MessageQueue。Looper负责不断的从自己的消息队列里取出队头的任务或消息执行。每个handler也和线程关联,Handler负责把Message和Runable对象传递给MessageQueue(用到post ,sendMessage等方法),而且在这些对象离开MessageQueue时,Handler负责执行他们(用到handleMessage方法)。
其中Message类就是定义了一个信息,这个信息中包含一个描述符和任意的数据对象,这个信息被用来传递给Handler.Message对象提供额外的两个int域和一个Object域。
默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,从消息队列里取消息,处理消息。调用Looper.loop()之后循环已经开始,下一个由handler发的message将会被这个handler的handleMessage方法处理,这是一个—-循环。
Looper从MessageQueue中取出Message之后,交由Handler的handleMessage进行处理。处理完成后,调用Message.recycle()将其放入Message Pool中。
29.说说mvc模式的原理,在android中的运用?
答:mvc是model,view,controller的缩写,mvc包含三个部分:
  模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
  视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
  控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,响应用户出发的相关事件,交给m层处理。
  android鼓励弱耦合和组件的重用,在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里面处理,当然对业务计算等操作也是必须放在的该层的。

30.如何让Activity变成一个窗口?
答:在清单文件AndroidManifest.xml中相应的标签内设置属性android:theme=”@android:style/Theme.Dialog”

31.后台的Activity被系统回收怎么办?
除了在栈顶的Activity,其他的Activity都有可能在内存不足的时候被系统回收,一个Activity越处于栈底,被回收的可能性就越大。如果我们没有覆写onSaveInstanceState()方法,此方法的默认实现会自动保存Activity中的某些状态数据,比如Activity中各种UI空间的状态。Android应用框架中定义的几乎所有的UI控件都恰当的实现了onSaveInstanceState()方法,因此当Activity被摧毁和重建时,这些UI控件会自动保存和恢复状态数据。比如EditText控件会自动保存和恢复输入的数据,而CheckBox控件会自动保存和恢复选中状态。开发者只需要为这些控件指定一个唯一的ID(通过设置android:id属性即可),剩余的事情就可以自动完成了。如果没有为控件指定ID,则这个控件就不会进行自动的数据保存和恢复操作。
由上所述,如果我们需要覆写onSaveInstanceState()方法,一般会在第一行代码中调用该方法的默认实现:super.onSaveInstanceState(outState)。
32.ListView优化?
答:1)、对convetView进行判空,是当convertView不为空的时候直接重新使用convertView
从而减少了很多不必要的View的创建
2)定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可
3)、当ListView加载数据量较大时可以采用分页加载和图片异步加载

33.IPC及其原理?

1).Binder通信是如何实现的?
1.Binder通信是通过linux的binder driver来实现的,
2.Binder通信操作类似线程迁移(thread migration),两个进程间IPC看起来就象是一个进程进入另一个进程执行代码然后带着执行的结果返回;
1)IPC(Inter-Process Communication,进程间通信),
aidl是 Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口.编译器可以通过扩展名为aidl的文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的.
BroadcastReceiver也可以实现进程间通信
ContentProvider 提供进程间数据共享
2).Android的 Service工作流程
1.Android虚拟机启动之前系统会先启动service Manager进程;
2.service Manager打开binder驱动,并通知binder kernel驱动程序这个进程将作为System Service Manager;
3.然后该进程将进入一个循环,等待处理来自其他进程的数据。
4.用户创建一个System service后,通过defaultServiceManager得到一个远程ServiceManager的接口,通过这个接口我们可以调用addService函数将System service添加到Service Manager进程中;
5.然后client可以通过getService获取到需要连接的目的Service的IBinder对象,这个IBinder是Service的BBinder在binder kernel的一个参考,
6.所以service IBinder 在binder kernel中不会存在相同的两个IBinder对象,每一个Client进程同样需要打开Binder驱动程序。对用户程序而言,我们获得这个对象就可以通过binder kernel访问service对象中的方法。
7.Client与Service在不同的进程中,通过这种方式实现了类似线程间的迁移的通信方式,对用户程序而言当调用Service返回的IBinder接口后,访问Service中的方法就如同调用自己的函数。
34.View如何刷新?
安卓要更新界面不要在主线程中去做
如果是在线程thread中获取到了新的数据,需要配合使用hanlder进行刷新.
在线程中刷新View用postinvalidate();
在UI线程中刷新View的方法是invalidate()函数,
当调用线程处于空闲状态时,调onDraw()刷新界面

如果是listView刷新数据,用adapter.notifyDataSetInvalidated();
adapter.notifyDataSetChanged();
35.DDMS与TraceView的区别?
DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器 。
36.在Java中如何引入C语言?

java中利用JNI引用本地语言 (java native interface java 本地接口)接口 。
1.在应用程序中定义本地接口(native)编译成.h头文件,交由C程序员实现,将.c实现通过NDk编译成.so动态链接库(windows下是.dll, linux下是.so,导入项目中的libs/armeabi,代码中调用本地接口,
应用场景:音频,拍摄车牌号
37.链表和数组的区别?
数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。
链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。比如:上一个元素有个指针指到下一个元素,以此类推,直到最后一个元素。如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表数据结构了。
二者都属于一种数据结构
  (1) 从逻辑结构角度来看
   a, 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。
   b,链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)
  (2)从内存存储角度来看
   a,(静态)数组从栈中分配空间, 对于程序员方便快速,但自由度小。
   b, 链表从堆中分配空间, 自由度大但申请管理比较麻烦.
39.Hash表是什么?有什么用?
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数
作用:HASH表主要就是提供更快的查找速度,简单来说就是分桶。
比如说你们学校的一个年级有很多班是吧? 那么现在要查找一位同学。如果不看班级直接找,就需要每个班级一个一个的查找是不? 那现在因为分了班级,我们有一个函数可以通过名字产生它的班级号。比如说王勇,二班。 那么现在我们直接hash( 王勇) = 2; 然后我们就直接从2班开始找。 如果2班有50个学生,那么我们最多查找50次对吗? 好。假设你们年级一共有10个班,如果没有这个hash函数,那么直接找,最坏可能要查找50*10=500次。!! 这个班级其实就是每个桶!! 这就是分桶。。。通过哈希函数产生哈希值,然后相同哈希值的元素放在相同的桶里边。。。!
这样可以通过hash这个间接作用减少查找的时间和次数!这就是它的意义!!
40.什么是锁?有什么用?有哪些锁?为什么需要锁?
锁是为了保证安全性,如程序运行时保证另外的程序不能再对本程序所使用到的数据进行某些操作,版本软件的“不能合并”文件不能同时被两人修改等。
锁分为:线程锁,数据库锁,SVN锁等等
1、当几个线程都用到了某个量,但是这个量却能影响程序的运行时就需要线程锁来控制一次只能由一个线程访问这个量。如果没有使用线程锁会出现争用情况。
两个或更多的线程或进程读或写一些共享数据,而最终结果取决于这些线程是如何被调度计时的。争用情况可能会导致不可预见的结果和隐蔽的程序错误。
2、数据库锁的作用是防止程序运行的时候其他的程序不能再对该程序所使用到的数据进行操作,保护数据的安全性。
3、SVN锁的作用是防止版本软件中的“不能合并”的文件(如:图形文件)不能被多人同时更改的时候进行锁定,当一个人对其进行操作时,其他人不能对这个文件再进行操作,保证了文件的安全性。
41.MVC作用?
答: 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中显示。

42.px,dp,sp区别?
px:
即像素,1px代表屏幕上一个物理的像素点;
px单位不被建议使用,因为同样100px的图片,在不同手机上显示的实际大小可能不同
dp = dip : device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
sp:
与缩放无关的抽象像素(Scale-independent Pixel)。sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。
43.android 系统架构,按顺序?
答:1)应用程序层 java语言 应用程序开发
2)应用程序框架层 java语言 OS定制 framework层开发
3)系统运行库层 C C++ 实现 so库
4)Linux内核层

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

(Android 4.0的SDK已经发布,在众多的新增特性中,其中对开发者来说比较重要的特性之一,是新增的两种界面布局方式:Space和Gridlayout)

45.常用的设计模式?
答:单例模式;工厂模式;
观察者模式:ContentObserver, 监听ContentProvider ContentResolver;
适配器模式Adapter(SimpleAdapter BaseAdapter ArrayAdapter CursorAdapter)以及各种Adapter的数据源;
代理模式 AOP;
46.常用的排序法?
答: 冒泡排序 O(n^2) : 冒泡排序也是最简单最基本的排序方法之一。冒泡排序的思想很简单,就是以此比较相邻的元素大小,将小的前移,大的后移,就像水中的气泡一样,最小的元 素经过几次移动,会最终浮到水面上。
for (int i = 0; i < num.length; i++) {
// 内循环控制比较后移位
for (int j = num.length-1; j > i ; j–) {
if (num[j-1]>num[j]) {
temp = num[j-1];
num[j-1] = num[j];
num[j] = temp;
}
}
快速排序O(n log n) : 快速排序采用的思想是分治思想。快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
插入排序 O(n^2) :将新来的元素按顺序放入一个已有的有序序列当中。
选择排序 O(n^2) :第i趟简单选择排序是指通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换。共需进行i-1趟比较,直到所有记录排序完成为止。

47.写一个快速排序法?
快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
public class QuickSort {
public static void main(String[] args) {
Integer[] list={34,3,53,2,23,7,14,10};
QuickSort qs= new QuickSort();
qs.quick(list);
for( int i=0;i

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值