Android笔试面试题(二)


11  Android的四大组件,它们的作用?

    android有四大组件:Activity,Broadcast Receiver,Service,Content Providers。

    1)Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑。  

一个Activity通常就是一个单独的屏幕(窗口)。
Activity之间通过Intent进行通信。

android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity

    2)service:后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的事物,定义好需要接受的Intent提供同步和异步的接口。

    service分为两种:

astarted(启动):当应用程序组件(如activity)调用startService()方法启动服务时,服务处于started状态。

      started service(启动服务)是由其他组件调用startService()方法启动的,这导致服务的onStartCommand()方法被调用。当服务是started状态时,其生命周期与启动它的组件无关,并且可以在后台无限期运行,即使启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopSelf()方法停止,或者由其他组件调用stopService()方法停止。

bbound(绑定):当应用程序组件调用bindService()方法绑定到服务时,服务处于bound状态。

               使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。

    3)Content Provider:是Android提供的第三方应用数据的访问方案,可以派生Content Provider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的接口模型,大大简化上层应用,对数据的整合提供了更方便的途径。

a android 平台提供了 Content Provider 使一个应用程序的指定数据集提供给其他应用程序。其他应用可以 通过 ContentResolver 类从该内容提供者中获取或存入数据
b )只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。
c ContentProvider 实现数据共享 ContentProvider 用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为 android 没有提供所有应用共同访问的公共存储区。
d )开发人员不会直接使用 ContentProvider 类的对象,大多数是通过 ContentResolver 对象实现对 ContentProvider 的操作。

eContentProvider使用URI来唯一标识其数据集,这里的URIcontent://作为前缀,表示该数据由ContentProvider来管理。

    4)BroadCast Receiver:接受一种或者多种Intent作触发事件,接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型。

附加的内容---> android中的任务(activity栈)

a)任务其实就是activity的栈,它由一个或多个Activity组成,共同完成一个完整的用户体验。栈底的是启动整个任务的Activity,栈顶的是当前运行的用户可以交互的Activity,当一个activity启动另外一个的时候,新的activity就被压入栈,并成为当前运行的activity。而前一个activity仍保持在栈之中。当用户按下BACK键的时候,当前activity出栈,而前一个恢复为当前运行的activity。栈中保存的其实是对象,栈中的Activity永远不会重排,只会压入或弹出。

b)任务中的所有activity是作为一个整体进行移动的。整个的任务(即activity栈)可以移到前台,或退至后台。

(c)Android系统是一个多任务(Multi-Task)的操作系统,可以在用手机听音乐的同时,也执行其他多个程序。每多执行一个应用程序,就会多耗费一些系统内存,当同时执行的程序过多,或是关闭的程序没有正确释放掉内存,系统就会觉得越来越慢,甚至不稳定。为了解决这个问题,Android引入了一个新的机制,即生命周期(Life Cycle)。


12 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_alignParentRight等;

   5)TableLayout:表格布局,每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素。

    总结:每一个布局都有自己适合的方式,这五个布局元素可以相互嵌套应用,做出美观的界面。


13 android中的动画有哪几类?
两种:

1)Tween动画(补间动画):使试图组件移动,放大,缩小以及产生透明度的变化。

    Scale:缩放动画
    Rotate:旋转动画
    Translate:移动动画
    Alpha::透明渐变动画

2)是Frame动画(逐帧动画):传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。


14 android 中有哪几种解析xml的类?

    XML解析主要有三种方式,SAX、DOM、PULL。

     1)SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。

     2)而DOM方式会把整个XML文件加载到内存中去,该方法在查找方面可以和XPath很好的结合,如果数据量不是很大推荐使用。

     3)PULL解析器的运行方式和SAX类似,都是基于事件的模式,同样很节省内存。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。


附加内容-->Pull解析xml实例:

 Xml代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <books>  
  3.     <book id="12">  
  4.         <name>thinking in java</name>  
  5.         <price>85.5</price>  
  6.     </book>  
  7.     <book id="15">  
  8.         <name>Spring in Action</name>  
  9.         <price>39.0</price>  
  10.     </book>  
  11. </books>  

 Java代码  
  1.     public static List<Book> getBooks(InputStream inputStream) throws Exception{   
  2.         List<Book> books = null;   
  3.         Book book = null;   
  4.         XmlPullParser parser = Xml.newPullParser();   
  5.         parser.setInput(inputStream, "UTF-8");   
  6.            
  7.         int event = parser.getEventType();//产生第一个事件   
  8.         while(event!=XmlPullParser.END_DOCUMENT){   
  9.             switch(event){   
  10.             case XmlPullParser.START_DOCUMENT://判断当前事件是否是文档开始事件   
  11.                 books = new ArrayList<Book>();//初始化books集合   
  12.                 break;   
  13.             case XmlPullParser.START_TAG://判断当前事件是否是标签元素开始事件   
  14.                 if("book".equals(parser.getName())){//判断开始标签元素是否是book   
  15.                     book = new Book();   
  16.                     book.setId(Integer.parseInt(parser.getAttributeValue(0)));//得到book标签的属性值,并设置book的id   
  17.                 }   
  18.                 if(book!=null){   
  19.                     if("name".equals(parser.getName())){//判断开始标签元素是否是name   
  20.                         book.setName(parser.nextText());   
  21.                     }else if("price".equals(parser.getName())){//判断开始标签元素是否是price   
  22.                         book.setPrice(Float.parseFloat(parser.nextText()));   
  23.                     }   
  24.                 }   
  25.                 break;   
  26.             case XmlPullParser.END_TAG://判断当前事件是否是标签元素结束事件   
  27.                 if("book".equals(parser.getName())){//判断结束标签元素是否是book   
  28.                     books.add(book);//将book添加到books集合   
  29.                     book = null;   
  30.                 }   
  31.                 break;   
  32.             }   
  33.             event = parser.next();//进入下一个元素并触发相应事件   
  34.         }//end while   
  35.         return books;   
  36.     }   
14 Android的数据存储方式?

   作为一个完成的应用程序,数据存储操作是必不可少的。因此,Android系统一共提供了四种数据存储方式。分别是:SharePreference、SQLite、Content Provider和File。由于Android系统中,数据基本都是私有的的,都是存放于“data/data/程序包名”目录下,所以要实现数据共享,正确方式是使用Content Provider。

  1)SQLite: SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用的一种数据存储方式。Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的API。

  2)SharedPreference: 除SQLite数据库外,另一种常用的数据存储方式,其本质就是一个xml文件,常用于存储较简单的参数设置。

  3)File: 即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。

  4)ContentProvider: Android系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。每个Content Provider都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用Content Provider为这些数据定义一个URI,然后其他的应用程序就通过Content Provider传入这个URI来对数据进行操作。


15 请解释下单线程模型中Message、Handler、Message queue、Looper的关系?

 模型图如下:

    

   在Android中对这六个部分进行了抽象成四个独立的部分:Handler,Message,MessageQueue,Looper。

  • Message就是消息原型,包含消息描述和数据。
  • MessageQueue就是消息队列。
  • Looper完成消息循环。
  • Handler就是驾驭整个消息系统模型,统领Message,MessgeQueue和Looper。

16 什么是ANR,如何避免?

   ANR:Application Not Responding。在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应,当主线程中的耗时操作在5s内没能做出反应,BroadcastReceiver在10秒内没有执行完毕,就会出现应用程序无响应对话框,这既是ANR。

   避免方法:Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做耗时操作,例如网络或数据库操作,这些操作应该在子线程里(或者异步方式)来完成。主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。


17 Service和Thread的区别?

   1)Service是系统的组件,它由系统进程托管(Service Manager),它们之间的通信类似于client和server,是一种轻量级的ipc通信,这种通信的载体是binder,它是在linux层交换信息的一种ipc。

   2)Thread是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。


区别(控制问题):

   Thread的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。

   你可以把Service 想象成一种消息服务,而你可以在任何有Context 的地方调用Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它,你也可以在Service 里注册BroadcastReceiver,在其他地方通过发送broadcast 来控制它,当然这些都是Thread 做不到的。


18 AIDL的是什么,能处理哪些类型的数据?

       AIDL(AndRoid接口描述语言)是一种借口描述语言, 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的。如果需要在一个Activity中, 访问另一个Service中的某个对象,需要先将对象转化成AIDL可识别的参数(可能是多个参数),然后使用AIDL来传递这些参数, 在消息的接收端,,使用这些参数组装成自己需要的对象。

 AIDL的语法与Java接口的语法非常相似,但是存在一些差异:

    1)AIDL定义接口的源代码后缀必须以.aidl结尾。

    2)AIDL一样要指定AIDL接口的包信息package *。

    3)AIDL接口无需指定public、private、protected等作用域,可以理解为就是public。

    4)AIDL默认情况下只能传递基本类型、String、List、Map、CharSequence。

      5) 如果需要传递一个复杂类型的对象,就没那么简单了,需要额外做一些处理。如下:

             a) 定义数据接口的AIDL文件中,使用parcelable关键字,例如:parcelable Message;

             b) 在其数据实现类中实现Parcelable接口,并实现对应的方法。

             c) 在业务接口的AIDL文件中,使用import引入数据接口AIDL的包名。


19 android的优势与不足?

  优势: 

    1)开放性

     2)挣脱运营商的束缚

     3)丰富的硬件选择

     4)不受任何限制的开发商

     5)无缝结合的Google应用

不足:

     1)安全和隐私

     2)首先开卖Android手机的不是最大运营商

     3)运营商仍然能够影响到Android手机

     4)同类机型用户减少

     5)过分依赖开发商缺少标准配置

20 Android的IPC(进程间通信)机制 ?

     在linux中是以进程为单位分配和管理资源的,出于保护机制,一个进程不能访问另一个进程的资源,进程间是封闭的。而应用程序常常需要进程间进行通信来共享资源,所以操作系统提供了进程间的通信机制(IPC)。Android上几乎看不到IPC通信方式,取而代之的是Binder方式。


                 (图片转自红黑联盟)


你可能感兴趣的:(Android笔试面试题(二))