课程咨询 : 010-57154533

主页 > 企业招聘 > 安卓笔试题 > Android面试题大全(6)
  • Android面试题大全(6)

    发布:鸿运彩票网      来源:鸿运彩票网      时间:2016-06-03 11:41

  •   19. 请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。

      简单的说,Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理

      

      20. AIDL的全称是什么?如何工作?能处理哪些类型的数据?

      AIDL全称Android Interface Definition Language(AndRoid接口描述语言) 是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程跨界对象访问的目的.AIDL的IPC的机制和COM或CORBA 类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.理论上, 参数可以传递基本数据类型和String, 还有就是Bundle的派生类, 不过在Eclipse中,目前的ADT不支持Bundle做为参数,

      具体实现步骤如下:

      1、创建AIDL文件, 在这个文件里面定义接口, 该接口定义了可供客户端访问的方法和属性。

      2、编译AIDL文件, 用Ant的话, 可能需要手动, 使用Eclipse plugin的话,可以根据adil文件自动生产java文件并编译, 不需要人为介入.

      3、在Java文件中, 实现AIDL中定义的接口. 编译器会根据AIDL接口, 产生一个JAVA接口。这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法。接下来就需要自己去实现自定义的几个接口了.

      4、向客户端提供接口ITaskBinder, 如果写的是service,扩展该Service并重载onBind ()方法来返回一个实现上述接口的类的实例。

      5、在服务器端回调客户端的函数. 前提是当客户端获取的IBinder接口的时候,要去注册回调函数, 只有这样, 服务器端才知道该调用那些函数

      AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。 由于远程调用的需要, 这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:

      1. 不需要import声明的简单Java编程语言类型(int,boolean等)

      2. String, CharSequence不需要特殊声明

      3. List, Map和Parcelables类型, 这些类型内所包含的数据成员也只能是简单数据类型, String等其他比支持的类型.

      (另外: 我没尝试Parcelables, 在Eclipse+ADT下编译不过, 或许以后会有所支持).

      实现接口时有几个原则:

      .抛出的异常不要返回给调用者. 跨进程抛异常处理是不可取的.

      .IPC调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。 也就是IPC调用会挂起应用程序导致界面失去响应. 这种情况应该考虑单起一个线程来处理.

      .不能在AIDL接口中声明静态属性。

      IPC的调用步骤:

      1. 声明一个接口类型的变量,该接口类型在.aidl文件中定义。

      2. 实现ServiceConnection。

      3. 调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递.

      4. 在ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service). 调用

      YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换为YourInterface类型。

      5. 调用接口中定义的方法。 你总要检测到DeadObjectException异常,该异常在连接断开时被抛出。它只会被远程方法抛出。

      6. 断开连接,调用接口实例中的ApplicationContext.unbindService()

      

      21. 请解释下Android程序运行时权限与文件系统权限的区别。

      apk程序是运行在虚拟机上的,对应的是Android独特的权限机制,只有体现到文件系统上时才使用linux的权限设置。

      Android系统有的权限是基于签名的。

      

      22. 系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由。

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

      23. 有一个一维整型数组int[]data保存的是一张宽为width,高为height的图片像素值信息。请写一个算法,将该图片所有的白色不透明(0xffffffff)像素点的透明度调整为50%。

      24、什么是ANR 如何避免它?

      答:ANR:Application Not Responding,五秒在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现下列情况时,Android就会显示ANR对话框了:

      对输入事件(如按键、触摸屏事件)的响应超过5秒

      意向接受器(intentReceiver)超过10秒钟仍未执行完毕

      Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intent broadcast)。

      因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如onCreate()和 onResume()等更应如此。潜在的比较耗时的操作,如访问网络和数据库;或者是开销很大的计算,比如改变位图的大小,需要在一个单独的子线程中完成 (或者是使用异步请求,如数据库操作)。但这并不意味着你的主线程需要进入阻塞状态已等待子线程结束 — 也不需要调用Therad.wait()或者Thread.sleep()方法。取而代之的是,主线程为子线程提供一个句柄(Handler),让子线程 在即将结束的时候调用它(xing:可以参看Snake的例子,这种方法与以前我们所接触的有所不同)。使用这种方法涉及你的应用程序,能够保证你的程序 对输入保持良好的响应,从而避免因为输入事件超过5秒钟不被处理而产生的ANR。这种实践需要应用到所有显示用户界面的线程,因为他们都面临着同样的超时 问题。


上一篇:Android面试题大全(5)

下一篇:Android面试题大全(7)

最新开班日期

开班时间 2017/02/20
距离开班时间还剩

1 2 3
©2016 鸿运彩票网 版权所有 京ICP备15049804-3号