我的面试总结

来源:互联网 发布:适合抓握的鼠标 知乎 编辑:程序博客网 时间:2024/06/05 02:31

最近由于公司状况不好被迫离职 加入离职大军的队伍中  如今还有三个月过年 面试越来越少  有些公司根本不需要人  苦恼啊 

下面我总结了一些最近的面试题 有需要的可以看看  试着问自己怎么答  

布局优化

1、尽可能减少布局的嵌套层级

可以使用 sdk 提供的 hierarchyviewer 工具分析视图树,帮助我们发现没有用到的布局。

2、不用设置不必要的背景,避免过度绘制

比如父控件设置了背景色,子控件完全将父控件给覆盖的情况下,那么父控件就没有必要设置背景。

3、使用<include>标签复用相同的布局代码

4、使用<merge>标签减少视图层次结构

该标签主要有两种用法:

1) 因为 所有的 Activity 视图 的根节 点都 是 FrameLayout ,因 此如果 我们 的自定 义的布 局也是

FragmenLayout 的时候那么可以使用merge 替换。

2) 当应用 Include 或者 ViewStub 标签从外部导入 xml 结构时,可以将被导入的xml 用 merge 作为根节

点表示,这样当被嵌入父级结构中后可以很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点。

<merge>只能作为 xml 布局的根元素。

5、通过<ViewStub>实现 View 的延迟加载

 

android底层用到的设计模式

1.建造者模式:AlertDIalog.Builder

2.适配器模式:BaseAdapter

3.观察者模式:onClickListener

4工厂模式:BitMapFactory

5.迭代器模式:Iterator(把这个也算在其中吧.....)

6.service(singleton)

网络模型


 

极光推送的底层原理

\

IP地址 分配原理 :

-- IP 地址有限 : IPv4 的 IP 地址数量有限, 运营商要动态地为 手机分配 IP 地址, 这些 IP 地址都是运营商的内网IP;

-- 网络地址转换 (NAT) : 全称 NetworkAddress Translation, 网关维护一个外网 IP 地址, 与内网 IP 地址对应;

-- 外网 IP 不固定 : 由于运营商持有的外网 IP数量有限, 需要动态的分配给接入运营商的用户, 因此在手机一段时间没有数据传输时会将该手机分配的外网 IP 地址收回, 分配给其它用户;

-- 解决方案 : Android 手机端想要保持长链接, 首先外网 IP 地址不能变, 不能让运营商收回 这个 IP 地址;

 

Android 手机端实现方案 :

-- 心跳 : 为了长时间保持外网 IP,需要客户端定期发送心跳给运营商, 以便刷新 NAT 列表;

-- Timer 定时方法 : 该类计划循环执行定时任务,但是使用该类会使 CPU 保持唤醒状态, 比较费电;

-- AlarmManager 定时方法 : 该类封装了 Android手机的 RTC 硬件时钟模块, 可以在 CPU 休眠时正常运行, 定时任务执行时再唤醒 CPU, 这样做到了电量节省;

推送的原理

1) SMS 方式推送

 

SMS 推送 :

-- SMS : Short Message Service 缩写, 即短信服务;

-- 实现方式 : 服务器端向手机端发送短信,手机监听短信广播, 然后将拦截的短信信息进行显示;

-- 优点 : 省电, 省流量, 在没有网络的偏远地点也能接收到推送消息;

-- 缺点 : 费钱, 一毛钱一条;

 

(2) 轮询 方式推送

 

轮询推送 :

-- 实现方式 : 周期性主动获取网络中的数据;

-- 缺点 : 费电, 费流量;

 

(3) 长链接 方式推送

 

长链接推送 : 主流方法;

-- 实现方式 : 手机端与服务器端建立一条长时间的数据流链接, 手机客户端一直等待服务器端的数据;

-- 优点 : 有一条长链接, 有数据的时候才发送数据, 没有时不消耗流量, 比较省流量;

-- 缺点 : 由于要保存一条长链接, 比较费电; 在网络不稳定的情况下, 推送容易失败;

mvc  mvp mvvm 的区别

模式介绍 
MVC:Model-View-Controller 
MVP:Model-View-Presenter 
MVVM:Model-View-ViewModel

区别与联系 
相同点:

  • Model:数据对象,同时,提供本应用外部对应用程序数据的操作的接口,也可能在数据变化时发出变更通知。Model不依赖于View的实现,只要外部程序调用Model的接口就能够实现对数据的增删改查。
  • View:UI层,提供对最终用户的交互操作功能,包括UI展现代码及一些相关的界面逻辑代码。

不同点: 
三者的差异在于如何粘合View和Model,实现用户的交互操作以及变更通知

  • Controller接收View的操作事件,根据事件不同,或者调用Model的接口进行数据操作,或者进行View的跳转,从而也意味着一个Controller可以对应多个View。Controller对View的实现不太关心,只会被动地接收,Model的数据变更不通过Controller直接通知View,通常View采用观察者模式监听Model的变化。

  • Presenter与Controller一样,接收View的命令,对Model进行操作;与Controller不同的是Presenter会反作用于View,Model的变更通知首先被Presenter获得,然后Presenter再去更新View。一个Presenter只对应于一个View。根据Presenter和View对逻辑代码分担的程度不同,这种模式又有两种情况:Passive View和Supervisor Controller。

  • ViewModel,注意这里的“Model”指的是View的Model,跟MVVM中的一个Model不是一回事。所谓View的Model就是包含View的一些数据属性和操作的这么一个东东,这种模式的关键技术就是数据绑定(data binding),View的变化会直接影响ViewModel,ViewModel的变化或者内容也会直接体现在View上。这种模式实际上是框架替应用开发者做了一些工作,开发者只需要较少的代码就能实现比较复杂的交互。 

http报文

 一个HTTP请求报文由请求行(request line)、请求头部(header)、空行请求数据4个部分组成,下图给出了请求报文的一般格式。

get和post区别

 区别一
01.get是从服务器上获取的数据。
02.podt则是向服务器传送数据。
区别二
01.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。
02.post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
区别三
01.get方式,服务器端用Request.QueryString获取变量的值。
02.post方式,服务器端用Request.Form获取提交的数据。
区别四
01.get传送的数据量较小,不能大于2KB。
02.post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
区别五
01.get安全性比较低。
02.post安全性较高。
区别六
01.根据 HTTP 规范,GET 用于信息获取,而且应该是 安全的和幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。 比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。
02.POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了
区别七
01.在FORM提交的时候,如果不指定Method,则默认为GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。字母数字字符原 样发送,但空格转换为“+“号,其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII(或ISO Latin-1)值。GET请求请提交的数据放置在HTTP请求协议头中。
02.而POST提交的数据则放在实体数据中;GET方式提交的数据最多只能有1024字节,而POST则没有此限制


asnyTask和Thread的区别

AsyncTask实现的原理和适用的优缺点

AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.

使用的优点:

简单,快捷

过程可控     

使用的缺点:

在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来。

thread是java中的线程类,在andoid中其实通过Handler实现的。

Handler的特点

Handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中,

它有两个作用:

(1)安排消息或Runnable 在某个主线程中某个地方执行

(2)安排一个动作在不同的线程中执行

Handler中分发消息的一些方法

post(Runnable)

postAtTime(Runnable,long)

postDelayed(Runnable long)

sendEmptyMessage(int)

sendMessage(Message)

sendMessageAtTime(Message,long)

sendMessageDelayed(Message,long)

以上post类方法允许你排列一个Runnable对象到主线程队列中,

sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.

intentService

IntentService 是 Service 的子类,比普通的 Service 增加了额外的功能。先看 Service 本身存在两个问题:
Service 不会专门启动一条单独的进程,Service 与它所在应用位于同一个进程中;
Service 也不是专门一条新线程,因此不应该在 Service 中直接处理耗时的任务;

服务怎么样不会被系统回收掉

 对于Service被系统回收,一般做法是通过提高优先级可以解决,在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时实用于广播,推荐大家如果你的应用很重要,可以考虑通过系统常用intent action来触发。

面向对象的思想

抽象就是把事物的信息细节进行提炼、抽象,找到事物的本质和重要属性,以求简化、概括所观察到的现实世界,并为人们所用。抽象包括两个方面,一是过程抽象,二是数据抽象。过程抽象是指任何一个明确定义功能的操作都可被使用者看作单个的实体看待,尽管这个操作实际上可能由一系列更低级的操作来完成。数据抽象定义了数据类型和施加于该类型对象上的操作,并限定了对象的值只能通过使用这些操作修改和观察。抽象是软件开发的基础。

  封装是将数据以及加在这些数据上的操作组织在一起,成为有独立意义的对象或构件。这些构件隐藏了外部无法直接访问的一些数据,并提供一定的访问接口来进行操作这些数据。信息隐藏是用户对封装性的认识,封装则为信息隐藏提供支持。封装保证了模块具有较好的独立行、自治性,使得程序维护修改较为容易。

  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。这也是对事物进行抽象分析之后得出的结果。对象的一个新类可以从现有的类中派生,这个过程称为类的继承,新类可以从它所派生的类那里继承方法和实例变量,并且可以修改或增加新的变量、方法使之更适合特殊的需求。继承性很好地解决了软件的可重用性问题。

  多态是指对同一操作或消息不同的对象能做出不同的响应。多态性包括参数化多态性包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。其中会涉及的两个概念覆盖和重载,是多态性的表现形式。覆盖,是指子类重新定义父类的虚函数的做法。重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

  面向对象的编程思想能够使得人们在编写程序、设计软件的过程中有迹可循,以更加熟悉和普遍的思维模式,更高效地编写出更具有可维护性、可扩展性、可复用性的程序软件,这也是每一个程序员现阶段编程必须具备的基本素质,也是成为更加优秀程序员的必备的知识

 

动画都有什么 他们的特点

两种,一种是tween动画,一种是frame动画。tween动画,这种实现方式可以使视图组件移动,放大或缩小以及产生透明度的变化。frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。