一。.简单概述SVN与Git的区别?
1.GIT是分布式的,SVN不是
2.GIT把内容按元数据方式存储,而SVN是按文件
3.GIT分支和SVN的分支不同
4.GIT没有一个全局的版本号,而SVN有
5.GIT的内容完整性要优于SVN
二.简述listview的优化策略?
1.对convertView进行判空,为空时加载新布局,不为空时复用。
2.定义ViewHolder,减少findViewByid的次数
3.加载数据过多时采用分页加载和图片异步加载。
三.Intent可以传递哪些数据类型?
1.简单或基本的数据类型
2.传递一个Bundle
3.传递serializable对象
4.Intent
四.事件冲突的解决
解决ScrollView(垂直滚动的一个布局)嵌套ListView问题?
1、手动设置ListView高度
2.使用单个ListView取代ScrollView中所有内容
3.使用LinearLayout取代ListView
4.自定义可适应ScrollView的ListView
解决ListView嵌套ViewPager时,滑动事件冲突?
点击打开链接
因为ViewPager是放在ListView上面的,所以当我们点击ViewPager时,这个事件就被最上层的ViewPager给拦截了,ListView获取不到这个事件,所以我们就要根据不同的情况来传递给ListView和ViewPager这个触摸事件.
我们需要判断这个滑动事件是传递给ViewPager来执行还是ListView来执行,
这里不得不提到一个方法:getParent().requestDisallowInterceptTouchEvent(boolean disallowIntercept);,这个方法是判断事件是由父view处理还是子view来处理;
我们重写一个类来继承ViewPager,重写public boolean dispatchTouchEvent(MotionEvent ev) 这个方法,这个方法是用来进行事件的分发;在这个方法中来判断手指的动作,我们记录手指放下的位置,当手指移动时,我们判断手指滑动的距离,当在x轴上的滑动距离大于y轴上的滑动距离时,这个时候应该滑动事件就应该传递给ViewPager来处理,这个时候调用:getParent().requestDisallowInterceptTouchEvent(boolean disallowIntercept);这个方法,参数设置为true,这就是ViewPager自行处理滑动事件,而不是传递给ListView来处理滑动事件,当在y轴上的滑动距离大于x轴上的滑动距离时,这个时候,再次调用getParent().requestDisallowInterceptTouchEvent(boolean disallowIntercept);这个时候我们把参数设置为false,这样滑动事件就由ListView来处理,而不是传递给ViewPager处理.
简单理解就是(利用事件分发机制,在方法中记住手指放下的位置,记录手指在X轴和Y轴的滑动距离,当X轴滑动的距离大于Y轴滑动距离的时候,事件传递给ViewPager来处理,把上面方法的参数设置为True,同理Y轴距离大于X轴距离,事件传递给ListView,将参数设置为false)。
五.自定义控件的实现思路:
很多时候会遇到系统框架中提供的控件无法满足我们产品的设计需求,这时候需要使用自定义view。
View绘制分为三个过程:
OnMeasure(测量,算出自己需要占用多大的面积);
OnLayout(设置宽高);
OnDraw(在canvas 画布上画出我们需要的View样式);
1.需要自定义一个类继承该控件,比如继承View;
2.重写里面的构造方法;
3.重写view的onDraw方法,绘制控件的样式,这里你使用canvas来绘制,你布局中使用这个控件就是你绘制的样子
4.在XML中引入该类就可以了。
六.简述Android中的事件分发机制:
dispatchTouchEvent(事件分发) onInterceptTouchEvent(事件拦截) onTouchEvent(事件响应)
Touch事件发生时,会触发 dispatchTouchEvent,如果返回True,表示事件被消费,如果返回False,会传递给onInterceptTouchEvent,在事件拦截事件中,如果返回True,表示事件被消费,如果返回False,会传递给onTouchEvent,在事件响应中,如果返回True,表示事件被消费,如果返回False,那么这个事件会从当前View向上传递,并且都是由上层View的onTouchEvent来接收,如果传递到上面的onTouchEvent也返回False则接着向上传递,直到最上层如果还是返回False,则该事件会消失。
七.简述Activity的四种启动模式:
(standard singleTop singleTask singleInstance)
standard
默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。
singleTop
(正常情况下突然出现的聊天界面)
栈顶复用模式,可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
singleTask
(浏览器 ,主-a-b-c)
栈内复用模式,是一种单实例模式,只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。(例如:
若我的应用程序中有三个Activity,C1,C2,C3,三个Activity可互相启动,其中C2为singleTask模式,那么,无论我在这个程序中如何点击启动,如:C1->C2->C3->C2->C3->C1-C2,C1,C3可能存在多个实例,但是C2只会存在一个,并且这三个Activity都在同一个task里面。)
singleInstance
(闹钟(弹出),支付宝支付界面)
单实例模式,这是一种加强的singletask模式,除了具有singletask特性外还加强了一点那就是只能单独的位于一个任务栈中,
只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。
八.简述屏幕适配的方案:
分为 屏幕尺寸匹配 和 屏幕密度匹配
屏幕尺寸匹配分为布局匹配(建议使用相对布局,禁用绝对布局),布局组件匹配(使用权重,自适应,充满来控制视图组件的宽度和高度),图片资源匹配(自动拉伸位图)和用户界面流程匹配。
屏幕密度匹配分为布局控件匹配,图片资源匹配。
九.图文混排的实现思路:
通过ImageSpan来放置图片,再创建一个SpannableString对象,以便插入用ImageSpan对象封装的图像,最后用ImageSpan对象替换你指定的字符串,完成EditText的图文混排
在 TextView 中显示图片,可以使用Html.fromHtml(source, imageGetter, tagHandler)通过自定义imageGetter来异步加载图片,最后完成图文混排。
十.简述对OkHttp框架的认识:
一个处理网络请求的开源项目,是安卓端最火热的轻量级框架.替代HttpUrlConnection和Apache HttpClient
优势:
1.允许连接到同一主机地址的所有请求,提高请求效率。
2.共享Socket,减少对服务器的请求次数。
3.通过连接池,减少了请求延迟。
4.缓存响应数据,减少重复的网络请求。
5.减少了对数据流量的消耗。
6.自动处理GZip压缩。
功能:
1.get post请求;
2.文件的上传下载。
3.加载图片
4.支持请求回调,直接返回对象,对象集合;
5.支持session的保持。
十一.支付宝的支付流程:
十二.图片加载框架的几种区别:
主要对比 (Imageloader,Picasso,Glide,Fresco)
<< Universal ImageLoader 是很早开源的图片缓存,在早期被很多应用使用
- ImageLoader实现Bitmap三级缓存: 内存——磁盘——网络
ImageLoader 收到加载及显示图片的任务,并将它交给 ImageLoaderEngine,ImageLoaderEngine 分发任务到具体线程池去执行,任务通过 Cache 及 ImageDownloader 获取图片,中间可能经过 BitmapProcessor 和 ImageDecoder 处理,最终转换为Bitmap 交给 BitmapDisplayer 在 ImageAware 中显示。
①支持下载进度监听
②可以在 View 滚动中暂停图片加载:
可以通过 PauseOnScrollListener 接口可以在 View 滚动中暂停图片加载。
③默认实现多种内存缓存算法:ImageLoader 默认实现了较多缓存算法,如 Size 最大先删除、使用最少先删除、最近最少使用、先进先删除、时间最长先删除等。
ImageLoader 收到加载及显示图片的任务,并将它交给 ImageLoaderEngine,ImageLoaderEngine 分发任务到具体线程池去执行,任务通过 Cache 及 ImageDownloader 获取图片,中间可能经过 BitmapProcessor 和 ImageDecoder 处理,最终转换为Bitmap 交给 BitmapDisplayer 在 ImageAware 中显示。
①支持下载进度监听
②可以在 View 滚动中暂停图片加载:
可以通过 PauseOnScrollListener 接口可以在 View 滚动中暂停图片加载。
③默认实现多种内存缓存算法:ImageLoader 默认实现了较多缓存算法,如 Size 最大先删除、使用最少先删除、最近最少使用、先进先删除、时间最长先删除等。
>> picasso是Square公司开源的一个Android图形缓存库,可以实现图片下载和缓存功能
Picasso不仅实现了图片异步加载的功能,还解决了android中加载图片时需要解决的一些常见问题:
自带内存和硬盘二级缓存功能
①自带统计监控功能:支持图片缓存使用的监控,包括缓存命中率、已使用内存大小、节省的流量等。
②没有本地缓存:但是配合okhhtp的缓存使用
Glide是一个高效、开源、 Android设备上的媒体管理框架,Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的API,这些API使开发者能够将Glide应用在几乎任何网络协议栈里。创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果(滚动流畅),另一个是支持远程图片的获取、大小调整和展示
>>特点
①图片缓存->媒体缓存Glide 不仅是一个图片缓存,它支持 Gif、WebP、缩略图。甚至是 Video,所以更该当做一个媒体缓存。
十三.Android各版本的区别?
android 5.0与之前相比有什么区别?
1.多核处理器的优化
2.运行速度比3.1提高1.8倍;
android 6.0与之前相比有什么区别?
1.原生的应用权限管理;(无需第三方应用和Root权限,用户可以在安
装应用时选择关闭一些应用权限。)
2.指纹识别
3.流量保护模式
4.锁屏下语音搜索
5.菜单键快速应用切换(双击菜单键,就能自动切换到上一个应用)
十四.简述利用HTTPS进行加密的流程:
注意,为了更好的区分明文和密文,用【AA】代表AA被加密,AA 代表正常未加密
1.client 发出请求
2.server 收到请求,并自己生成一对密钥,即 公钥S 和 私钥S
3.server 把生成的 公钥S 传递给 client (除了 公钥S ,还有很多额外信息)
4.client 收到 公钥S后进行判断,若无效,弹出警告,否则生成一串随机数,我们称之为 私钥C ,然后 client 用 server 传过来的 公钥S 对该随机数加密,形成【私钥C】
5.client 把【私钥C】传递给 server
6.server 收到【私钥C】,用 私钥S 把【私钥C】解密成私钥C,然后把需要传递的数据用 私钥C 进行加密
7.server 把【数据】传递给 clien
8.client 收到【数据】,用 私钥C 解密,完成一波收割
(用HTTPS进行加密的优点:利用非对称加密的安全性来加密那一串随机数--私钥C;利用对称加密的快捷性来加密报文,总体来说就是把真正加密解密的密钥(私钥C)用公钥S和私钥S来加密)
注:对称加密:是指加密和解密用一致的密钥,特点是快!!!
非对称加密:指密钥区分公钥和私钥,公钥加密,私钥解密(私钥好比唯一一把钥匙,公钥好比锁,钥匙只有一把,但锁可以有很多,被锁头锁上的数据全天下只有一把私钥才能打开),特点是安全,但是慢!!!
十五.单例模式的优缺点:
优点:
-
提供了对唯一实例的受控访问
-
由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
-
允许可变数目的实例
缺点:
-
由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
-
单例类的职责过重,在一定程度上违背了”单一职责原则”。
-
滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失
单例模式例子:
Public class A{
Private static A instance=null;
public synchronized static A GetInstance(){
if(instance==null){
instance=new A();
}
return instance;
}
}
十六.TCP和UDP的区别?
TCP是面向连接的协议,也就是说在收发数据前,必须和对方建立可靠的连接,一个TCP连接必须经过三次握手才能建立起来。
UDP是一个非连接的协议,传输数据之前源端和终端不建立连接
区别:TCP和UDP都是网络传输协议,所有基于网络访问的过程都可能涉及这两个协议。TCP是可靠连接,即传输的数据必须完整,UDP是不可靠连接,即传输过程不保证数据的完整性,如语音聊天时,当网络条件不好情况下,可能会丢失内容。
http协议:应用层协议,并且http协议是基于tcp连接的,主要解决的是如何包装协议的
tcp协议:传输层协议,通常也叫做tcp/ip协议,主要解决数据如何在网络中传输
udp协议:传输层协议,用户数据报协议,不可靠的协议,只负责把应用层的协议的数据传送到ip层的数据报,而不管数据是否到达。
ip协议:网络层。
socket连接:长连接(是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元,说白了socket就是一组调用接口(API),封装了做tcp/ip开发的网络接口,通过Socket,我们才能使用TCP/IP协议。)
http连接:短连接
TCP/IP协议和Http协议之间的关系:
TPC/IP协议是传输层协议,主要解决数据 如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据,而socket则是对TCP/IP协议的封装和应用(程序员层面上)。实际上http协议就是建立在tcp/ip协议之上的。
tcp/ip协议, http协议,socket三者之间的关系:
实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,它只是提供了一个针对TCP或者UDP编程的接口。
十七.内存泄露产生的原因及解决方法?
原因:持有对象的强引用,且没有及时释放,进而造成内存单元一直被占用,浪费空间,甚至可能造成内存溢出!
解决办法: 数据库的cursor没有关闭 (及时关闭)
对Adapter进行优化
加载图片时,Bitmap对象不使用recycle()释放内存
静态变量引起内存泄露
使用Application的Context
UI界面优化
十八.MVP与MVC的区别?
MVC:
MVC全称是Model - View - Controller,是模型(model)-视图(view)-控制器(controller)的缩写。MVC是一种框架模式而非设计模式,使用 MVC,把业务逻辑抽离到 Controller 中,让 View 层专注于显示 UI。
优点: (1)首先就是理解比较容易,技术含量不高,这对开发和维护来说成本较低也易于维护与修改。
(2)耦合性不高,表现层与业务层分离各司其职,对开发来说很有利。
缺点:模型和视图要严格的分离,这样也给调试应用程序带来了一定的困难。每个构件在使用之前都需要经过彻底的测试。
MVP:
MVP模式是MVC模式的一个演化版本,MVP全称Model-View-Presenter。目前MVP在Android应用开发中越来越重要了。
优点: (1)MVP模式会解除View与Model的耦合,有效的降低View的复杂性。同时又带来了良好的可扩展性、可测试性,保证系统的整洁性和灵活性。
(2)MVP模式可以分离显示层与逻辑层,它们之间通过接口进行通信,降低耦合。
区别:
MVP中View不能直接访问Model,需要通过Presenter发出请求,View与Model不能直接通信。
十九.启动服务的两种方式,及区别?
startservice 和bindservice
区别:
1. 使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行
2. 使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
二十.Android 四大组件
1.Activity
1)一个Activity通常就是一个单独的屏幕(窗口);
2)Activity之间通过Intent进行通信;
3)Android每一个应用中的Activity都必须在AndroidManifest.xm配置文件中声明,否则系统将不识别也不执行该Activity.
2.Service(服务)
1)Service用于在后台完成用户指定的操作,Service分为两种:
(a)started(启动):当应用程序组件(如activity)调用startService()方法启动服务时,服务处于started状态。
(b)bound(绑定):当应用程序组件调用bindService()方法绑定到服务时,服务处于bound状态。
Service生命周期?
1.StartService
Oncreate
OnstartCommand
Ondestroy
2.BindService
Oncreate
OnBind
OnUnbind
OnDestroy
startService()与bindService()区别:
当服务是started状态时,其生命周期与启动它的组件无关,并且可以在后台无限期运行,即使启动服务的组件已经被销毁,服务仍然运行。
使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止;
Service完整的生命周期从调用onCreate()开始直到调用onDestroy()结束。
Service有两种使用方法:
(1)以调用Context.startService()启动,而以调用Context.stopService()结束。
(2)以调用Context.bindService()方法建立,以调用Context.unbindService()关闭。
Service通常位于后台运行,它一般不需要与用户交互,因此Service组件没有图形用户界面。Service组件需要继承