Android面试必知

来源:互联网 发布:把矩阵化为最简形矩阵 编辑:程序博客网 时间:2024/05/16 10:41

常常听到公司技术面试官面试一些Android程序员的问题,总结部分问题及答案,如下:

1----说说mvc模式的原理,它在android中的运用
答:android的官方建议应用程序的开发采用mvc模式。何谓mvc?
mvc是model,view,controller的缩写,mvc包含三个部分:
 l模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
2视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
3控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给m哦得了处理。
  在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里面处理,当然对业务计算等操作也是必须放在的该层的。
2----你曾经用到的android手机访问服务端的方式有哪些?
  Android手机访问服务端的方式有两种,分别是:通过socket访问和通过Http协议发送Post和Get请求。
   Socket是长连接,服务端和客户端之间通过Socket建立连接,首先ServerSocket将在服务端监听某个端口,当发现客户端有Socket来试图连接它时,它会接受该Socket的连接请求,同时在服务端建立一个对应的Socket与之进行通信。这样就有两个Socket了,客户端和服务端各一个。
   发送get和post协议,通过HTTP协议建立短连接。客户端发送请求(Request),服务器端收到后根据请求的类型返回相应的响应(response)。
3----什么是TCP和IP,它们位于网络模型的哪层?
TCP是传输控制协议,IP是internet协议,TCP在网络模型中与UDP一样同属于第二层(传输层),IP属于三层(网络层),IP用于确定主机在网络中的位置,而TCP与UDP用于标示不同的服务,即应用程序。
4----进程间通信机制,传统IPC 和 Binder
答:传统的进程间通信机制IPC 有管道(Pipe)、信号(Signal)和跟踪(Trace),这三项通信手段只能用于父进程和子进程之间,或者兄弟进程之间;后来又增加了命令管道(Named Pipe),使得进程间通信不再局限于父子进程或兄弟进程之间。后来又出现了报文队列(Message)、共享内存(Share Memeory)和信号量(Semaphore)。Android系统没有采用上述提到的各种进程间通信机制,而是采用Binder机制,它是基于OpenBinder来实现的。
它提供了远程过程调用(RPC)功能,在Android系统的Binder机制中,有一系列组件组成包括 Client、Server、ServiceManager和Binder驱动程序。
5----Android中什么是ANR,如何应对或者如何避免它?
答:  ANR 就是application not responding 
    在android中Activity的最长执行时间是5秒.
BroadcastReceiver的最长执行时间则是10秒.
超出执行时间就会产生ANR.
解决方法: 1.运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法 (如onCreate()和onResume())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message 的方式做一些操作,比如更新主线程中的ui等) 2. 应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。
6----你后台的Activity被系统回收怎么办:
当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B 这个时候A会执行
Java代码
public
void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("id", 1234567890);
}
public void
onSaveInstanceState(Bundle outState) {}
B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回 onCreate()里是带上参数 savedInstanceState,没被收回的就还是onResume就好了。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。
Java代码
if(savedInstanceState !=null){
long id =savedInstanceState.getLong("id");
}
if(savedInstanceState !=null){
就像官方的Notepad教程里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来。

以上问题可能你已经知道,但当你面试的时候,面试官会问的非常细,如在你做的app中哪些地方会用到它,你选择它的原因是什么,有更好的吗,假如你遇到这个问题你怎么解决等等,这就要求我们在对知识的掌握中要更加的熟练

0 0