2020年Android面试题整理

一、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的操作过程

    HashMap和Hashtable的区别和联系:

    相同点: 实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用

   不同点:

    1、Hashtable是早期提供的接口,HashMap是新版JDK提供的接口。

    2、Hashtable继承Dictionary类,HashMap实现Map接口。

    3、Hashtable线程安全,HashMap线程非安全。

    4、Hashtable不允许null值,HashMap允许null值。

2、四种引用类型的区别

强引用(Strong Reference)内存不足,不回收。
软引用(WeakReference)内存足不回收,内存不足回收。
弱引用(SoftReference)每次都回收。
虚引用(PhantomReference)不拥有对象实例,对象被回收,会收到系统通知。

3、arraylist<String> 如何排序?

Collections.sort方法,默认升序。

4、hashMap键是个对象,如何排序?

(1)创建一个简单的HashMap,并插入一些键和值。

Map<String,Integer> hashMap = new HashMap<String,Integer>(); 
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<Map.Entry<String,Integer>> mapEntries = hashMap.entrySet();

(3)从上述mapEntries创建LinkedList。我们将排序这个链表来解决顺序问题。

List<Map.Entry<String,Integer>> aList = new LinkedList<Map.Entry<String,Integer>>(mapEntries); 

(4)Collections.sort()是一个内置方法,仅排序值的列表, 默认升序排列.

(5)将升序排序完后的值,重新存入hashMap中。

5、说一下List,Set,Map的区别?

六、Java

1、抽象类和接口的区别?什么时候使用接口不用抽象类?

2、并行和并发的区别

3、并发三原则——原子性、可见性、有序性,volatile关键字满足的原则?

volatile:非原子性、可见性、有序性。

七、算法

1、选择排序、快速排序?

八、源码

1、SystemUI

九、JNI

1、jni层是如何获取java层类的,实现原理是是什么?

2、Local and Global References区别

3、jni层java环境是如何搭建的?

十、补充

1、加速度传感器x、y、z三个数值的含义?

      x、y、z数值代表加速度值,x方向是从左到右,y是从上到下,z从内到外

2、service类内,实现proxy代理内部类的,内部实现机制是怎样的?

      asBinder、onTransact方法底层实现。

3、andriod内存优化项目案例,举例。

4、andriod内存泄漏项目案例,举例。

5、为什么Dialog不能用Application的Context?

6、Jvm、Dalvik和Art的区别。

7、Android模块module间通信方式有几种。

     1)事件总线EventBus:反射+多态。

     2)路由转发:ActivityRouter

     3)广播

8、ANR是什么?超时时间,举例说明。

9、比较熟悉的第三方应用框架或是插件,举例说明。

10、Android组件化

11、OpenGL 渲染过程。

猜你喜欢

转载自blog.csdn.net/github_27263697/article/details/107400650