一、抽象类与接口的区别?
1、抽象类可以提供成员方法的实现细节,而接口中只能存在 public 抽象方法; 2、抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的; 3、接口中不能含有构造器、静态代码块以及静态方法,而抽象类可以有构造器、静态代码块和静态方法; 4、一个类只能继承一个抽象类,而一个类却可以实现多个接口; 5、抽象类访问速度比接口速度要快,因为接口需要时间去寻找在类中具体实现的方法; 6、如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 7、如果你往接口中添加方法,那么你必须改变实现该接口的类。 8、接口更多的为了约束类的行为,可用于解耦,而抽象类更加侧重于代码复用。
二、Java 中深拷贝与浅拷贝的区别?
1、浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝, 此为浅拷贝。 2、深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝
三、什么是反射机制?反射机制的应用场景有哪些?
Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。 应用场景:1. 逆向代码,例如反编译2. 与注解相结合的框架,如 Retrofit3. 单纯的反射机制应用框架,例如 EventBus(事件总线)4. 动态生成类框架 例如Gson
四、谈一谈Java成员变量,局部变量和静态变量的创建和回收时机?
成员变量:生命周期伴随类对象,类对象回收时回收,存在堆里。 静态变量:不回收,在方法区随着类的加载而加载,随着类的消失而消失,由于类需要非常长时间的不使用,不利用,不关联,才有可能会被回收机制回收,所以静态成员变量的生命周期特别长,除非是共享数据,否则不建议使用静态; 局部变量:方法调用时创建 方法结束时被标记为可回收,存在栈里
五、扩展:内部类都有哪些?
有四种:静态内部类、非静态内部类、局部内部类、匿名内部类
六、线程池的好处
1、线程池的重用: 线程的创建和销毁的开销是巨大的,而通过线程池的重用大大减少了这些不必要的开销,当然既然少了这么多消费内存的开销,其线程执行速度也是突飞猛进的提升。
2、控制线程池的并发数: 初学新手可能对并发这个词语比较陌生,特此我也是结合百度百科和必生所学得出最优解释,万万记着并发可跟并行不一样。
七、为什么 Android 要采用 Binder 作为 IPC 机制?
简单来说,Binder 是android系统工程师为android 定制的一个跨进程通信方法,当然它也不是android 系统原创的,是参考了OpenBinder的实现而引进到Google的。Binder是综合了android系统的特点,从性能,设计架构,安全性等几个方面的综合平衡而设计的,具体的关于Binder的实现细节,朋友们可以参考 上面的题目 《描述下Binder机制原理》进行系统学习。
应该从几个方面与传统IPC机制做对比。
- 性能方面
- 拷贝数据需要花时间,Binder只需拷贝一次,共享内存无需拷贝,其他的需要拷贝两次。
- 从速度上来说,Binder仅次于共享内存,优于Socket,消息队列,管道,信号,信号量等。
- 特点方面
- Binder:基于C/S 架构,易用性高。
- 共享内存:
- 多个进程共享同一块内存区域,必然需要某种同步机制。
- 使用麻烦,容易出现数据不同步,死锁等问题。
- Socket:
- 主要用在跨网络的进程间通信和本机上进程间的低速通信。
- socket作为一款通用接口,其传输效率低,开销大。
- 安全性方面
- Binder:(安全性高)
- 为每个APP分配不同UID,通过UID鉴别进程身份。
- 即支持实名Binder,又支持匿名Binder。
- 传统IPC:(不安全)
- 访问接入点是开放的,任何程序都可以与其建立连接。
- 完全依赖上层协议,只能由用户在数据包中填入UID/PID。
通过上面几个比较,特别是安全性这块,所以最终Android选择使用Binder机制进行通信。
八、如何避免OOM
1.ArrayMap/SparseArray代替hashmap
2.避免在android里面使用Enum
3.减少bitmap的内存占用
inSampleSize:缩放比例,在把图片载入内存之前,我们需要先计算出一个合适的缩放比例,避免不必要的大图载入。
decode format:解码格式,选择ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差异。
4.减少资源图片的大小,过大的图片可以考虑分段加载
九、ANR 是什么?怎样避免和解决 ANR
ANR->Application Not Responding
也就是在规定的时间内,没有响应。
三种类型:
1). KeyDispatchTimeout(5 seconds) —主要类型按键或触摸事件在特定时间内无响应
2). BroadcastTimeout(10 seconds) —BroadcastReceiver在特定时间内无法处理完成
3). ServiceTimeout(20 seconds) —小概率类型 Service在特定的时间内无法处理完成
为什么会超时:事件没有机会处理 & 事件处理超时
十、怎么避免ANR
ANR的关键是处理超时,所以应该避免在UI线程,BroadcastReceiver 还有service主线程中,处理复杂的逻辑和计算而交给work thread操作。
1)避免在activity里面做耗时操作,oncreate & onresume
2)避免在onReceiver里面做过多操作
3)避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。
4)尽量使用handler来处理UI thread & workthread的交互。
十一、如何解决ANR
首先定位ANR发生的log:
04-01 13:12:11.572 I/InputDispatcher( 220): Application is not responding: Window {2b263310com.android.email/com.android.email.activity.SplitScreenActivitypaused=false}. 5009.8ms since event, 5009.5ms since waitstarted CPUusage from 4361ms to 699ms ago ----CPU在ANR发生前的使用情况
04-0113:12:15.872 E/ActivityManager( 220): 100%TOTAL: 4.8% user + 7.6% kernel + 87% iowait
04-0113:12:15.872 E/ActivityManager( 220): CPUusage from 3697ms to 4223ms later:-- ANR后CPU的使用量
十二、android 应用对内存是如何限制的?我们应该如何合理使用内存?
activitymanager.getMemoryClass() 获取内存限制。
关于合理使用内存,其实就是避免OOM & 内存泄露中已经说明。
十三、请解释下 Android 程序运行时权限与文件系统权限的区别
文件的系统权限是由linux系统规定的,只读,读写等。
运行时权限,是对于某个系统上的app的访问权限,允许,拒绝,询问。该功能可以防止非法的程序访问敏感的信息。
十四、多线程间通信和多进程之间通信有什么不同,分别怎么实现
线程间的通信可以参考第6点。
进程间的通信:bind机制(IPC->AIDL),linux级共享内存,boradcast,Activity 之间,activity & serview之间的通信,无论他们是否在一个进程内。
十五、Android 中的动画有哪几类,它们的特点和区别是什么
视图动画,或者说补间动画。只是视觉上的一个效果,实际view属性没有变化,性能好,但是支持方式少。
属性动画,通过变化属性来达到动画的效果,性能略差,支持点击等事件。android 3.0
帧动画,通过drawable一帧帧画出来。
Gif动画,原理同上,canvas画出来。
十六、SurfaceView & View 的区别
view的更新必须在UI thread中进行
surfaceview会单独有一个线程做ui的更新。
surfaceview 支持open GL绘制。
十七、 Android 开发的四大组件分别是
活动(activity):用于表现功能。
服务(service):后台运行服务,不提供界面呈现。
广播接受者(Broadcast Receive):用于接收广播。
内容提供者(Content Provider),支持多个应用中存储和读取数据,相当于数据库。
十八、Android生命周期
onCreate:当Activity第一次被运行时调用此方法,可用于加载布局视图,获取控件命名空间等一些初始化工作。
onRestart:当Activity被重新启动的时候,调用此方法onStart :表示Activity正在被启动,已经从不可见到可见状态(不是指用户可见,指Activity在后台运行,没有出现在前台),但还是无法与用户进行交互。
onResume :表Activity已经变为可见状态了,并且出现在前台工作了,也就是指用户可见了
onPause :表示Activity正在暂停,但Activity依然可见,可以执行一些轻量级操作,但一般不会进行太多操作,因为这样会影响用户体验。
onStop :表示Activity即将暂停,此时Activity工作在后台,已经不可见了,可以与onPause方法一样做一些轻量级操作,但依然不能太耗时。
onDestroy :表示活动即将被销毁。