美文网首页
美图Android校招

美图Android校招

作者: 孙大硕 | 来源:发表于2019-04-10 19:11 被阅读0次

总体来说很满意没有问什么刁钻的问题
一面大概二十分钟,电话面试
1.ArrayList和LinkList的区别
2.HashMap的实现原理
3.造成内存泄漏的场景以及怎么避免
4.多进程通信的方式
5.讲一下实习过程中做的语音播放器
6.讲一讲多线程
7.说一下自己自定义的View
8.讲一下用到的动画

二面17分钟,电话面试
1.Handler的原理
2.垃圾回收
3.从垃圾回收的角度讲一讲内存泄漏
4.说一说对Kotlin的掌握情况
5.说一说android进程通信的场景(懵了),又说大概讲一下从点击图标到应用启动的过程问我AMS知道是什么吗,这方面一直没有复习,应该加强。

三面大概也是十几分钟,出了个题又没做出来,难受。

问一些网络的知识,HTTP的连接过程,路由选择算法(!!!)
对能组成一个凸多边形的结点排序(选取最左边的一个结点,然后对角度进行排序,没想到这一点就挂了)

那么我们先看一下从点击桌面图标到启动Activity发生了什么吧

祭出一张图(来源见水印)


luncher.png

这张图把过程描述的很清楚

1.点击图标之后,会去ServiceManager(下面简称SM)里去查询ActivityManagerService(下面简称AMS),这里出现的两个类可能不太熟悉。

首先是这个SM,我们在看AIDL的时候会了解到多进程通信,这个SM就是多进程通信的核心,我们通过SM可以建立和所有服务的关联包括AMS这种系统服务。

AMS则负责进程的创建、调度,四大组件的启动

在启动App的时候首先检查应用是否启动,如果没有启动就调用下面方法去fork一个进程。

ActivityManagerService.startProcessLocked()
//进程不存在请求 Zygote 创建新进程。 创建成功后切换到新进程。

在启动新进程后切换至启动后的App进程,将ActivityThread加载到主进程,然后调用ActivityThread.main,这个main方法就是整个App的进入方法,我们常说的主线程的Looper就是在这里面初始化的。同时创建了ApplicationThread实例,然后会拿到AMSProxy,这个就类似于多进程中的IBinder了,就是我们在本地的代理

然后调用

ActivityManagerProxy.attachApplication()

此处省略一万字。。。

因为从点击桌面图标到打开activity是多进程通信,所以会阻塞到调用线程会阻塞,所以最后用到了一个ActicityThread的内部类H,是Handler的子类,去发送消息,然后处理消息,最后调用handleLaunchActivity。

相关文章

网友评论

      本文标题:美图Android校招

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