Android进阶之路Android开发经验谈Android技术知识

20道月薪25K+Android工程师面试必问面试题!

2019-10-11  本文已影响0人  cff70524f5cf

很多朋友都或多或少经历过很多面试,而有的人拿到了自己心仪的offer,有的人却被拒之门外。那么今天整理了一份面试经常会问到的题目,希望可以帮助到更多的人。

本文讲解:

一.我们为何选择离职

二.25K+Android工程师必问面试题

1.APK安装过程

应用安装涉及到如下几个目录:

复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik-cache目录,并在data/data目录下创建对应的应用数据目录

2.invalidate()和postInvalidate() 的区别

invalidate()是用来刷新View的,必须是在UI线程中进行工作。比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面。
postInvalidate()在工作者线程中被调用。

3.Parcelable和Serializable区别

Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化。

Serializable序列化不保存静态变量,可以使用Transient关键字对部分字段不进行序列化,也可以覆盖writeObject、readObject方法以实现序列化过程自定义。

4.Android里跨进程传递数据的几种方案

5.匿名共享内存,使用场景

在Android系统中,提供了独特的匿名共享内存子系统Ashmem(Anonymous Shared Memory),它以驱动程序的形式实现在内核空间中。它有两个特点,一是能够辅助内存管理系统来有效地管理不再使用的内存块,二是它通过Binder进程间通信机制来实现进程间的内存共享。

ashmem并像Binder是Android重新自己搞的一套东西,而是利用了Linux的 tmpfs文件系统。tmpfs是一种可以基于RAM或是SWAP的高速文件系统,然后可以拿它来实现不同进程间的内存共享。

大致思路和流程是:

其实核心点就是创建一块共享区域,然后2个进程同时把这片区域 mmap 到本进程,然后读写就像本进程的内存一样。这里要解释下第3步,为什么要倒腾 fd,因为在 linux 中 fd 只是对本进程是唯一的,在 Proc A 中打开一个文件得到一个 fd,但是把这个打开的 fd 直接放到 Proc B 中,Proc B 是无法直接使用的。但是文件是唯一的,就是说一个文件(file)可以被打开多次,每打开一次就有一个 fd(文件描述符),所以对于同一个文件来说,需要某种转化,把 Proc A 中的 fd 转化成 Proc B 中的 fd。这样 Proc B 才能通过 fd mmap 同样的共享内存文件。

使用场景:进程间大量数据传输

6.ContentProvider实现原理

ContentProvider 有以下两个特点:

Content Provider组件在不同应用程序之间传输数据是基于匿名共享内存机制来实现的。其主要的调用过程:

①通过ContentResolver先查找对应给定Uri的ContentProvider,返回对应的BinderProxy

②调用BinderProxy的query()

7.如何使用ContentProvider进行批量操作?

通常进行数据的批量操作我们都会使用“事务”,但是ContentProvider如何进行批量操作呢?创建 ContentProviderOperation 对象数组,然后使用 ContentResolver.applyBatch() 将其分派给内容提供程序。您需将内容提供程序的授权传递给此方法,而不是特定内容 URI。这样可使数组中的每个 ContentProviderOperation 对象都能适用于其他表。调用 ContentResolver.applyBatch() 会返回结果数组。

同时我们还可以通过ContentObserver对数据进行观察:

8.广播注册后不解除注册会有什么问题?(内存泄露)

我们可以通过两种方式注册BroadcastReceiver,一是在Activity启动过程中通过代码动态注册,二是在AndroidManifest.xml文件中利用<receiver>标签进行静态注册。

9.属性动画(Property Animation)和补间动画(Tween Animation)的区别

10.BrocastReceive里面可不可以执行耗时操作?

11.Android优化工具:TraceView和Systrace

12.Dalvik与ART的区别?

13.Android动态权限?

14.ViewPager如何判断左右滑动?

实现OnPageChangeListener并重写onPageScrolled方法,通过参数进行判断。

15.ListView与RecyclerView

16.描述一下Android手机启动过程和App启动过程?
Android手机启动过程

当我们开机时,首先是启动Linux内核,在Linux内核中首先启动的是init进程,这个进程会去读取配置文件system\core\rootdir\init.rc配置文件,这个文件中配置了Android系统中第一个进程Zygote进程。

启动Zygote进程 --> 创建AppRuntime(Android运行环境) --> 启动虚拟机 --> 在虚拟机中注册JNI方法 --> 初始化进程通信使用的Socket(用于接收AMS的请求) --> 启动系统服务进程 --> 初始化时区、键盘布局等通用信息 --> 启动Binder线程池 --> 初始化系统服务(包括PMS,AMS等等) --> 启动Launcher

App启动过程

可以看到 入口Activity其实是先于Application实例化,只是onCreate之类的流程,先于Activity的流程。另外需要scheduleLaunchActivity,在ApplicationThreaad中,对应AMS管理Activity生命周期的方法都以scheduleXXXActivity,ApplicationThread在Binder线程中,它会向主线程发送消息,ActivityThread的Handler会调用相应的handleXXXActivity方法,然后会执行performXXXActivity方法,最终调用Activity的onXXX方法

17.Asset目录与res目录的区别

18.Application 在多进程下会多次调用 onCreate() 么?
当采用多进程的时候,比如下面的Service 配置:

<service
    android:name=".MyService"
    android:enabled="true"
    android:exported="false"
    android:process=":remote" />

android:process 属性中 :的作用就是把这个名字附加到你的包所运行的标准进程名字的后面作为新的进程名称。

这样配置会调用 onCreate() 两次

19.FragmentPagerAdapter 和 FragmentStateAdapter 的区别?

20.SurfaceView && View && GLSurfaceView

更多题目答案,请文末领取

三.如何选择心仪的公司

多家offer,如何选择?

厂大选大的 ,厂小选公司有钱的,都差不多选加班少的,加班都多,选钱多的。

具体如何判断公司好坏,可以参考我之前写的文章:从BAT这种公司平薪跳槽头条,是否值得?如何判断一家软件公司的好坏还有跳槽,如何找一家靠谱的公司?

只要技术在手,哪里都有饭吃,最后千万别裸辞

最后

不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊~

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我整理了一些资料,需要的可以免费分享给大家:

最近面试被怼了?缺面试题刷提升自己吗?

点击:

Android 学习,面试文档,视频收集大整理

来获取学习资料提升自己去挑战一下BAT面试难关吧

上一篇下一篇

猜你喜欢

热点阅读