Android Inter

882 阅读19分钟

 Java中的String类可以被继承么?

答:不能,因为它是一个final类,同样的还有Integer,Float,Boolean,Byte,Character,Long,Short等等,也就是说,所有基本类型的包装类都是final类,无法被继承或修改

如何安全的退出一个已经开启多个activity的APP

答:在Application中持有一个全局的集合(List),进而在其onCreate()方法添加到这个集合,最终遍历所有的activcity并finish。
ActivityCompat.finishAffinity(this);

简单的概叙下Handler?

答:andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换
1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。

  1. Message Queue(消息队列):用来存放线程放入的消息。
    4)线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。

文件的上传?

答:使用HttpURLConnection得到输入流,将文件的通过IO流的方式上传到服务器。可使用第三方Xutils框架。

ListView的源码和如何优化Listview?

答:根据ConvertView来判断View的重用还是新建,新建的话通过ViewHolder来存储所有的控件并设置到View的Tag中有利于下次的复用。

AIDL原理?

答:AIDL是一个缩写,全称是Android Interface Definition Language,也就是Android接口定义语言。
实现进程间通信,尤其是在涉及多进程并发情况下的进程间通信,我们可以通过AIDL来制定一些规则,规定它们能进行哪些交流。
通过接口的方式创建AIDL文件的后缀是 .aidl,而不是 .java。
创建一个类实现刚才那个aidl的接口,通过预先定义的接口达到两个进程内部通信进程的目的,在Service中Aidl返回一个Binder对象。

Binder机制

Binder是Android的系统进程通许方式之一简称IPC
Binder使用Clinet->Server通讯方式,Binder框架定义的四个角色,Server,Client,ServiceManager,以及Binder驱动,其中Server,Client,ServiceManager运行于用户空间,驱动运行于内核空间,Binder驱动程序提供Dev/binder与用户空间交互,Server,Client,ServiceManager,通过open和ioctl文件操作函数和Binder交互。
深入理解Binder机制

TCP和UDP的区别,tcp如何保证可靠的,丢包如何处理?

TCP面向连接,三次握手,发送需要确定以链接状态(如打电话),辑通信信道是全双工的可靠信道
UDP无连接,发送数据无需确定是否连接(如邮差),则是不可靠信道
将文件分块发送,接收端每收到一块数据就发送一个收到确认给发送方(包括收到的数据长度)
发送方在收到接收方发送的“收到确认”后才接着发送下一块数据。。。。
直到整个文件发送完毕。
每块数据都加一个包头,里面可以包含一些标志信息,如:是否所有数据发送完毕(即最后一个包了)
三次握手简单的说就是:(C:客户端,S:服务端)
C:SYN到S 客户端发送SYN(SEQ=1022)报文给服务器端,客户端进入SYN_SEND状态
S:如成功--返回给C(SYN+ACK),回应一个SYN (SEQ=2032)ACK(ACK=1022+1)报文,服务器段进入SYN_RECV状态。
C:如成功---返回给S(ACK) 客户端收到服务器端的SYN报文,回应一个ACK(ACK=2032+1)报文,进入Established状态。

什么是三级缓存?三级缓存原理

答:网络加载,不优先加载,速度慢,浪费流量
本地缓存,次优先加载,速度快
内存缓存,优先加载,速度最快
首次加载 Android App 时,肯定要通过网络交互来获取图片,之后我们可以将图片保存至本地SD卡和内存中
之后运行 App 时,优先访问内存中的图片缓存,若内存中没有,则加载本地SD卡中的图片,最后选择访问网络。

Service的两种启动方法,有什么区别 ?

答:1.在Context中通过public boolean bindService(Intent service,ServiceConnection conn,int flags) 方法来进行Service与Context的关联并启动,并且Service的生命周期依附于Context(不求同时同分同秒生!但求同时同分同秒屎!!)。
2.通过public ComponentName startService(Intent service)方法去启动一个Service,此时Service的生命周期与启动它的Context无关。

View和SurfaceView的区别?

答:SurfaceView中采用了双缓存技术,在单独的线程中更新界面
View在UI线程中更新界面
当程序需要更新View上的图像时,程序必须重绘View上显示的整张图片
新线程无法直接更新View组件

Android的进程优先级

答:android的系统进程分为五个等级, Foreground Process(前台进程), Visible Process(可见进程), Service Process(服务进程), Background Process(后台进程), Empty Process(空进程)

自定义View相关知识,下拉刷新的实现原理?

答:【1】Header 通常有下拉箭头,文字,进度条等元素,根据下拉的距离来改变它的状态,从而显示不同的样式
【2】Content 这部分是内容区域,网上有很多例子都是直接在ListView里面添加Header,但这就有局限性,因为好多情况下并不一定是用ListView来显示数据。把要显示内容的View放置在一个容器中,如果想实现一个用ListView显示数据的下拉刷新,需要创建一个ListView旋转到容器中。处理这个容器的事件(down,move,up),如果向下拉,则把整个布局向下滑动,从而把header显示出来。
【3】Footer可以用来显示向上拉的箭头,自动加载更多的进度条等。
亦可以使用开源PullToRefreshView

在你项目中所用到的第三方?

Volley xUtils okHttp(支持图片上传) ImageLoader RxJava Retrofix dataBing
Google推荐的图片加载库Glide介绍
目前Android在使用的Json解析框架主要有Jackson、Gson、FastJson、org.json;
源码解析
使用 picasso 加载图片;使用 EventBus 同步不同页面间对象状态
UI框架优化,增加RefreshFragment基类抽取
通过LeakCanary、TraceView等工具进行内存检测,优化内存的使用,构建一套服务业务需求的线程池
熟练掌握okhttp,glide,greenDao等主流框架;

Android中原生HttpClient和HttpUrlConnection来处理网络操作比较复杂,需要我们处理很多操作:如果图片的缓存和请求的调度。

简单的说下Retrofit的使用流程?

Retrofit2在项目中的完整使用流程:创建Bean类 --> 创建接口形式的http请求方法 --> 通过Retrofit.builder()创建接口对象并调用http方法请求网络数据 --> 在RxJava的Observable(被观察者)中异步处理请求结果!

项目中有没有见过内存泄漏以及OOM?为什么会产生?怎么解决的?

内存泄漏它是造成应用程序OOM的主要原因之一
在android应用开发中,当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了。
全局变量的滥使用,加载对象过大,相应资源过多,来不及释放,资源未关闭造成的内存泄漏。
在内存引用上做些处理,常用的有软引用、强化引用、弱引用
在内存中加载图片时直接在内存中作处理,如边界压缩
及时回收不用的对象如Bitmap,IO流。

Android系统的有哪些安全机制?

应用程序签名机制,权限申明机制,访问控制机制,进程通讯机制,内存管理机制。

Android-Service和Thread的区别?

service是android四大组件之一,没有任何界面,它不是一个线程,一般在后台默默运行。有自己的生命周期。有本地service和远程service,本地service一般有2中启动方式,startService和bindservice. 远程service就是所谓的AIDL,实现跨进程调用.
thread是java里的一个线程概念,跟service是完全不同的。1中说的service特点,thread在android中大多没有。尤其是生命周期和跨进程调用,thread是没有的。

Android图片缓存之初识Glide

Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide五大Android开源组件加载网络图片的优缺点比较

Asset目录与res目录的区别

ANR问题,force close问题,activity,service,broadcast各自超过多少秒报ANR

Activity启动模式,intent匹配规则

Android反编译

JNI和native方法

Android系统的有哪些安全机制

Dalvik和ART区别

Android屏幕适配有哪些方法

View事件体系,滑动冲突

View绘制原理,性能问题(view绘制间隔16ms,60fps),measure,layout,draw三大过程

如何避免overdraw

Android动画分类和各自特点

View和SurfaceView的区别

APK瘦身的办法

Android如何获取Crash信息

ANR日志分析

Android动态加载,如何解决方法数越界

Android怎么加速启动Activity

Android内存泄漏问题,内存泄漏分析工具

Android内存溢出问题,图片的三级缓存

Zygote和System进程的启动过程

Activity的启动过程

Android的消息机制,Handler原理

HandlerThread和IntentService的原理和特点

Binder机制原理

一个如何维持一个长连接

如何实现进程保活

Binder底层为什么用红黑树,红黑树的原理知道吗

为什么选用Glide,原理?

LruCache的原理

Fragment好处,碰到过什么bug,怎么解决的

如何设计一个网络加载框架

Android四大组件的理解

ContentProvider的启动过程

Activity的四种启动模式,用过哪一种,为什么要用

Service和InentService的区别

View的事件分发和绘制原理

如何解决滑动冲突

多进程通信的方式

广播的使用

广播的种类

如何解决app卡顿的问题,用到哪些工具

view的绘制流

Android的启动流程、四大组件、listview的运用于优化、MVP、两个activity怎么传输数据,intent是怎么实现传输数据的,闹钟怎么实现

fragment,该怎么用,比如实现类似微信的那种滑动,讲了一下fragment的滑动以及底部状态的切换。之后又问了怎么保存view的数据,当时以为就是回调生命周期的方法时保存数据,面试官就给我讲了一下现在常用了的将顶层的view作为变量然后传递引用,之后切换回来的时候直接在oncreateview里面进行判断即可。

Activity与Fragment的生命周期。

Acitivty的四中启动模式与特点。

Service的生命周期,两种启动方法,有什么区别。

怎么保证service不被杀死。

广播的两种注册方法,有什么区别。

Intent的使用方法,可以传递哪些数据类型。

Thread、IntentService的使用场景与特点。

五种布局:FrameLayout、LinearLayout、AbsoluteLayout、RelativeLayout、TableLayout各自特点及绘制效率对比。

Android的数据存储形式。

Merge、ViewStub的作用。

Json有什么优劣势。

Handler、Loop消息队列模型,各部分的作用。

怎样退出终止App。

Asset目录与res目录的区别。

Android怎么加速启动Activity。

Android中弱引用与软引用的应用场景。

Bitmap的四中属性,与每种属性队形的大小。

Touch事件分发机制。

Android长连接,怎么处理心跳机制。

Zygote的启动过程。

looper是线程级别还是进程级别

zygote和systemservice的关系

activity四种启动模式

打开一个activity的过程

项目点为什么要用view不用fragment?同样fragment可以解决缓存(用了view,并且设了map作为缓存,为了模拟activity栈重制了新的栈来实现相同的回退功能,需要处理连续点击和多次点击的问题,还需要解决连续点view,缓存增大而oom)

用了什么设计模式?为什么要这么用?(举例了观察者+工厂)

谈一下Collection包:hashmap底层实现,用了什么方法解决hash冲突(基于jdk版本),具体是如何实现(jdk1.5链表头插还是尾插),为什么不安全?如何变得安全(concurrent包下集合类),concurrentHashmap实现原理是?

Executor框架说说你的理解?

结束一条Thread有什么方法?interrupt底层实现有看过吗?线程的状态是怎么样的?如果给你实现会怎么样做?

Io和nio有没有了解?

缓存算法除了lru还认识哪种?

Java中有内存泄露吗?是怎么样的情景?为什么不用循环计数?

ANR产生原因?怎么定位?

ContextImpl的源码使用的设计模式?为什么你认为其中有外观?

在一个app中,只有在一张activity,所有功能业务逻辑在里面实现,现在报ANR,你会怎么做?(代码层面:耗时操作(UI、网络、数据库),工具层面:trace和crashHandle)

Android中ClassLoader和java中有什么关系和区别

Activity生命周期?情景:现在在一张act1点了新的act2,周期如何?

Act的launchMode,有没有结合项目用过(自己的程序锁和微信的PC端登陆对比,不过我现在又发现,应该大约估计可能是动态加载的一个缺陷,如果有找到相关信息,请务必跟我说。具体问题就是,当在PC端登录时,Android终端的微信会跳出,即使wechat的task不是在fore,当按下确认,返回的是wechat,而不是自己先前的app)

View的绘制原理,有没有用canvas自己画过ui?

动态加载主要问题

Assetmanager获取资源原理和资源获取原理

项目Oom异常解决方案+用户体验优化方案

Touch传递机制+listview滑动冲突

项目如何解决oom?响应速度是怎么优化?电量消耗如何优化?

屏幕适配使用的方案?有没有辅助的工具帮助?(hyviewer)

如何分析内存泄露?(代码+工具traceview+mat)

View树绘制?如何优化布局?

事件传递原理?

屏幕适配接触到什么方法?

java内存泄露是怎么样的?(本质+handler例子)

情景题,把handler设static,里面需要对一个view更新,会不会内存泄露?(可达性分析)

UI接触得多吗?有没有用过canvas画过图?

在项目中为什么要用动态加载?最大的问题是什么?怎么解决资源管理问题

描述下Aidl?觉得aidl有什么缺陷

两个应用能使用同一个任务栈么?

大图加载

Http && Https

常用的加密算法,对称加密和非对称加密

Android里的序列化

两个应用间Binder通信的原理

OkHttp如何对链接进行复用

如何设计锁

内存泄漏如何发现(用什么工具)

在纸上写了个Activity,然后在类里面定义了一个Handler,问我这个会有警告,怎么解决?--static、软引用

Handler机制,Handler除了线程通信还有什么作用,这个我说通知吧,因为Android是消息驱动的,不是特别明白面试官要问哪点,难道是延时?

实现一个文件夹列表,面试官要求5000个文件的时候才从ViewGroup转到ListView

ART和Dalvik的区别

批量插入50条联系人,比较高效的方法,ContentProvider是否了解原理

broadcast机制

thread.wait()与thread.sleep()区别

okhttp原理

线程池机制

onSaveInstanceState和onRestoreInstanceState调用的过程和时机,onNewIntent方法

fragment的生命周期,和Activity如何进行通信

Android的事件分发机制,ACTION_DOWN和后续事件如何消耗

View的绘制流程,MeasureSpec如何工作,父的MeasureSpec和自己的LayoutParams

Handler Looper的使用方式,实现机制,设计的原因

HandlerThread有没有了解

ThreadLocal是干嘛的,使用的地方

Service与Thread区别,这个问题应该是必问的了

SQLite能否并发读取或者写入,自己只记得不能并发写,可以并发读

Activity与Service的通信问题,这里要对Binder机制和AIDL比较了解,因为自己没在项目中用过,所以回答的不是很好。这个还可以通Broadcast进行通信。

ViewPager如何判断左滑右滑

android7.0的虚拟机的优化(什么即时编译)

sqlite如何批量插入大量数据,如何提高效率(放到一个事务里)

fragment 和activity之间如何选择(说出自己的理解)

说说推送 ,扯到长连接,心跳包,直接被面试官打断,这个我们都知道,说说保持一个长连接很简单,为什么长连接会带来很多麻烦,还提示从耗电量,微信分析

从listview优化谈到recyclerview,深入分析一下recyclerview特点 ,然后引申到瀑布流如何实现,不使用recyclerview如何实现瀑布流。

属性动画

Android中的几种Context什么区别?这个问题我回答的不好,简单说了一下生命周期和Context的继承关系,以及注意事项弹对话框不能使用applicatuion的上下文

接着问我bitmap能否复用?也是3.0以后的有个Option的inbitmap字段可以复用

平时遇到过OOM没?遇到过,主要是图片加载很常见,我讲了BitmapFactory的解析Options的in...bound参数先读取图片信息进行必要的缩放,还有缓存,讲了DiskLruCache、LruCache缓存策略,以及可以加入软引用,讲了底层的LinkedHashMap实现。

自定义控件做过哪些,需要注意什么?处理wrap_content的情况,ondraw不能耗时,刷新率16ms等,然后让我讲了一下圆角矩形的图片控件怎么做,降到了画笔的xferm...方法进行图面交叠。

view和viewGroup区别

内存溢出处理

Activity能运行在别的进程中吗?

Bitmap的recycle方法执行后会立即回收内存吗?

Activity中如何调用另一个进程Service里的方法?

AIDL的方式能访问另一个进程Service里静态变量吗?

View的事件冲突的解决办法 ps:重写dispatchEvent()或者touch()方法

讲一下RecycleView与listview的区别

如何解析json数据和xml

RecycleView的优化

几种context的区别

activity关闭后尚未运行完毕的thread会怎么样 ps:会变成空进程线程,优先级最低 很容易被终止回收

图片三级缓存 内存缓存满了怎么办 ps:优先级队列 满了后根据优先级主动删除一部分图片 根据LRU算法确定优先级

CotentProvider的权限问题,就是怎么样使得数据对外有选择性的提供和使用

Android的存储方式

onTouch事件的处理机制

说一下OOM以及你怎么解决的

viewpager里面只能嵌套view吗 可不可以嵌套Activity

假如viewpager里面的每一页都有有很大数据量的内容,那么在快速的左右滑动时,如果出现了内存被回收的情况,如何处理 假如出现了OOM,怎么处理

同上情况,使用Fragment,又当如何?与viewpager有什么区别ExpandableListView的Adapter怎么写

在ListView的每个item中如果可能出现的view都不一样,如何处理?动态获取view种类数量的话是不是就不能使用viewHolder进行优化?固定显示view如果不存在该种view就不显示的方法是否太耗内存

ListView的Adapter的getView具体是什么机制?

在全屏显示高清大图的时候,网速慢的情况下如何显示?渐进式显示是怎么做到的?如果想显示下载进度圈圈,该如何实现?

说一下HandlerThread

假如你要记录ListView滚动到的位置,要记录什么信息,view怎样获得坐标信息

说一下canvas

dialog和popupwindow的应用场景 如果popupwindow在没有dismiss的时候Activity finish了,会出现什么情况?

Service和推送通知,通知有没有可能出现有推送但是通知栏收不到通知?service被kill掉会如何?如何保证service不被kill掉

Scrollview和ListView有什么相似点 有什么不同 那如果这两个是继承关系 那应该是谁继承谁?

dp sp px各自的应用场景是什么 换算关系是什么 使用sp的时候如果调整系统字体,显示字体会跟着调整吗?

handler.postAtTime不是延时post么 那handler怎么延时处理Message

一个activity只能有一个进程么【对进程的理解】

夜间主题的实现方式

动态加载原理,classloader理解

listview实现item左滑需要考虑的问题

listview原理,adapter与view是如何绑定的,如何自己设计一个类似listview的自定义view,子item复用,管理以及getView的实现

推送服务原理,心跳机制

ssl协议,握手交换密钥过程,加密算法,对称非对称加密原理

socket编程实现http请求,手写代码实现

处理listview图片错位方式

Java线程 run与start区别,原理实现

打包混淆原理

反编译方式工具及其原理

对称加密与非对称加密

sharepreference原理

动态加载,dex分包,热修复

如何减小apk体积

性能优化从哪几方面考虑(内存,cpu,fps,ddms灵活dump)

加载图片请求的超时时间设置,多少秒合适,原因,大图如何加载。

应用签名是为了什么,签名原理是什么

root之后有什么重大的变化,开发者可以操作什么

Binder的一次拷贝发生在哪里。

AMS的作用?

Serializable和Parcelable。

canvas画了个线,怎么撤销?

bitmap加载一个100张图片的优化处理

lrucache和disklrucache

隐式启动和显示启动

Service两种启动方式

布局优化相关

一个app能否是多进程

线程池内线程的数量如何确定

说说OKHTTP的实现

socket

surfaceView

如何进行界面优化

哪些android进程不能被杀死的?

图片压缩方式

cookie和session的区别

虚拟机相关知识

断点续传原理

三级缓存的理解