入多灾多难的2020,受疫情影响我们公司走到了破产的边缘,老板通知大家投简历找新工作吧。其实这一天早有预料,只是没想到会这么快,正值疫情期间工作真的很不好找。没办法,先把面试题刷一下吧。下面是我面试过程中遇到的面试题,总结一下,大家共勉。
1、你知道的Android的保活方法有哪些?
先大致说一下Android的几种进程的优先级,由高到低依次为:前台进程,可见进程,服务进程,后台进程,空进程。
要想程序保活就得想办法提高进程的优先级,其次是进程被kill之后要能够唤醒进程。
进程有一个具体的数值来标示他的优先级oom_adj。数值越低进程优先级越高,该值存放在proc/PID/oom_adj文件中,直接adb shell进入该文件查看就行oom_adj=0是前台进程。
<1> 在通知栏发送通知提高进程的优先级
<2> 监听一些系统广播来启动程序,例如开机、网络变化、电量变化、锁屏、解锁等
<3>双进程方式,例如使用aidl方式两个进程相互监听
<4>在桌面启动一个一像素的activity
<5>提高service为前台进程service.startForeground()设置为前台进程可以将oom_adj的值从4降到1。需要注意的是在Android4.3之后这个方法会强制弹出通知栏,解决方法是再启动一个service和推送共用一个通知栏,然后stop这个service使得通知栏消失。但是Android7.1之后Google修复了这个bug,目前没有办法解决这个问题。
2、Android中的多线程方式有哪些?
<1>thread方式
<2>intentService 内部维护了一个handlerthread启动一个工作线程,耗时操作在工作线程中进行,在onhandleIntent方法中进行,任务完成自动关闭。
<3>asynctask
<4>threadPool
3、service启动方式
startService() 生命周期方法oncreate onStartCommandondestroy 结束直接调用stop方法
bindService 生命周期方法 oncreate onbind ondestroy 结束需要调用unbind方法
4、Android IPC方式
IPC:inter-process-communication 跨进程通讯。
<1>使用intent传值
<2>使用文件
<3>使用aidl
<4>socket
<5>messenger+handler
5、java的引用类型有几种,分别有什么特点
java的引用类型有四种
<1>强引用 直接赋值的形式引用,不置空就不会回收
<2>软引用 内存不够时会回收内存
<3>弱引用 垃圾回收执行时会被回收
<4>虚引用 不能直接通过虚引用调用引用对象,配合队列来使用,对象被回收,虚引用会添加到队列
6、怎么结束一个线程,线程池怎么结束线程
thread线程结束我知道的有三种方式 1、线程执行完之后就自动结束了 2、使用变量控制 3、调用interrupt方法
线程池结束某个线程方式 执行线程时调用submit方式提交会返回一个future future可以调用future.cancel方法结束线程
也可以调用threadpool.shutdow()或者threadpool.shutdownNow(),前一个方法会等待所有的线程结束之后就结束了,不会创建新的线程了,第二种会直接结束线程。
7、Android中的handler原理
handler机制:主要有四个部分组成,handler looper message messagequeue,handler可以向messagequeue中添加消息,looper轮询消息队列交给handler处理,handler调用handlemessage方法处理消息。
8、TCP的通讯机制
tcp三次握手和四次挥手
9、自定义view需要重写哪些方法
自定义view需要重写ondraw方法,自定义viewgroup需要重写onmesure和onlayout方法
10、scrollby和scrollto有什么区别
scrollto(x,y)直接滚动到x y坐标,scrollby(x,y)是以当前坐标为原点滚动x,y距离
11、hashmap的原理
hashmap有两部分组成,数组和链表,数组存放key,链表存放value,查找时通过key的hashcode计算value的位置,添加数据时会计算key的hash值,如果已经存在该hash值比较key值是否相同,相同就替换value值,不同就把key新的key,value放到链表中,以这种方法来解决hash冲突问题。