美文网首页Android开发程序员
大厂电话面试题(别问细节看就完了)

大厂电话面试题(别问细节看就完了)

作者: 微尘_8957 | 来源:发表于2019-03-28 09:22 被阅读7次

觉得有用看就完了,不过想吐槽尽情就放马过来,哈哈哈!

996.ICU直通车 看完面试题,来吐槽吧!

1、Android的四大组件是哪些

Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑

(1)两个Activity A, B 。A启动B,这过程中执行的什么周期方法

(2)三个acitivty A,B,C。 A启动B,B启动C,C按返回键直接会退到A(考察Activity启动模式)

(3)四个Activity A,B,C,D。相互跳转的时候,不创建新的Activity并且也不销毁

(4)Activity的生命周期方法不回掉

fragment 生命周期

Fragment is added ---> onAttach()--->onCreate--->onCreateView-->onActivityCreated-->onStart-->onResume-->可见

-->onPause-->onStop-->OnDestroyView-->onDestroy-->onDetach-->Fragment is destroyed

service:后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的事物,定义好需要接受的Intent提供同步和异步的接口

(1)service启动方式,以及各自的什么周期

(2)Activity和services通信

(3)IntentService 中封装HandlerThread,Activity中开启线程下载和启动一个IntentService下载的区别

        JobService 和JobIntentService---》在Android8.0及以上JobIntentService和JobService做的事情是相同的,都是等着JobScheduler分配任务来执行

          不同点在于,JobService使用的handler使用的是主线程的Looper,因此需要在onStartJob()中手动创建AsyncTask去执行耗时任务,而JobIntentService

则帮我们处理这一过程,使用它只需要写需要做的任务逻辑即可,不用关心卡住主线程的问题。另外,向jobScheduler传递任务操作也更简单了,

不需要在指定JobInfo中的参数,直接enqueue(context,intent)就可以

(4)先startService然后bindService

(5)在调用 bindService 绑定到Service的时候,应当保证在某处调用 unbindService 解除绑定(尽管 Activity 被 finish 的时候绑定会自动解除,并且Service会自动停止);

(6)使用 startService 启动服务之后,一定要使用 stopService停止服务,不管你是否使用bindService;

(7)同时使用 startService 与 bindService 要注意到,Service 的终止,需要unbindService与stopService同时调用,才能终止 Service,不管 startService 与 bindService 的调用顺序,

        如果先调用 unbindService 此时服务不会自动终止,再调用 stopService 之后服务才会停止,如果先调用 stopService 此时服务也不会终止,而再调用 unbindService 或者 之前调

      用 bindService 的 Context 不存在了(如Activity 被 finish 的时候)之后服务才会自动停止;

(8)当在旋转手机屏幕的时候,当手机屏幕在“横”“竖”变换时,此时如果你的 Activity 如果会自动旋转的话,旋转其实是 Activity 的重新创建,因此旋转之前的使用 bindService 建

        立的连接便会断开(Context 不存在了),对应服务的生命周期与上述相同。

(9)在 sdk 2.0 及其以后的版本中,对应的 onStart 已经被否决变为了 onStartCommand,不过之前的 onStart 任然有效。这意味着,如果你开发的应用程序用的 sdk 为 2.0 及其以后

        的版本,那么你应当使用 onStartCommand 而不是 onStart。

Content Provider:是Android提供的第三方应用数据的访问方案,可以派生Content Provider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的借口模型,大大简化上层应用,对数据的整合提供了更方便的途径

(1)与sharedPreference 联合使用夸进程数据存储,更优的方式是对文件加锁或对数据库的操作

(2)

BroadCast Receiver:接受一种或者多种Intent作触发事件,接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型

(1)Android中的广播使用了设计模式中的观察者模式,将广播的发送者 和 接收者 解耦,使得系统方便集成,更易扩展

(2)消息订阅者、消息发布者、消息中心

(3)不在onCreate() & onDestory() 或 onStart() & onStop()注册、注销是因为:

当系统因为内存不足(优先级更高的应用需要内存,请看上图红框)要回收Activity占用的资源时,

        Activity在执行完onPause()方法后就会被销毁,有些生命周期方法onStop(),onDestory()就不会执行。当再回到此Activity时,是从onCreate方法开始执行。

(4)广播分为哪几种(有序、无序、动态、静态、普通、系统、粘性(失效)、App应用内广播)

(5)LocalBroadcast

四大组件那些运行在主线程,那些在子线程

2、Handler 原理 (死循环怎么阻塞的,MessageQueue的存储数据结构,Message是怎么样回调handler中的handlerMessage方法的,延迟时间是否准确)

3、ANR 如何分析

ANR的原理

ANR的原因:先看主线程的堆栈,是否有耗时的操作或阻塞、死锁。接着看看 ANR 日志中 iowait、CPU、GC、system server 等信息,

    进一步确定是 I/O 问题,或是 CPU 竞争问题,还是由于大量 GC 导致卡死。

应用的崩溃率,怎么降低崩溃及解决崩溃:

  崩溃现场的信息(①进程名、线程名,②崩溃的堆栈和类型java崩溃、native崩溃、ANR)

  系统的信息(Logcat,机型、系统、厂商、CPU、ABI、Linux 版本,设备的状态是否root,是否模拟器,是否安装xposed)

  内存信息(①系统剩余内存/proc/meminfo,②应用使用内存RSS、PSS--/proc/self/smap,③虚拟内存--/proc/self/status)

  资源信息(①文件句柄,可以通过 /proc/self/limits获得限制,超过800个就比较危险, ②线程数,不能超过400个,③JNI,引用失效或爆表)

崩溃分析:①确定严重程度 ②查找共性 ③尝试复现。此外对于复杂的崩溃问题或系统崩溃,可以查找可能的原因,尝试规避或hook解决

4、View的绘制流程,以及View,ViewGroup事件分发

5、app优化

App启动优化

布局优化

响应优化

内存优化

如何规避oom?

1.使用更加轻量的数据结构

2.避免在Android里面使用Enum

3.减小Bitmap对象的内存占用

4.使用更小的图片

5.复用系统自带的资源

6.注意在ListView/GridView等出现大量重复子组件的视图里面对ConvertView的复用

7.Bitmap对象的复用

8.避免在onDraw方法里面执行对象的创建

9.避免对象的内存泄露(重点)

10.考虑使用Application Context而不是Activity Context

11.注意WebView的泄漏(重点)

12.资源文件需要选择合适的文件夹进行存放

13.谨慎使用static对象(重点)

14.特别留意单例对象中不合理的持有

15.珍惜Services资源

16.谨慎使用“抽象”编程

17.谨慎使用依赖注入框架

18..谨慎使用多进程

19.Handler的使用

20.强软弱虚引用的应用

22.主线程操作UI,子线程操作数据

内存泄露的监控方案:leakcanry(原理)

内存泄漏点:

1.单例造成的内存泄漏

2.非静态内部类创建静态实例造成的内存泄漏

3.Handler造成的内存泄漏

4.线程造成的内存泄漏

5.资源未关闭造成的内存泄漏

6.使用ListView时造成的内存泄漏

7.集合容器中的内存泄露

8.WebView造成的泄露

电池使用优化

网络优化

7、Http https区别 此处延伸:https的实现原理

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

https实现原理:

(1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。

(2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。

(3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。

(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。

(5)Web服务器利用自己的私钥解密出会话密钥。

(6)Web服务器利用会话密钥加密与客户端之间的通信。

Http位于TCP/IP模型中的第几层?为什么说Http是可靠的数据传输协议?

tcp/ip的五层模型:

从下到上:物理层->数据链路层->网络层->传输层->应用层

其中tcp/ip位于模型中的网络层,处于同一层的还有ICMP(网络控制信息协议)。http位于模型中的应用层

由于tcp/ip是面向连接的可靠协议,而http是在传输层基于tcp/ip协议的,所以说http是可靠的数据传输协议。

TCP和UDP的区别

tcp是面向连接的,由于tcp连接需要三次握手,所以能够最低限度的降低风险,保证连接的可靠性。

udp 不是面向连接的,udp建立连接前不需要与对象建立连接,无论是发送还是接收,都没有发送确认信号。所以说udp是不可靠的。

由于udp不需要进行确认连接,使得UDP的开销更小,传输速率更高,所以实时行更好。

Tcp/IP三次握手,四次挥手

8.Android多线程的四种方式

1、Handler+Thread

2. AsyncTask

3. ThreadPoolExecutor

4. IntentService

9、Activity、 Window、 View 三者的差别, fragment 的特点?

Activity是Android应用程序的载体,允许用户在其上创建一个用户界面,并提供用户处理事件的API,如onKeyEvent, onTouchEvent等。 并维护应用程序的生命周期。

当我们调用Acitivity的 setContentView方法的时候实际上是调用的Window对象的setContentView方法,所以我们可以看出Activity中关于界面的绘制实际上全是交给Window对象来做的。

Activity―>Window―>DecorView

Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图) LayoutInflater像剪刀,Xml配置像窗花图纸。

在Activity中调用attach,创建了一个Window

创建的window是其子类PhoneWindow,在attach中创建PhoneWindow

在Activity中调用setContentView(R.layout.xxx)

其中实际上是调用的getWindow().setContentView()

调用PhoneWindow中的setContentView方法

创建ParentView:作为ViewGroup的子类,实际是创建的DecorView(作为 FramLayout的子类)

将指定的R.layout.xxx进行填充通过布局填充器进行填充【其中的parent指的>* 就是DecorView】

调用到ViewGroup

调用ViewGroup的removeAllView(),先将所有的view移除掉

添加新的view:addView()

fragment 特点

Fragment可以作为Activity界面的一部分组成出现;

可以在一个Activity中同时出现多个Fragment,并且一个Fragment也可以在多个Activity中使用;

在Activity运行过程中,可以添加、移除或者替换Fragment;

Fragment可以响应自己的输入事件,并且有自己的生命周期,它们的生命周期会受宿主Activity的生命周期影响。

10.Handler、 Thread 和 HandlerThread 的差别

Thread是一个线程;

我们知道Handler是用来异步更新UI的,更详细的说是用来做线程间的通信的,更新UI时是子线程与UI主线程之间的通信。那么现在我们要是想子线程与子线程之间的通信要怎么做呢?当然说到底也是用Handler+Thread来完成(不推荐,需要自己操作Looper)

HandlerThread就是(Handler+Thread结合),HandlerThread其实还是一个线程,它跟普通线程有什么不同之处是多了一个Looper,这个是子线程独有的Looper,用来做消息的取出和处理。

11.sharedPreferences是线程安全的吗?进程安全吗?

12.IPC (https://blog.csdn.net/weijinqian0/article/details/52233529)

linux:无名pipe, signal, trace, 有名管道,共享内存,信号灯,消息队列,Socket

管道和消息队列:因为采用存储转发方式,所以至少需要拷贝2次数据,效率低;

共享内存:虽然在传输时没有拷贝数据,但其控制机制复杂(比如跨进程通信时,需获取对方进程的pid,得多种机制协同操作)。

13、接口可以继承接口吗?可以实现接口吗?抽象类可以继承别的抽象类吗?枚举可以继承别的类吗?java是单继承的,如何实现多继承?父类的静态方法能否被子类重写,为什么?

14、哪些情况下的对象会被垃圾回收机制处理掉

Java 垃圾回收机制最基本的做法是分代回收。内存中的区域被划分成不同的世代,对象根据其存活的时间被保存在对应世代的区域中。一般的实现是划分成3个世代:年轻、年老和永久。内存的分配是发生在年轻世代中的。当一个对象存活时间足够长的时候,它就会被复制到年老世代中。对于不同的世代可以使用不同的垃圾回收算法。进行世代划分的出发点是对应用中对象存活时间进行研究之后得出的统计规律。一般来说,一个应用中的大部分对象的存活时间都很短。比如局部变量的存活时间就只在方法的执行过程中。基于这一点,对于年轻世代的垃圾回收算法就可以很有针对性。

(1)超出对象的引用句柄的作用域时,这个引用句柄引用的对象就变成垃圾。

(2)没有超出对象的引用句柄的作用域时,给这个引用句柄赋值为空时,这个引用句柄引用的对象就变成垃圾。

(3)创建匿名对象时,匿名对象用完以后即成垃圾。

15、进程和线程的区别

进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。

1. 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

2. 线程的划分尺度小于进程,使得多线程程序的并发性高。

3. 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4. 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5. 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

16、ArrayList,LinkedList与HashMap区别

17、ArrayMap VS HashMap

数据结构与算法

1、堆和栈在内存中的区别是什么(数据结构方面以及实际实现方面)

2、最快的排序算法是哪个?给阿里 2 万多名员工按年龄排序应该选择哪个算法?堆和树的区别;写出快排代码;链表逆序代码(阿里)

3、求 1000 以内的水仙花数以及 40 亿以内的水仙花数(百度)

4、子串包含问题(KMP 算法)写代码实现

5、万亿级别的两个 URL 文件 A 和 B,如何求出 A 和 B 的差集 C,(Bit 映射->hash 分组->多文件读写效率->磁盘寻址以及应用层面对寻址的优化)

6、蚁群算法与蒙特卡洛算法

其他

1、死锁的四个必要条件

1)互斥条件,即某个资源在一段时间内只能由一个线程占有,不能同时被两个或两个以上的线程占有

2)不可抢占条件,线程所获得的资源在未使用完毕之前,资源申请者不能强行地从资源占有者手中夺取资源,而只能由该资源的占有者线程自行释放

3)占有且申请条件,线程至少已经占有一个资源,但又申请新的资源;由于该资源已被另外线程占有,此时该线程阻塞;但是,它在等待新资源之时,仍继续占用已占有的资源。

4)循环等待条件,存在一个线程等待序列{P1,P2,…,Pn},其中P1等待P2所占有的某一资源,P2等待P3所占有的某一源,……,而Pn等待P1所占有的的某一资源,形成一个线程循环等待环

解决死锁的办法:加锁顺序,死锁检测

2、常见编码方式; utf-8 编码中的中文占几个字节;数字几个字节

一个utf8数字占1个字节,一个utf8英文字母占1个字节,少数是汉字每个占用3个字节,多数占用4个字节。

3、实现一个 Json 解析器(可以通过正则提高速度)

String json = "{name:\"jason\",father:\"jason\",age:18}";

//name:"jason"

//age:18

//\"\\w+\" 字符串属性

Pattern p = Pattern.compile("\\w+:(\"\\w+\"|\\d*)");

Matcher m = p.matcher(json);

while(m.find()){

    String text = m.group();

    int dotPos= text.indexOf(":");

    String key = text.substring(0, dotPos);

    String value = text.substring(dotPos+1, text.length());

    //替换字符串的开始结束的双引号

    value = value.replaceAll("^\\\"|\\\"$", "");

    System.out.println(key);

    System.out.println(value);

}

Android App 的设计架构: MVC,MVP,MVVM 与架构经验谈(搜狐)

写出观察者模式的代码

TCP 的 3 次握手和四次挥手; TCP 与 UDP 的区别

http://blog.csdn.net/whuslei/article/details/6667471

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付

3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的

UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

5、TCP首部开销20字节;UDP的首部开销小,只有8个字节

6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

相关文章

网友评论

    本文标题:大厂电话面试题(别问细节看就完了)

    本文链接:https://www.haomeiwen.com/subject/bfefbqtx.html