一、Android四大组件
1、Android设计模式有哪些?什么是代理模式,工厂模式?简单工厂模式和抽象工厂模式的区别?
单例模式:
书写单例模式代码。单例的实现方式很多,比如懒汉式、饿汉式、静态内部类、双重锁检查、枚举等方式,所以要清楚每种实现方式的主要特点和使用场景。
饿汉模式在类被初始化时就已经在内存中创建了对象,以空间换时间,故不存在线程安全问题。
懒汉模式在方法被调用后才创建对象,以时间换空间,在多线程环境下存在风险。
2、Service两种启动模式的区别?bindService方式创建服务时,ServiceConnection可以监听服务的状态,有几种标识状态?
生命周期区别;与Activity生命周期的关系。
ServiceConnection可以监听服务的状态,在进行服务绑定的时,其标志位可以为以下几种(这里列出3种):
1).Context.BIND_AUTO_CREATE
说明:表示收到绑定请求的时候,如果服务尚未创建,则即刻创建,在系统内存不足需要先摧毁优先级组件来释放内存,且只有驻留该服务的进程成为被摧毁对象时,服务才被摧毁
2).Context.BIND_DEBUG_UNBIND
说明:通常用于调试场景中判断绑定的服务是否正确,但容易引起内存泄漏,因此非调试目的的时候不建议使用
3).Context.BIND_NOT_FOREGROUND
说明:表示系统将阻止驻留该服务的进程具有前台优先级,仅在后台运行,该标志位位于Froyo中引入。
3、Activity四种启动模式,出栈进栈机制。
10、项目中常用的框架
11、Activity、Fragment、Service生命周期
参考:https://blog.csdn.net/q1113225201/article/details/76595460
Activity:
onCreate():Activity第一次启动时执行;
onStart():Activity处于可见状态的时候执行;
onResume():Activity可以得到用户焦点的时候执行;
onPause():Activity可见但失去焦点的时候执行;
onStop():Activity处于不可见状态的时候执行;
onRestart():Activity没有被销毁的时候重新调用这个Activity的时候执行;
onDestory():Activity被销毁的时候执行;
Fragment:
onAttach():Fragment和Activity完成绑定;
onCreate():初始化Fragment,只调用一次;
onCreateView():初始化Fragment的布局;
onActivityCreated():Activity的onCreate方法执行完后调用;
onStart():Fragment可见时执行;
onResume():Fragment可获取焦点时执行;
onPause():Fragment可见但失去焦点时执行;
onStop():Fragment不可见时执行;
onDestoryView():Fragment布局被移除,但未与Activity解除绑定;
onDestory():销毁Fragment;
onDetch():解除与Activity的关联;
Service:
startService启动:onCreate,onStartCommand,onDestroy
bindService启动:onCreate,onBind,onUnBind,onDestroy
12、Android 6.0,7.0以及以上各个版本,在开发中需要注意的事情。
13、binder通信机制,binder如何被不同app进程使用的,binder如何启动
二、多线程
1、Android创建线程的两种方式及比较
继承Thread;实现Runnable接口。
2、线程优先级设置
setPriority来设置线程的优先级,这个范围是 0- 10,默认为5
3、AsyncTask如何实现主线程与工作线程之间异步通信
4、HandlerThread的使用
继承Thread类、封装了handler类
5、线程池实现机制,常用的四种线程池。
FixedThreadPool——可重用固定线程数的线程池,数量固定的线程池,且任务队列也没有大小限制;
只有核心线程,且这里的核心线程也没有超时限制,因为它不会被回收,所以它能更快的响应
CachedThreadPool——根据需要创建线程的线程池
线程数量不固定的线程池;可以进行自动线程回收,只有非核心线程,且最大线程数为Integer.MAX_VALUE
适合做大量的耗时较少的任务
SingleThreadExecutor——单个工作线程的线程池
只有一个核心线程,所有任务都在同一线程中按序执行,这样也就不需要处理线程同步的问题.
ScheduledThreadPool——能实现定时和周期性任务的线程池
它的核心线程数量是固定的,而非核心线程是没有限制的,且非核心线程空闲时会被回收;适合执行定时任务和具有固定周期的任务
线程池为什么要用(阻塞)队列?
因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换。
创建线程池的消耗较高。线程池创建线程需要获取mainlock这个全局锁,影响并发效率,阻塞队列可以很好的缓冲。
线程池为什么要使用阻塞队列而不使用非阻塞队列?
阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使得线程进入wait状态,释放cpu资源。当队列中有任务时才唤醒对应线程从队列中取出消息进行执行。使得在线程不至于一直占用cpu资源。
RejectedExecutionHandler:饱和策略(共4种):
1.AbordPolicy:无法处理新任务,并抛出RejectedExecutionException异常。
2.CallerRunsPolicy:用调用者所在的线程来处理任务。此策略提供简单的反馈控制机制,能够减缓新任务的提交速度。
3.DiscardPolicy:不能执行的任务,并将该任务删除。
4.DiscardOldestPolicy:丢弃队列最近的任务,并执行当前的任务。
6、静态方法加锁和非静态方法加锁,访问区别。
7、volatile作用
8、线程为什么会不安全?线程不安全的解决方案?
线程安全是指在多线程环境下,每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的。
9、并发下HashMap为什么不是线程安全的?解决用ConcurrentHashMap
10、ThreadLocal是什么
ThreadLocal并不是一个Thread,而是Thread的局部变量。
11、eventbus原理
三、进程
1、AIDL通信为什么需要把对象数据序列化?从一个进程传输对象到另一个进程,对象是否还为同一个对象?
不是同一个对象,因为进程不共享内存,因此对象存储地址不共享,对象存储地址变了,所以对象不是一个对象。
2、AIDL 通信机制&Stub源码分析
3、Servie中实现AIDL接口的Stub类,源码是否看过?Stub类内部包含哪些方法?
四、网络
1、tcp和udp的区别
五、集合
1、HashMap的工作原理
hashing的概念
HashMap中解决碰撞的方法
equals()和hashCode()的应用,以及它们在HashMap中的重要性
不可变对象的好处
HashMap多线程的条件竞争
重新调整HashMap的大小
put和get的操作过程
2、四种引用类型的区别
强引用(Strong Reference)内存不足,不回收。
软引用(WeakReference)内存足不回收,内存不足回收。
弱引用(SoftReference)每次都回收。
虚引用(PhantomReference)不拥有对象实例,对象被回收,会收到系统通知。
3、arraylist
Collections.sort方法,默认升序。
4、hashMap键是个对象,如何排序?
(1)创建一个简单的HashMap,并插入一些键和值。
Map
hashMap.put("Five", 5);
hashMap.put("Seven", 7);
hashMap.put("Four", 4);
hashMap.put("Eight", 8);
hashMap.put("One", 1);
hashMap.put("Two", 2);
hashMap.put("Three", 3);
(2)利用Set entrySet(): 返回Map.Entry对象的视图集,即映像中的关键字/值对。
Set
(3)从上述mapEntries创建LinkedList。我们将排序这个链表来解决顺序问题。
List
(4)Collections.sort()是一个内置方法,仅排序值的列表, 默认升序排列.
(5)将升序排序完后的值,重新存入hashMap中。
六、Java
1、抽象类和接口的区别?什么时候使用接口不用抽象类?
2、并行和并发的区别
3、并发三原则——原子性、可见性、有序性,volatile关键字满足的原则?
volatile:非原子性、可见性、有序性。
七、算法
1、选择排序、快速排序?
八、源码
1、SystemUI
九、JNI
1、jni层是如何获取java层类的,实现原理是是什么?
2、Local and Global References区别
3、jni层java环境是如何搭建的?