25K大体算的上是Android开发的一个分水岭了。没点真正的东西,还真的拿不到25html
本文讲解:linux
咱们为何要选择离职android
面试必问面试题面试
如何选择心仪的公司数组
工资跟不上消费网络
上班找不到归宿感和成绩感,上班感受和坐牢同样架构
在公司没有发展空间app
1.APK安装过程
应用安装涉及到以下几个目录:ide
system/app:系统自带的应用程序,没法删除工具
data/app:用户程序安装的目录,有删除权限。安装时把apk文件复制到此目录
data/data:存放应用程序的数据
data/dalvik-cache:将apk中的dex文件安装到dalvik-cache目录下
复制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里跨进程传递数据的几种方案
Binder
Socket/LocalSocket
共享内存
5.匿名共享内存,使用场景
在Android系统中,提供了独特的匿名共享内存子系统Ashmem(Anonymous Shared Memory),它以驱动程序的形式实如今内核空间中。它有两个特色,一是可以辅助内存管理系统来有效地管理再也不使用的内存块,二是它经过Binder进程间通讯机制来实现进程间的内存共享。
ashmem并像Binder是Android从新本身搞的一套东西,而是利用了Linux的 tmpfs文件系统。tmpfs是一种能够基于RAM或是SWAP的高速文件系统,而后能够拿它来实现不一样进程间的内存共享。
大体思路和流程是:
Proc A 经过 tmpfs 建立一块共享区域,获得这块区域的 fd(文件描述符)
Proc A 在 fd 上 mmap 一片内存区域到本进程用于共享数据
Proc A 经过某种方法把 fd 倒腾给 Proc B
Proc B 在接到的 fd 上一样 mmap 相同的区域到本进程
而后 A、B 在 mmap 到本进程中的内存中读、写,对方都能看到了
其实核心点就是建立一块共享区域,而后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 有如下两个特色:
封装:对数据进行封装,提供统一的接口,使用者彻底没必要关心这些数据是在DB,XML、Preferences或者网络请求来的。当项目需求要改变数据来源时,使用咱们的地方彻底不须要修改。
提供一种跨进程数据共享的方式。
Content Provider组件在不一样应用程序之间传输数据是基于匿名共享内存机制来实现的。其主要的调用过程:
①经过ContentResolver先查找对应给定Uri的ContentProvider,返回对应的BinderProxy
若是该Provider还没有被调用进程使用过:
经过ServiceManager查找activity service获得ActivityManagerService对应BinderProxy
调用BinderProxy的transcat方法发送GET_CONTENT_PROVIDER_TRANSACTION命令,获得对应ContentProvider的BinderProxy。
若是该Provider已被调用进程使用过,则调用进程会保留使用过provider的HashMap。此时直接今后表查询即得。
②调用BinderProxy的query()
7.如何使用ContentProvider进行批量操做?
一般进行数据的批量操做咱们都会使用“事务”,可是ContentProvider如何进行批量操做呢?建立 ContentProviderOperation 对象数组,而后使用 ContentResolver.applyBatch() 将其分派给内容提供程序。您需将内容提供程序的受权传递给此方法,而不是特定内容 URI。这样可以使数组中的每一个 ContentProviderOperation 对象都能适用于其余表。调用 ContentResolver.applyBatch() 会返回结果数组。
同时咱们还能够经过ContentObserver对数据进行观察:
建立咱们特定的ContentObserver派生类,必须重载onChange()方法去处理回调后的功能实现
利用context.getContentResolover()得到ContentResolove对象,接着调用registerContentObserver()方法去注册内容观察者,为指定的Uri注册一个ContentObserver派生类实例,当给定的Uri发生改变时,回调该实例对象去处理。
因为ContentObserver的生命周期不一样步于Activity和Service等,所以,在不须要时,须要手动的调用unregisterContentObserver()去取消注册。
8.广播注册后不解除注册会有什么问题?(内存泄露)
咱们能够经过两种方式注册BroadcastReceiver,一是在Activity启动过程当中经过代码动态注册,二是在AndroidManifest.xml文件中利用<receiver>标签进行静态注册。
对于第一种方法,咱们须要养成一个良好的习惯:在Activity进入中止或者销毁状态的时候使用unregisterReceiver方法将注册的BroadcastReceiver注销掉。
对于<receiver>标签进行注册的,那么该对象的实例在onReceive被调用以后就会在任意时间内被销毁。
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启动过程
应用的启动是从其余应用调用startActivity开始的。经过代理请求AMS启动Activity。
AMS建立进程,并进入ActivityThread的main入口。在main入口,主线程初始化,并loop起来。主线程初始化,主要是实例化ActivityThread和ApplicationThread,以及MainLooper的建立。ActivityThread和ApplicationThread实例用于与AMS进程通讯。
应用进程将实例化的ApplicationThread,Binder传递给AMS,这样AMS就能够经过代理对应用进程进行访问。
AMS经过代理,请求启动Activity。ApplicationThread通知主线程执行该请求。而后,ActivityThread执行Activity的启动。
Activity的启动包括,Activity的实例化,Application的实例化,以及Activity的启动流程:create、start、resume。
能够看到 入口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,如何选择?
厂大选大的 ,厂小选公司有钱的,都差很少选加班少的,加班都多,选钱多的。
只要技术在手,哪里都有饭吃,最后千万别裸辞
有没有志同道合的小伙伴共同进步?前面说的那些面试题的答案呢?
对此整理了一套适合Android工程师学习的资料文档分享《Android架构视频+BAT面试专题PDF+学习笔记》
若是感受本文对你有帮助,请点个赞吧谢谢~