Android面试题

1.Handler机制原理

UI线程创建时,就创建了一个Looper,Looper内部维护这一个MessageQueue。
Looper通过开启一个while(true)死循环来轮询MessageQueue中的Message。
当Looper轮询到Message时,就分发此Message。
Handler在子线程发送消息到MessageQueue,Message被Looper取出来后,分发给handler的handleMessage方法来处理。


2.android 事件分发机制

总结一下同种分发的几条规律:
对于activity来说dispatchTouchEvent中无论是返回ture/false都会将事件消费,即不会再往下面传播,只有return super的时候才会传到 ViewGroup()
对于dispatchTouchEvent和onTouchEvent来说return false会把该事件交给父容器来处理
对于onInterceptTouchEvent来说返回false,顾名思义,该viewGroup将不会拦截该事件,这个事件就可以继续向下传播了,如果onInterceptTouchEvent返回ture就表明该ViewGroup将会拦截该事件,事件将会交给该组件的onTouchEvent来处理,事件也就不会再往下面的组件分发了
对于onTouchEvent来说对于传入他的事件,如果返回ture就代表该事件已经被消费,则流程就终止,如果返回false,那么就代表该事件将不会由他处理,将会将给父容器的onTouchEvent来处理。
每个ViewGroup每次在做分发的时候,问一问拦截器要不要拦截(也就是问问自己这个事件要不要自己来处理)如果要自己处理那就在onInterceptTouchEvent方法中 return true就会交给自己的onTouchEvent的处理,如果不拦截就是继续往子控件往下传。默认是不会去拦截的,因为子View也需要这个事件,所以onInterceptTouchEvent拦截器return super.onInterceptTouchEvent()和return false是一样的,是不会拦截的,事件会继续往子View的dispatchTouchEvent传递。
看下ViewGroup 的dispatchTouchEvent,之前说的return true是终结传递。return false 是回溯到父View的onTouchEvent,然后ViewGroup怎样通过dispatchTouchEvent方法能把事件分发到自己的onTouchEvent处理呢,return true和false 都不行,那么只能通过Interceptor把事件拦截下来给自己的onTouchEvent,所以ViewGroup dispatchTouchEvent方法的super默认实现就是去调用onInterceptTouchEvent
那么对于View的dispatchTouchEvent return super.dispatchTouchEvent()的时候呢事件会传到哪里呢,很遗憾View没有拦截器。但是同样的道理return true是终结。return false 是回溯会父类的onTouchEvent,怎样把事件分发给自己的onTouchEvent处理呢,那只能return
super.dispatchTouchEvent,View类的dispatchTouchEvent()方法默认实现就是能帮你调用View自己的onTouchEvent方法的。


3.open GL绘制

1,创建GLSurfaceView组件,使用activity来显示GlSufaceView组件
2,为GLSufaceView组件创建GLSufaceView.Renderer实例,实现GLSurfaceView.Renderer类时需要实现接口里的三个方法。
3,调用GLSurfaceView组件的setRender()方法指定Renderer对象。该Renderer对象完成GLSurfaceView里3D图形的绘制。


4.GridLayout的使用

GridLayout是Android4.0引入的网格布局,使用它可以减少布局嵌套。


5.Android开发怎么做第三方登录?

1、你们需要支持用户注册
2、你们需要在应用登录的时候提供第三方平台的图标
3、用户点击第三方平台图标以后,你们尝试判断用户是否已经授权
4、如果用户授权,获取他的唯一识别符,比方说WeiboDb里面的weiboId这个字段
5、如果用户没有授权,引导用户授权,授权成功后也可以获取weibo Id
6、然后用这个唯一识别符登录你们的系统,如果用户已经注册,则应该让用户登录到你们的系统,流程结束
7、如果你们的系统发现用户没有注册,引导用户进入你们应用的注册页面,并通过share sdk的showuser方法获取用户资料,自动帮助用户完成注册资料的填写,然后等待用户确认
8、如果用户确认了注册信息,你们的应用就根据他的信息完成这注册操作,如果操作成功,则应该让用户登录到你们的系统,流程结束


6.Android 第三方支付

调用安全支付数据的流程

购买 Buy 
生成订单 Create order info 
订单签名 Sign order 
调用安全支付服务 Call SecurePayment 
回调支付结果 Callback payment result 
商户验签支付结果 Merchant check the signature of payment result 
结束 Finish


7.android 进程保活

《提升进程优先级的方式》
Activity提权,监听屏幕的息屏和解锁,使用一个1个像素的Activity
Service提权,Service通过startForground方法来开启一个Notification

《进程拉活》
通过广播的方式
通过Service在onStartCommand的返回值,START_STICK,由系统拉活,在短时间内如果多次被杀死可能就再也启动不了了
通过账户同步拉活
通过JobSchedule拉活
通过Service的bind启动的方式,双进程守护拉活
推送拉活
Native fork子进程的方式拉活


8.Android插件化

插件化概念
插件化开发就是将整个app拆分成很多模块,每个模块都是一个apk,最终打包的时候将宿主apk和插件apk分开打包,插件apk通过动态下发到宿主apk。

插件化优点
宿主和插件分开编译
可并发开发,都是apk,开发互不影响(宿主需要给插件下发一个context)
动态更新插件
按需下载模块
可解决方法数超过65536的问题


9.MVP模式的整个核心流程:

View与Model并不直接交互,而是使用Presenter作为View与Model之间的桥梁。其中Presenter中同时持有View层的Interface的引用以及Model层的引用,而View层持有Presenter层引用。当View层某个界面需要展示某些数据的时候,首先会调用Presenter层的引用,然后Presenter层会调用Model层请求数据,当Model层数据加载成功之后会调用Presenter层的回调方法通知Presenter层数据加载情况,最后Presenter层再调用View层的接口将加载后的数据展示给用户。

10.android之onNewIntent()用法

 standard:默认启动模式不使用
singleTop:栈顶复用模式,在栈顶再次进入时使用,不在栈顶或返回时不使用
singleTask:栈内复用模式,再次进入时使用,返回时不使用
singleInstance:单实例模式,再次进入时使用,返回时不使用


11.Android tcp/ip

TCP 面向连接的、可靠的流协议
IP 在源地址和目的地址之间传送的数据包

《TCP中的三次握手》
客户端请求建立连接。
服务端应答客户端,并请求建立连接。
客户端针对服务端请求确认应答。
《TCP中的四次挥手》
客户端发送关闭请求
服务端响应客户端关闭请求
服务端发送关闭请求
客户端发送关闭确认请求


12.Socket是什么

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。


13.热修复的原理

而Android虚拟机——Dalvik/ART VM 是加载类的dex文件,而热修复的解决方法就是将新的dex添加到该集合中,并且是在旧的dex的前面,
所以就会优先被取出来并且return返回。


14.Android内存泄露

内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,
内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间, 


15.线程池

FixedThreadPool:一种线程数量固定的线程池,只有核心线程并且核心线程不会被回收,没有超时机制,任务队列也没有大小限制。
优点:能够更快地响应外界的请求。
2、CachedThreadPool:一种线程数量不固定的线程池,最大线程数可以任意大,美滋滋,只有非核心线程,有超时机制,超时时长为60s;
优点:适用于执行大量耗时较少的任务。
3、ScheduledTheadPool:核心线程数固定,非核心线程数没限制,非核心线程闲置立即被回收。
优点:主要用于执行定时任务和具有固定周期的任务。
4、singleTheadExecutor:只有一个核心线程,确保所有的任务都在同一个线程中顺序执行。
优点:不需要处理线程同步的问题。


16.设计模式

较为常用的就是单例设计模式,工厂设计模式以及观察者设计模式,
一般需要保证对象在内存中的唯一性时就是用单例模式,例如对数据库操作的 SqliteOpenHelper 的对象。
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新


17.Android的数据存储方式

1、使用Shared Preferences存储数据,用来存储key-value,pairs格式的数据,它是一个轻量级的键值存储机制,只可以存储基本数据类型。
2、使用文件存储数据,通过FileInputStream和FileOutputStream对文件进行操作。在Android中,文件是一个应用程序私有的,一个应用程序无法读写其他应用程序的文件。
3、使用SQLite数据库存储数据,Android提供的一个标准数据库,支持SQL语句。
4、使用Content Provider存储数据,是所有应用程序之间数据存储和检索的一个桥梁,它的作用就是使得各个应用程序之间实现数据共享。它是一个特殊的存储数据的类型,它提供了一套标准的接口用来获取数据,操作数据。系统也提供了音频、视频、图像和个人信息等几个常用的Content Provider。如果你想公开自己的私有数据,可以创建自己的Content Provider类,或者当你对这些数据拥有控制写入的权限时,将这些数据添加到Content Provider中实现共享。外部访问通过Content Resolver去访问并操作这些被暴露的数据。
5、使用网络存储数据


18.android 系统版本差异

Android5.0:Android运行时由Android核心库集和Dalvike虚拟机改成Android核心库集和ART(Android Runtime)模式
Android6.0:动态权限
Android7.0:在官方7.0的以上的系统中,尝试传递 file://URI可能会触发FileUriExposedException。要应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider类。
Android8.0:Android 8.0之后通知权限默认都是关闭的,无法默认开启以及通过程序去主动开启,需要程序员读取权限开启情况,然后提示用户去开启。
Android9.0:Android 9 支持最新的全面屏,其中包含为摄像头和扬声器预留空间的屏幕缺口。 通过 DisplayCutout类可确定非功能区域的位置和形状,这些区域不应显示内容。 要确定这些屏幕缺口区域是否存在及其位置,使用 getDisplayCutout() 函数。
Android10.0:Scoped Storage(分区存储)
Android11.0:存储机制更新


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值