Android面试中常见问题集锦


Android面试中常会被问到的问题及解答方式:


http://www.cnblogs.com/deman/p/5860976.html


1,PendingIntent 和Intent的区别:

PendingIntent就是一个Intent的描述,我们可以把这个描述交给别的程序,别的程序根据这个描述在后面的别的时间做你安排做的事情
换种说法Intent字面意思是意图,即我们的目的,我们想要做的事情,在activity中,我们可以立即执行它
PendingIntent 相当于对intent执行了包装,我们不一定一定要马上执行它,我们将其包装后,传递给其他activity或application
这时,获取到PendingIntent的application 能够根据里面的intent来得知发出者的意图,选择拦截或者继续传递或者执行。

Android的四个基本组件中:—— Activity,Service和Broadcast Receiver——都是通过Intent机制激活的,不同类型的组件有不同的传递Intent方式:

    要激活一个新的Activity,或者让一个现有的Activity做新的操作,可以通过调用Context.startActivity()或者Activity.startActivityForResult()方法。
    要启动一个新的Service,或者向一个已有的Service传递新的指令,调用Context.startService()方法或者调用Context.bindService()方法将调用此方法的上下文对象与Service绑定。
    Context.sendBroadcast()、Context.sendOrderBroadcast()、Context.sendStickBroadcast()这三个方法可以发送Broadcast Intent。发送之后,所有已注册的并且拥有与之相匹配IntentFilter的BroadcastReceiver就会被激活。


2,Android中的尺寸,以及dp,px,sp的区别和联系:

px:表示屏幕实际的像素。  320*480 :标示:在横向320个纵向480个像素。

pt:标示一个点,时屏幕的物理尺寸,大小为1英寸的七十二分之一。

in:标示英寸,时屏幕的物理尺寸,每英寸等于2.54厘米。例如,形容手机大小为3.2英寸,是说屏幕对角线的大小。

dp与sp标尺单位的又来及计算方法:

像素尺寸:240*320 320*240 320*480 480*800 480*854 640*960 720*1280,

屏幕物理尺寸:3.2、3.5、3.75、4.0、4.3、5.0、7、9.3、10.1

0.75   1.5    2xhdpi    xxhdpi3   4   8

android 程序代码部分 采用像素为单位

程序的布局所有的尺寸都是采用dp为单位。

公式 :一个dp数值转换为px的数字:

    px = dp * (dpi/160)

例如:10dp --> 在mdpi  dpi = 160 ;因此  10dp = 10px。

像素密度:dpi:每英寸像素数:  如    手机为:240*320  像素分辨率,大小为:1.5*2 英寸。像素密度:240/1.5 = 320/2 =160dpi。

譬如1280x720物理分辨率,5英寸大小的屏幕,其dpi 的计算方法是:sqrt(1280*1280+720*720)/5 = 293.72 dpi

譬如1280x720物理分辨率,5英寸大小的屏幕上,54dp
这个高度如何转换成 px 呢,计算方法是:54dp * 293.72/160+0.5f = 99.6305px,约为 100px。

dpi = 60
Ldpi = 120 3
mpdpi = 160 4
hdpi= 240 6
xHdpi = 320 8

import android.content.Context;  
public class DensityUtil {  
 
    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */  
    public static int dip2px(Context context, float dpValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (dpValue * scale + 0.5f);  
    }  
 
    /**
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
     */  
    public static int px2dip(Context context, float pxValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (pxValue / scale + 0.5f);  
    }  
} 

  dp,sp,px之间的区别和联系:

dp也就是dip,这个和sp基本类似。

若是   设置长度,高度等属性时,可以使用dp,或者sp。但如果设置字体,需要使用sp。

dp是与密度无关,sp除了与密度无关外,还与scale无关。如果屏幕密度为160,这时dp和sp和px是一样的。1dp = 1sp = 1px,但如果使用px作单位,如果屏幕大小不变(假设是3.2寸),而屏幕密度变为了320,那么原来的TextView的宽度设置成160px,在密度为320的3.2寸屏幕里看到要比在密度为160的3.2寸屏幕上看短了一半。但如果设置成160dp或者160sp的话。系统会自动将width属性值设置成320px的。也就是160*320/160。其中320/160可称为密度比例因子。

如果使用dp和sp,系统会根据屏幕密度的变化自动转换。

3,关于scrool+ListView:

    1,所有的容器在显示内容之前,都需要进行排版,排版的时候,都需要获取内部子控件或子容器的尺寸,通过尺寸才可以进行排版。

    2,所有的View内部都有一个回调的方法,onMeasure这个方法,

    3, ScroolView内部控件  进行尺寸计算 onMeasure()的时候,

        参数模式  是  UNSPECIFIED.

        ListView的onMeasure :方法,检测模式  如果是 UNSPECINIED,listView则永远只有一行。

4,Http请求数据,get,Post的区别:

     在HTTP请求消息中,请求方式有GET、POST、HEAD、OPTIONS、DELETE、TRACE、PUT和CONNECT八种。而在以后们最常用的有两种请求方式:POST请求、GET请求。

get和post区别:

GET:从指定的服务器中获取数据,POST-提交数据给指定的服务器处理。

       1,使用GET方法时,查询字符串会以键值对的形式附加在action所指向的url的后面一起发送到服务器。
       2,使用POST方法时,查询字符串在POST信息中单独存在,和HTTP请求一起发送到服务器。
       3,get是从服务器上获取数据,post是用来向服务器上传递数据。

特点:
    get:
        get请求  能  够被缓存下来。
        get请求 会  保存在浏览器的  浏览记录中。
        以GET  请求的URL能够保存为  浏览器书签。
        GET请求的URL能够  保存为浏览器书签。
        GET请求   有长度限制。
        GET请求   主要用以获取数据。

    post:
        数据量大小为128k.

HTTP协议规范也没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。



http和https的区别:


         https 是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需
要SSL。它是一个URI scheme(抽象标识符体系)。句法类同http:体系。用于安全的HTTP数据传输。

    https:url表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证与加密通讯方法。  被广泛应用于万维网上安全敏感的通讯,例如交易支付方面。

5,Handler的介绍:

android提供了Handler和Looper来满足线程间的通信,Handler先进先出原则,Looper类来管理特定线程内对象之间的消息转换。

     1,Looper:一个线程可以产生一个Looper对象,由他来管理此线程里的MessageQueue(消息队列);
     2,Handler:用于push新消息到MessageQueue里,或者接受Looper从MessageQueue送来的消息。
     3,MessageQueue:用来存放线程放入的消息。
     4,Message对象:handler用于传递的数据信息。

handler创建消息:

    handler消息机制中引入了消息池,Handler创建消息时首先查询消息池中是否有消息存在。如果有直接从消息池中取得,如果没有则重新初始化一个消息实例。消息不被使用时,并不作为垃圾回收,而是放入消息池。可供下次Handler创建消息时使用。
Handler持有对UI主线程消息队列MessageQueue和循环Looper的引用。子线程可以通过Handler将消息发送到UI线程的消息队列MessageQueue中。

Handler处理消息:

    UI主线程通过Looper循环查询消息队列的UI_MQ,当发现有消息存在时会将消息从队列中取出。首先分析消息,通过消息的参数判断该消息对应的Handler,然后将消息分发到指定的Handler进行处理。


handler message messageQueue
每一个消息发送到主线程的MessageQueue中,MessageQueue遵循先进先出原则,发送消息不会阻塞线程,而接收线程会阻塞线程。Handler允许发送并处理Message消息,Message对象通过主线程的MessageQueue消息队列相关联的Message和Runnable对象进行存取。每个Handler实例对Message消息发送和接收与对应主线程和主线程的消息队列有关。当创建一个新的Handler时,Handler就属于当前主线程,主线程MessageQueue消息队列也同步创建,即Handler会绑定到创建该Handler的主线程/消息队列上。然后,Handler就可以通过主线程的消息队列发送和接收Message消息对象了。


6,java的内存机制:

内存:
    寄存器,方法区,栈,堆,本地方法区。
    方法区:存类的信息,常量池,静态方法区.
    栈(值类型):存放调用方法的局部变量,
        存储在栈中的变量,作用域结束立即消失.
    堆(引用类型):存数组或者引用对象.

        特点:
            1,分配内存首地址。
            2,有默认值。
            3,有gc(垃圾回收机制)。

        本地方法区:实现类库的调用.

    注意:常量池中,Java默认创建-128~127之间的常量对象.    对于字符串常量会首先去常量池中查找,如果不存在就创建字符串常量.字符串常量对像保存在字符串常量池中.

7,raw和assert中的资源有什么区别:

raw和asserts文件夹的相同点:
    1,两者目录下的文件在打包后会原封不动的保存在apk包中。不会被编译成二进制。


不同点:
    1,raw文件夹中的文件会被映射到R.java文件中。访问的时候直接使用资源id即R.id.fileName;assert不会被映射到R.java中。访问的时候需要AssertManager类。
    2,raw不可以有目录结构,而assert则可以有目录结构,也就是assert下可以再建立文件夹。

读取文件资源:   
    inputStream is = getResources().openRawResource(R.id.filename);

读取assert下的文件资源,通过以下方式获取输入流来进行写操作。
    AssertManager am = null;    am = getAssert();    InputStream   is = am.open("fileName");

8,fileInputStream 与dataInputStream区别

FileInputStream是实体流,也就是真实做事情的流,用来读文件的。使用该类创建对象时,系统会自动将需要读的文件转换成该类的流对象,你可以直接读取。DataInputStream是装饰流,必须建立在其他实体流的基础之上。如果用软件来类比流的话,那么操作系统就是实体流,而一般的应用软件则是装饰流。因为应用软件以操作系统软件为基础

9,LayoutInfalter  的参数 两个和三个参数的区别?

View inflate(int resource, ViewGroup root)
View inflate(int resource , ViewGroup root, boolean attachToRoot)

第二个参数   是指    实例的布局所要放入的根视图。一般我们在不需要将该布局放入根视图的时候都会把第二个数传为null。

第三个   参数为   是否将   第二个视图引用到第一个资源文件上。。

10,Linux进程  和线程:

进程是程序执行时的一个实例,即它是程序已经执行到各种程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。

线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的线程共享进程所拥有的全部资源。

11,android是什么:

是基于Linux内核的软件平台和操作系统,早期由Google开发

Android平台手机5大优势:
      一、开放性.
     二、挣脱运营商的束缚.
      三、丰富的硬件选择.
      四、不受任何限制的开发商
      五、无缝结合的Google应用

12,Intent的七大属性:


data(Data属性   通常用于向Action属性提供操作的数据。Data属性的值是个Uri对象)
extras(提供操作的额外数据,可以为各种对象)
category (类别)
flags(为Intent添加控制标记,同activity,LaunchMode)
action   
intentFalter (意图过滤器,通过action查找该intent。)
type(Type属性用于指定Data所指定的Uri对应的MIME类型).


13,fragment和activity的生命周期

fragment生命周期

onAttach(); onCreate();  onCreateView(); onActivityCreated();  onStart(); onResume();

onPause();  onStop(); onDestoryView();   onDestory();   onDetach();


activity的生命周期:

onCreated(),onStart(),onRestart(),onResume(),onPaused(),onStoped(),onDestroyed()

14,事件分发机制:

TouchEvent事件发生时Activity的dispatchTouchEvent(MotionEvent ev)会以隧道方式从根元素依次往下传递直到内层子元素或在中间元素由于某一条件停止传递。

dispatchTouchEvent事件的分发逻辑:

    1,返回true,进行处理,事件分发给当前view的dispatchTouchEvent方法进行消费,同时事件会停止向下传递。
    2,返回false,事件向下分发,此时事件分发分为两种:如果当前view获取的事件来自Activity,则会将事件返回给父View的Activity的onTouchEvent进行消费。如果当前View获取的事件来自父外层控件,则会将事件返回给父View的onTouchEvent进行消费。

    3,如果返回系统默认的super.dispatchTouchEvent(ev),事件会自动的分发给当前View的onInterceptTouchEvent方法。

事件拦截方法:onInterceptTouchEvent(MotionEvent ev)

    1,在外层的View的dispatchTouchEvent(MotionEvent ev) 方法返回系统默认的super.dispatchTouchEvent(ev)情况下,事件会自动的分发给当前View的onInterceptTouch
Event方法,onInterceptTouchEvent方法,onInterceptTouchEvent的事件拦截逻辑如下:
        1,如果onInterceptTouchEvent返回true 标示事件将进行拦截,并将拦截到的事件交由当前view的onTouchEvent进行处理。
        2,如果onInterceptTouchEvent返回false,则表示将事件放行,不进行拦截,当前view上的事件会被传递到子View上,再由子view的dispatchTouchEvent来开始这个事件的分发。
        3,如果返回super,则默认拦截并将拦截到的事件交由当前的View的onTouchEvent进行处理。

事件响应:onTouchEvent(MotionEvent ev)

    1,在dispatchTouchEvent返回super的情况下,  并且onInterceptTouchEvent返回false或者返回super的情况下onTouchEvent会被调用。onTouchEvent的事件相应逻辑如下:
        1,如果事件传递到当前View的onTouchEvent方法,而该方法返回了false,那么这个事件会从当前View向上传递,并且都是由上一层View的onTouchEvent来接受,如果传递到上面的onTouchEvent也返回false,这个事件就会消失,而且接受不到下一次事件。

        2,如果改事件rue   则会接受消费该事件。
        3,如果返回super默认处理事件的逻辑和返回false相同。


15,IntentReceiver作用:


         当你希望你的应用能够对一个外部的事件(如当电话呼入时,或者数据网络可用时,或者到了晚上时)做出响应,你可以使用一个IntentReceiver。虽然IntentReceiver 在感兴趣的事件发生时,会使用NotificationManager通知用户,但它并不能生成一个UI。IntentReceiver 在AndroidManifest.xml 中注册,但也可以在代码中使用Context.registerReceiver()进行注册。当一个intentreceiver 被触发时,你的应用不必对请求调用intentreceiver,系统会在需要的时候启动你的应用。各种应用还可以通过使用Context.broadcastIntent()将它们自己的intentreceiver 广播给其它应用程序。

16,UDP和TCP,三次握手和四次挥手::

UDP():半双工。传输快,不安全。信息量要求速度的适用。

TCP:(请求响应方式)
三次握手:

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN + ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
连接终止协议(四次挥手):
  由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

  (1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。
  (2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。
  (3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。
  (4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。


17,http1.1访问网络的八种方式:

http协议请求由三部分组成,分别是:请求行、消息报头、请求正文。

请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下: 

Method Request-URI HTTP-Version CRLF

1,HTTP/1.0协议使用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象,;
2,HTTP/1.1默认使用持久连接(然而,HTTP/1.1协议的客户机和服务器可以配置成使用非持久连接)。

OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
GET:向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中。
POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT:向指定资源位置上传其最新内容。
DELETE:请求服务器删除Request-URI所标识的资源。
TRACE:回显服务器收到的请求,主要用于测试或诊断。
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器


18,Fragment的优化:
hide  和  add
正确的切换方式是add(),切换时hide(),add()另一个Fragment;再次切换时,只需hide()当前,show()另一个。
/**
   * 切换页面的重载,优化了fragment的切换
   *
   * @param f
   * @param descString
   */
  public void switchFragment(Fragment from, Fragment to) {
    if (from == null || to == null)
      return;
    FragmentTransaction transaction = getSupportFragmentManager()
        .beginTransaction().setCustomAnimations(R.anim.tran_pre_in,
            R.anim.tran_pre_out);
    if (!to.isAdded()) {
        // 隐藏   当前的fragment,add下一个到Activity中
        transaction.hide(from).add(R.id.fl_main, to).commit();
      } else {
        // 隐藏当前的fragment,显示下一个
        transaction.hide(from).show(to).commit();
      }
    // 让menu回去
    menu.toggle();
}


19:aidl线程间通信介绍:

android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。

aidl是一种接口定义语言,用与两个进程间的通讯规则,共编译器生成代码。实现android设备上的两个进程间通信。

定义步骤:

    1,在项目中创建一个扩展名为aidl的文件,该文件的语法类似于java代码。
    2,如果aidl文件的内容是正确的,工具会自动生成一个java接口文件。
    3,建立一个服务类(service的子类)。
    4,实现由aidl文件生成的java接口。
    5,在注册文件中配置AIDL服务,标签中的android:name的属性就是客户端要引用该服务的ID。也就是intent的参数值。
在Android 中,AiDL是一种接口定义语言,编译器通过*.aidl文件的描述信息生成符合通信协议的java代码,我们无需自己去写这段繁杂的代码,只需要在需要的时候调用即可。通过这种方式我们就可以完成进程间的通信工作。


20,单元测试的步骤和方法:


    第一步:
        在安卓注册文件的应用程序application代码块中添加代码:
        
        在application外部添加代码:
                 android:targetPackage = "xx.xx.x.x" android:label = "Tests for My App"/>
    第二部 :
        新建普通类继承 AndroidTestCase类。编写测试方法:必须以public void开头,尽量抛出异常。在该方法中调用需要测试的方法或代码。

    第三步:将鼠标放在测试代码的测试方法上,点击run as方法运行测试。


---集成测试:
    
    主要是在单元测试的基础上测试接口访问或者异步任务是否正确。


21,数字签名的作用:

1,目的是保证软件包的完整性包含软件发布者的证书信息。
2,作用:
        1,确保软件包没有被修改,
        2,android系统根据相同软件id来区分软件,如果相同的id,只要证书不同,那么不允许安装,除非卸
载原有程序,保护数据。
       3,证书可以包含有效期,如果一个软件证书的有效期过期了,android不允许程序再运行了。

      1,Key Store:用于 保存公钥和私钥,公钥包含证书信息;开发工具使用keystore文件来进行数字签名。
      2,团队中应该使用相同的keystore文件,进行代码的调试和打包,主要针对百度地图这种,需要证书信息的,
      3,如公司已经提供keystore,那么直接复制出来,放到自己的电脑上。
      4,若没有提供,需要创建一个 放到工程中。

keyStore文件的生成:

    1,推荐   在工程中创建keyStore文件,团队就可以协同工作了。
    2,名词:key alias别名:在创建的时候,可以给每一个秘钥对私钥,指定一个名称。
这样就。

22,Android内存的优化:
android优化:内存控制,循环使用。图片的优化(二次采样)。

内存优化:
    1,减少内存占有。
    2,及时的缓存。
    3,把不适用的内存置空
    4,图片比较大的   进行二次采样。

android  代码优化的核心原则:   
       1、字符串频繁操作时,多用StringBuffer而少用String
       2、尽量使用本地变量,即反复使用的变量要先保存成临时或局部变量,尤其是循环中使用的变量
       3、String方法中Substring和indexOf都是native方法可以大量的使用。
       4、如果函数返回String类型,而且返回后的使用就是要加入到StringBuffer此时可以直接传入StringBuffer
       5、用两个一维数组代替二维数组 int[][]=====int[] int[]
       6、如果返回直接类型足够了,就不应返回接口类型如假如返回Hashmap就足够了,请不要返回Map
       7、如果一个方法不访问(不修改)成员变量,请用static方法
       8、尽量不用getters和setters,如果你非要用的话请加上final关键字,编译器会把它当成内联函数
       9、永远不要在for循环第二个参数中使用方法调用
      10、不修改的static变量请用static final常量代替
      11、foreach可以用来处理数组和arraylist,如果处理其他对象相当于Iterator
      12、避免使用枚举,请使用常量代替。
      13、慎用浮点数 float尤其是大量的数学运算
      14、不使用的引用变量要手动置null,提高内存被回收的几率
      15、慎用图片操作,使用后要立即释放资源。


23,fresco:第三方图片加载库介绍:

DraweeView 是Fresco的三大组件(Hierarchy、Controller、View) 之一,作为MVC模式中的 View,主要负责显示由 Hierarchy 提供的数据,Controller 作为幕后,负责获取数据。
       fresco是通过控件来实现它内部的优化缓存处理的。
       Fresco源码解析,fresco源码:Fresco是一个MVC模型,由三大组件构成,

它们的对应关系如下所示:
     M ->DraweeHierarchy
     V -> DraweView
     C -> DraweeController。

M 所对应的 DraweeHierarchy 是一个有层次结构的数据结构,DraweeView 用来显示位于 DraweeHierarchy 最顶层的图像(top level drawable),DraweeController则用来控制DraweeHierarchy的顶层图像是哪一个。
三者的互动关系很简单,DraweeView 把获得的 Event 转发给 Controller,然后 Controller 根据 Event 来决定是否需要显示和隐藏 (包括动画)图像,而这些图像都存储在 Hierarchy 中,最后 DraweeView 绘制时直接通过 getTopLevelDrawable 就可以获取需要显示的图像。


24,垃圾回收内部运行机制:

java中 垃圾回收机制的原理:

1,gc垃圾回收机制的工作原理:

        1,gc的工作原理:引用计数,标记复制。引用计数其实是一种简单但速度很慢的垃圾回收技术,所有对象都需要有一个引用计数器,当有引用连接时计数器加1。当引用离开作用域时或者被置为null时,计数器-1.垃圾回收器会在所有包含对象引用的列表上进行遍历,当发现某个对象的引用计数为0时,就释放占用的空间。
        2,“标记复制”的运行机制,垃圾回收器遍历包含所引用的列表,当发现存活的对象引用时做上标记,这样当遍历完  所有对象引用并做上标记的时候,执行垃圾回收,将没有标记的  对象   堆空间释放。
        3,垃圾回收机制的特点:java的垃圾回收机制使得java程序员不用担心内存空间的分配,减少了内存溢出。但同时也牺牲了一定的性能。

实现gc的算法:
    引用计数法,tracing算法,compacting算法,copying算法,generation算法,adaptive算法,


25,设计模式:


根据模式的目的划分为三类:

   1,创建型模型:与对象的创建有关。2, 结构性模型:处理类与对象的组合。3,行为型模型:对类或对象怎样交互和怎样分配职责进行描述。
       
   1.创建型模式:
        (1).工厂方法模式        (2).抽象工厂模式        (3).创建者模式        (4).原型模式        (5).单例模式

   2.结构型模式:
         (6).适配器模式        (7).桥模式        (8).组合模式        (9).装饰模式        (10).外观模式        (11).享元模式        (12).代理模式
   3.行为型模式
        (13).解释器模式        (14).模板方法模式        (15).职责链模式        (16).命令模式        (17).迭代器模式        (18).中介者模式        (19).备忘录模式        (20).观察者模式        (21).状态模式        (22).策略模式 -----:官方告诉大家我这里有一个排序的接口ISort的sort()方法,然后民间各尽其能,实现这个排序的方法:冒泡,快速,堆等等。这些方法就是“不同的策略”。        (23).访问者模式

MVC不是一种设计模式:
        Trygve Reenskaug最初提出MVC的目的是为了把数据(Model)和视图(View)分离开来,然后用控制器(Controller)作胶水来粘合M和V之间的关系。目的是为了实现注意点分离这样一个更高层次的设计理念,也就是让专业的对象做专业的事情,View就只负责视图相关的东西,Model就只负责描述数据模型,Controller负责总控,各自协作。

它其实是其它三个经典的设计模式的演变:观察者模式(Observer)(Pub/Sub), 策略模式(Strategy)和组合模式(Composite)。

26,ViewStub介绍:


解决动态根据条件显示哪个View或某个布局:

android.view.ViewStub。

viewStub是一个轻量级的View。他是一个看不见的,不占布局的位置。占用资源非常小的控件,可以为ViewStub制定一个布局,在inflate布局的时候,只有ViewStub会被初始化。然后当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub所向的布局就会被inflate和实例化。然后ViewStub的布局属性都会传给它所指向的布局。这样,就可以使用ViewStub来方便的在运行时,要还是不要显示某个布局。

viewStub只能实例化一次,之后ViewStub对象会被置为null。


27,软件测试的基本步骤:

软件首先在开发中进行单元测试。

    开发完成后进行    集成测试(设计规格说明)-------》功能测试(系统功能需求)-----》性能
测试(其他软件需求)-----》验收测试(用户需求规格说明书)-----》安装测试(用户环境)。

28,加密算法:
数据加密:


    计算机的加密解密是由秘钥控制实现的。秘钥使用户按照一种密码制随机选取。通常是一随机字符串。是控制明文和秘文变化的随机参数。

       密码技术除了提供信息的加解密外,还提供对信息来源的鉴别,保证信息的完整和不可否认等功能,而这三种功能都是通过数字签名实现。数字签名时涉及信息和签名人私钥的计算结果。首先签名人的软件对发送的信息进行散列函数运算后。生成信息摘要。
    加密体制:
          根据秘钥类型不同将现代密码及技术分为两类:对称加密(秘钥加密)系统,非对称加密(公开秘钥加密)。
对称加密:
          加密和解密均采用一把秘密钥匙,而且通信算法必须足够强大。适合于大规模生产。
非对称加密(公钥加密):
    指加密和解密使用不同秘钥的加密算法。也称为公私钥加密,假设两个用户要加密交换。

MD5:消息摘要(信息摘要算法),Message-Digest Algorithm 5   散列函数。
    
    将数据(如汉字)运算为另一固定长度的值。是紧凑算法的基础原理。
    它只是将数据按照指定算法压缩成长度固定的摘要信息。

摘要算法  就好比将一本书的每一页第一个字的笔画数计算出来,并拼接在一起,组成了一个很长的数字串。不论何时,按相同的算法计算这本书的摘要,都是完全一样的。但通过这个数字串,无法还原出书中的数据,即过程不可逆。md5算法类似于这种计算摘要的思想,只是具体实现要复杂很多。

 MD5特点:


        1,压缩性:任意长度的数据,算出的MD5的值都是固定的。
        2,容易计算:从元数据计算出MD5的值很容易。
        3,抗修改性:对原数据进行任何修改,哪怕只修改一个字节,所得到的MD5值都有很大区别。
        4,强抗碰撞:已知原数据MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

    原理:
    1,对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组。经过了一系列的处理后,
            算法的输出有四个32位组成,将这四个32位分组级联后生成一个128位散列值。
    2,例如字符串: 计算数据的长度,对数据进行填充到512位(64个字节)。然后将数据分成16个小组(16个数)。经过数据分组处理后,按照内存顺序输出即为最终结果。

RSA:非对称加密原理:
  
    用到素数,互质数(公因数只有1的两个数),指数运算,模运算(模运算即求余运算)等几个简单的数学知识。   
    密钥产生方法:yh
        随机产生两个不相等的质数计算乘机n转为二进制,二进制的位数就是密钥的位数。实际应用中RSA密钥一般为1024位,重要场合为2048位。
        计算出n的欧拉函数,随机选择一个整数e(实际应用中,常常选择65537),条件是1< e < φ(n),且e与φ(n) 互质。
        计算e对于φ(n)的  模反元素d。所谓"模反元素"就是指有一个整数d,可以使得ed被φ(n)除的余数为1。
        将n和e封装成公钥,n和d封装成私钥。

    RSA缺点:
        产生密钥很麻烦,受到产生素数技术的限制。
        分组长度太大,为保证安全性,n至少也要600bit以上。使运算代价很高,尤其是速度较慢。

DES算法的入口参数有三个:Key、Data、Mode。其中Key為8个字节共64位,是DES算法的工作密钥;Data也為8个字节64位,是要被加密或被解密的数据;Mode為DES的工作方式,有两种:加密或解密。

      DES算法是这样工作的:如Mode為加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作為DES的输出结果;
如Mode為解密,则用Key去把密码形式的数据Data解密,还原為Data明码形式(64位)作為DES的输出结果。    在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,    数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。

29,activity的启动模式:


standard(标准模式)   singleTop(栈顶)   singleTask()  singleInstance()

标准模式:每次都会创建一个新的Activity,不在任务栈中作任何存在性检查。(对系统消耗过大,每次都会创建一个activity的实例)。

singleTop(栈顶模式):只对栈顶作存在性检查,当启动的activity已经位于栈顶时,只对栈顶作存在性检查,直接使用。若没有位于栈顶则直接创建。

singleTask(检查栈中所有):系统会检查栈中是否存在该活动的实例,如存在则直接使用该实例。

singleInstance:在开发程序中如果需要activity在整个体系中都只有一个实例则使用单实例模式。指定为singleInstance模式的activity会启动一个新的任务栈来管理这个activity。


30,ListView 的优化:


     1,利用ListView自身的缓存机制,他会缓存一个条目的item,当listView第一屏显示完成之后。就会出现一个缓存条目,其实就是BaseAdapter里面的public View getView(int position,View convertView,ViewGroup parent)。
    2,减少findViewById()的次数,findViewById是一个相对比较耗性能的操作,因为这个操作每次都需要到布局中查找文件。把item里面的控件封装成一个javaBean,当item条目被加载的时候就去找相应的控件。
    3,利用时间去换取时间,比如开机优化,把一些重要的程序先启动了,启动系统完成之后再启动其他程序。
    4,利用空间去换取时间,把要获取的数据现价在到内存里面,在处理数据的时候,直接从内存中获取。减少数据库的频繁打开和关闭和减少查询的次数。

31,Thread和Runnable区别:

     如果一个类继承Thread,则不适合资源共享,但是如果实现了Runnable接口的话,则很容易的实现资源共享。

    在程序开发中只要是多线程肯定以Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:

    避免点继承的局限性,一个类可以继承多个接口。
    适合于资源的共享。

32,surfaceView   view    GLSurfaceView:  区别:

View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;必须在UI主线程内更新画面,速度较慢。

SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发;是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快。

GLSurfaceView:基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图;是SurfaceView的子类,openGL专用。

33,android系统中具备6个启动模式:


1,normal mode:一般启动模式的功能是正常启动方式,方法为关机状态下按电源键启动。

2,safe mode:此模式和正常启动一样,但没有登记Google,所以不能访问Market或使用你的Google账号,操做方法为按住“menu”键,按电源键启动手机,直至手机启动完成松开“menu”键。

3,恢复模式(recovery mode):可打开命令解释程序(shell),刷新映像文件,执行备份等,。当然这一切取决于你手机上的recovery image版本。使用方法很简单。就是home键和电源键一起按。

4,引导模式的功能,是从sd卡上安装新的系统映像,只需再按一次电源键。值得一提为android手机获取root权限。就是使用这个模式,操做方法为照相键和电源键一起按。

5,fastboot模式主要是在电脑上使用fastboot命令刷新映像文件。使用方法为按住返回键,按电源键启动手机,直至屏幕出现FASTBOOT字样松开后返回键。

6,诊断模式(diagnostic mode)是为了测试手机各项功能的模式,刻意通过轨迹球中心键和电源键打开。


34,Permission 的ProtectionLevel的属性值:


    normal:低风险权限,只要申请了就可以使用(在AndroidMainFest.xml中添加),安装时不需要用户确认。

    danerous:高风险权限,安装时需要用户的确认才可使用。

    signature:只有当申请权限的应用程序的数字签名与声明此权限的应用程序的数字签名相同时,才能将权限授给他。

    signatureOrSystem:签名相同,或者申请权限的应用为系统应用(在system image中)。


35,内存溢出和内存泄露的区别:

内存溢出out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of  memory;比如申请了一个integer,但给他存了long才能存下的数。

比如栈:栈满时,进行进栈,内存溢出。栈空时,进行出栈,内存也会溢出。分配内存不足以放下数据项序列,称为内存溢出。

内存泄露memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存迟早会被占光。   是指向系统中申请分配内存进行使用(new),但使用完后,却没有归还。申请到的内存自己也不能再访问,而系统也不能再次将它分配给需要的程序。

内存泄露会导致内存溢出。

36,java中有四种类型的引用:及区别:


1,强引用(Strong Reference):只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。

2,弱引用(Weak Refrence):如果一个对象只有弱引用指向它,垃圾回收器会立即回收该对象。

3,软引用(SoftRefrence):只有在内存不足的时候JVM才会回收该对象。并且这个特性很适合用来实现缓存:比如网页缓存、图片缓存等。

4,虚引用(PhantomReference):如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。


37,怎么解决横竖屏切换导致的   数据丢失?

activity横竖屏切换时,当前的Activity会被销毁,然后Activity上面的数据将全部丢失。
如ListView扇面的每个item的checkbox,横竖屏切换时,复选框就丢失所有选中的信息。

实现:
1,在注册文件中,activity 标签中,使用android:configChanges = "orientation|keyboardHidden"标签。
2,强制activity在   支持横屏或者竖屏。landscape标识横屏,portrait标识竖屏。
3,在activity中:通过复写 onConfigurationChanged(Configuratiion newConfig)方法。实现在不同屏幕下的处理方式。

@Override  
    public void onConfigurationChanged(Configuration newConfig) {  
        // TODO Auto-generated method stub  
        super.onConfigurationChanged(newConfig);  
        /*
         * 横竖屏检测
         */  
        if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {  
            // 当前为横屏  
          //实现代码  
 
        }  
        else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {  
            // 当前为竖屏  
            //实现代码  
        }  
        /*
         *  实体键盘状态检测
         */  
        if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {  
            // 实体键盘处于推出状态  
            //实现代码  
        }
        else if (newConfig.hardKeyboardHidden == onfiguration.HARDKEYBOARDHIDDEN_YES) {  
 
            // 实体键盘处于合上状态  
            //实现代码  
        }  
  }


38,Volley请求和xUtils请求的区别:

Volley谷歌的:支持小数据大频繁请求。
xUtils中国人开发的。

相同点:
    1,采用了网络数据缓存机制。
    2,通过handler机制进行线程通信。

不同点:

    1,Volley请求在android2.3版本之前是通过HttpClient,在之后的版本是URLHTTPConnextion.xUtils都是通过HttpClient请求数据信息的(bitmap模块图片是通过URLHTTPConnection)。URLHttpConnection默认支持GZIP压缩。api操作简单。

    2,Volley将Http请求数据先缓存进Byte[],然后是分配给不同的请求转化为需要的格式。  xUtils是直接转换为需要的格式。 Volley的扩展性很好,但是不能存在大数据的请求,否则就报OOM。   XUtils不会缓存如byte[]支持大数据的请求,速度要比Volley稍快。但扩展性低。

    3,Volley访问网络数据时直接开启固定个数的线程访问网络数据,在run方法中执行死循环。阻塞等待请求队列等。  XUtils是开启线程池来管理线程。缓存失效策略。volley的所有网络数据支持从http相应头控制是否缓存和读取缓存失效时间,每个请求可以控制是否缓存和缓存失效时间。  xUtils网络数据请求是统一自定义缓存失效时间。


39,android5.0的新特性:

 1、Face unlock(面部解锁):在Lollipop系统中,Google花费大力气优化了面部解锁功能。当用户拿起手机处理锁屏界面上的消息通知时,面部解锁功能便自动被激活。随意浏览几条消息之后,手机已经默默地完成了面部识别,解锁就是这么简单!
  2,Lock screen notifications(锁屏通知中心)
  Android Lollipop中加入了全新风格的通知系统,改进后的通知系统会优先显示由用户设定的重要的信息,而将不太紧急的内容隐藏起来。用户只需要向下滑动就可以查看全部的通知内容,如果是短信、微信,就可以再通知栏里直接进行回复,非常人性化。
   3,Pin Apps(多任务视窗)
  Lollipop在系统设置中提供了一项全新的功能——在多任务视窗中,给app应用窗口添加pin锁定代码。正如名字讲的那样,像是用别针锁定app应用,只用当输入正确的密码才能退出该app界面。虽然说与iOS系统的Guided Access功能也很像,但Guest Mode使用时好像更加简单快捷。
   4,Material Design
  Google重新设计了更加趋于扁平化的Lollipop系统UI,称为Material Design。在今年6月26日举办的I/O 2014开发者大会上,许多人就已经提前领略到Material Design出色的功能了。到现在,它得到了更多的优化,例如给通讯录联系人添加不同的颜色优先等级。新的UI设计,在基本元素的处理上,借鉴了传统的印刷设计,从字体版式、网格系统,到空间、比例、配色、图像等方面,都惊醒了大胆的平面化的创新。这一举措,无疑是加大了国产UI设计的难度与门槛。

    5,Android 5.0还支持新的电池模式、多账户登陆、访客模式以及通过蓝牙设备解锁等新功能。

Material Design新控件:

    支持的八个新控件:
        TextInputLayout:对EditText进行封装,带有提示信息的输入框。一个TextInputLayout只能嵌套一个EditText,内容过多会水平滚动进行查看
        FloatingActionButton:一个负责显示界面基本操作的悬浮圆形按钮。继承自ImageView,你可以使用android:src(更改圆形按钮中间的图片)或者ImageView的任意方法。悬浮按钮的背景使用colorAccent属性更改。
        Snackbar:一个介于Toast和AlertDialog之间的轻量级控件。他可以很方便的提供消息的提示和动作反馈。
        TabLayout标签布局位置随意,只能进行文字导航,既实现了固定的选项卡(View的宽度平均分配),也实现了可滚动的选项卡(View宽度不固定同时可以横向滚动)
        NavigationView:
        CoorDinatorLayout: 效果1:滚动效果,例子如:让浮动操作按钮(FloatingActionButton)上下滑动,为Snackbar留出空间,实现方式:使用CoordinatorLayout作为基本布局放在FloatingActionButton布局外层,会自动实现上移下移的动画.
        AppBarLayout:可把容器类的组件全部作为AppBar,例如把Toolbar和TabLayout放到了AppBarLayout中,让他们当做一个整体作为AppBar.
        TooBayLayout:CollapsingToolbarLayout作用是提供了一个可以折叠的Toolbar,它继承至FrameLayout,给它设置layout_scrollFlags,它可以控制包含在CollapsingToolbarLayout中的控件(如:ImageView、Toolbar)在响应layout_behavior事件时作出相应的scrollFlags滚动事件(移除屏幕或固定在屏幕顶端)。



你可能感兴趣的:([Android])