面试知识汇总(三)-- Android知识相关

目录

Framework

1. Android 系统启动过程: 

2. Android 系统架构: 应用层、Framework、系统运行库层(Android Runtime)、硬件抽象层(Hal),、Linux内核层

3. 应用安装

4. App启动流程,从点击桌面开始

5. 进程保活的方式,如何保证一个后台服务不被杀死?比较省电的方式是什么?App中唤醒其他进程的实现方式?

6. Activity, View, Window,  Surface, SurfaceView,  DecorView, ViewRoot

7. IPC

8. 虚拟机相关

9.  android中UID和PID的作用及区别

10. android系统的低电耗模式(Doze模式)是怎么工作的

11. android最近几个版本的系统差异或特性

12. NDK

13. JNI

14. Android进程分类?进程和 Application 的生命周期?进程调度

15.谈谈对进程共享和线程安全的认识

 

 

App部分

1. 自定义view的过程,ViewGroup和View有什么不一样

2. RecyclerView和ListView的性能对比

3. 四大组件,原理

3.1 Service生命周期, startService和BindService

3.2 ContentProvider

3.3 BroadcastReceiver

4. Activity和Fragment的生命周期,各生命状态发生在什么情况下; Fragment和Activity的通信方式

5. Activity的四种launcherMode

6. Context

7. 事件分发

8. 动画的几种类型: 

9. Android数据存储方式

10. 线程切换的方式

11. View刷新机制,绘制流程

12. 谈谈对多进程开发的理解以及多进程应用场景



Framework

1. Android 系统启动过程: 

https://zhuanlan.zhihu.com/p/80806364  关于Android系统启动,你需要知道这些步骤

https://blog.51cto.com/ticktick/1659473  Android内核开发:图解Android系统的启动过程

https://www.lagou.com/lgeduarticle/82941.html Android 系统启动流程

https://www.jianshu.com/p/e084414c7e1c  Android系统启动(一)-开篇

(1)Bootloader引导

(2)Linux kernel启动,寻找init.rc文件

(3)init进程启动: 

init 进程是所有用户进程的鼻祖

创建一些文件夹并挂载设备; 初始化和启动属性服务;解析init.rc和其他服务的rc文件(每个服务一个rc文件, 包括native服务), 启动对应的系统级进程,包括Zygote

(4)Zygote启动:通过JNI方式调用ZygoteInit.main()进入java世界, fork System Server进程, System Server进程启动所以的Android核心服务, 接着通过ActivityManagerService启动Home

(5)launcher启动

2. Android 系统架构: 应用层、Framework、系统运行库层(Android Runtime)、硬件抽象层(Hal),、Linux内核层

3. 应用安装

     (1)具体说清一个应用程序安装到手机上时发生了什么

     (2)应用安装的几种方式:system/priv-app, data/app , 预装应用,应用市场应用,adb install的应用

     (3)packageManagerService的启动过程

4. App启动流程,从点击桌面开始

5. 进程保活的方式,如何保证一个后台服务不被杀死?比较省电的方式是什么?App中唤醒其他进程的实现方式?

Android进程保活终极方案总结 https://blog.csdn.net/hxl517116279/article/detail

6. Activity, View, Window,  Surface, SurfaceView,  DecorView, ViewRoot

(1)简析Window、Activity、DecorView以及ViewRoot之间的错综关系  https://www.jianshu.com/p/8766babc40e0

 

 

ActivityThread.handResumeActivity() -> getDecorView() -> WindowManager.addView(DecorView, WindowManager.LayoutParams) -> ViewRoot.setView(DecorView, WindowManager.LayoutParams, ...) -> ViewRootImpl.performTraversals() -> activity.makeVisible() -> DecorView.setVisibility(Visible

(2)Android的Surface、View、SurfaceView、Window概念整理 

http://www.360doc.com/content/19/0927/10/8335678_863480139.shtml

(3)SurfaceView、GLSrurfaceView

SurfaceView继承自View,有两个子类:GLSurfaceView, VideoView

View和宿主Window共用一个绘图表面surface; 而SurfaceView虽然也在View的属性结构中,但有自己的surface, 内部持有一个Canvas;

每一个窗口在SurfaceFlinger服务中都对应有一个Layer,用来描述它的绘图表面。对于那些具有SurfaceView的窗口来说,每一个SurfaceView在SurfaceFlinger服务中还对应有一个独立的Layer或者LayerBuffer,用来单独描述它的绘图表面,以区别于它的宿主窗口的绘图表面。

 SurfaceView是用Zorder排序的,默认在宿主Window的后面,SurfaceView通过在Window上面“挖洞”(设置透明区域)进行显示。

View的绘图效率不高,用于动画变化较少的程序; SurfaceView的绘图效率较高,用于界面更新频繁的程序

SurfaceView的UI可以在一个独立的线程中进行绘制,可以不占用主线程。

SurfaceView采用双缓冲机制: frontCanvas, backCanvas

不能进行平移,缩放等变换(对SurfaceView进行ScrollBy,ScrollTo操作没有效果(还有透明度,旋转)

使用SurfaceView的步骤:

首先要继承SurfaceView,实现SurfaceHolder.Callback接口。

重写方法:

surfaceChanged:surface大小或格式发生变化时触发,在surfaceCreated调用后该函数至少会被调用一次。

surfaceCreated:Surface创建时触发,一般在这个函数开启绘图线程(新的线程,不要再这个线程中绘制Surface)。

surfaceDestroyed:销毁时触发,一般不可见时就会销毁。

利用getHolder()获取SurfaceHolder对象,调用SurfaceHolder.addCallback添加回调

SurfaceHolder.lockCanvas 获取Canvas对象并锁定画布,调用Canvas绘图,SurfaceHolder.unlockCanvasAndPost 结束锁定画布,提交改变。

————————————————

版权声明:本文为CSDN博主「lidongxiu0714」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/u010126792/article/details/86249399

7. IPC

(1)Binder机制

https://blog.51cto.com/ticktick/1659473

 

ServiceManager是什么:https://www.cnblogs.com/monsterdev/p/12685105.html

ServiceManager是binder服务的大管家,由Init进程解析init.rc文件创建,其本身也是一个Binder服务

(2)简述IPC, Binder和其他IPC的对比,

Intent中附加extras(Bundle): 只能在四大组件间的通信

共享文件,sharedPereference:  不支持高并发和即时通讯

Messager(基于Binder): 一对多的串行

ContentProvider(基于Binder): 数据源场景下的Binder

Socket: 网络交换

Binder: 支持一对多并发

(3)AIDL

(4)Parcelable: 文件序列化, Serializable: 内存序列化

(5) Messenger: https://www.cnblogs.com/linghu-java/p/8798374.html

 

8. 虚拟机相关

(1)JVM、Dalvik和ART

JVM 是 java虚拟机,是实现java夸平台的主要方式,可以使得java这样的高级语言编译成机器可以识别的机器语言,让java 可以一次编译,到处运行

Dalvik 是Android系统在上面运行的虚拟机,Dalvik虚拟机是专门为移动设备定制的,它允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用都是一个独立的Linux进程。独立的进程可以防止虚拟机崩溃的时所有进程都被关闭。

ART 是指 Android Runtime ,是安卓4.4之后推出替代DVM的,DVM中的应用每次运行时,字节码都需要通过即时编译器(Just In Time,JIT)转换成机器码,这会使应用的运行效率降低。而在ART中,系统在安装应用时会进行一次预编译(Ahead Of Time,AOT),将字节码预先编译成机器码并存在本地,这样应用每次运行时就不需要再执行编译了,能大大提高运行效率。

[Android Runtime (ART)和apk的预编译] https://blog.csdn.net/qq_25804863/article/details/48696619

(2)JVM内存区域划分

(3)JVM内存模型

(4)谈谈你对双亲委派模型理解

(5)逻辑地址与物理地址,为什么使用逻辑地址?

(6)Android为每个应用程序分配的内存大小是多少?Android中进程内存的分配,能不能自己分配定额内存?

9.  android中UID和PID的作用及区别

PID是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID.进程中止后PID被系统回收,可能会被继续分配给新运行的程序,但是在android系统中一般不会把已经kill掉的进程ID重新分配给新的进程,新产生进程的进程号,一般比产生之前所有的进程号都要大.

UID在linux中就是用户的ID,表明是哪个用户运行了这个程序,主要用于权限的管理.而在android 中又有所不同,因为android为单用户系统,这时UID 便被赋予了新的使命,数据共享,为了实现数据共享,android为每个应用几乎都分配了不同的UID,不像传统的linux,每个用户相同就为之分配相同的UID.

如果让其他的开发者知道了我们的shareUserId,那我们的数据不是暴露了?

其实我们要使不同的程序能够相互访问,还需要拥有相同的签名,每个公司或者开发者的签名是唯一的,这样我们就不用担心了

10. android系统的低电耗模式(Doze模式)是怎么工作的

https://blog.csdn.net/qq_25804863/article/details/50229437

11. android最近几个版本的系统差异或特性

https://blog.csdn.net/qq_25804863/article/details/83348760

12. NDK

请介绍一下NDK,什么是NDK库?

13. JNI

jni用过吗?如何在jni中注册native函数,有几种注册方式?

Java如何调用c、c++语言?

jni如何调用java层代码?

14. Android进程分类?进程和 Application 的生命周期?进程调度

15.谈谈对进程共享和线程安全的认识

 

 

App部分

1. 自定义view的过程,ViewGroup和View有什么不一样

xml初始化和代码初始化

onMeasure-> onLayout -> onDraw/DispatchDraw

2. RecyclerView和ListView的性能对比

3. 四大组件,原理

Activity,Service,ContendProvider(ContendResolver, ContendObserver, Binder),BroadCast

3.1 Service生命周期, startService和BindService

startService: Service会经历onCreate->onStartCommand。stopService:  onDestroy方法。调用者如果没有stopService,Service会一直在后台运行,下次调用者再起来仍然可以stopService。

bindService: Service会经历onCreate->onBind。这个时候调用者和Service绑定在一起。调用者调用unbindService方法或者调用者Context不存在了(如Activity被finish了),Service就会调用onUnbind->onDestroy。

多次调用startService,该Service只能被创建一次,即该Service的onCreate方法只会被调用一次。但是每次调用startService,onStartCommand方法都会被调用。Service的onStart方法在API 5时被废弃,替代它的是onStartCommand方法。

第一次执行bindService时,onCreate和onBind方法会被调用,但是多次执行bindService时,onCreate和onBind方法并不会被多次调用,即并不会多次创建服务和绑定服务。

3.2 ContentProvider

(1)ContentProvider:

四大组件的内容提供者,主要用于对外提供数据。实现各个应用程序之间的(跨应用)数据共享,比如联系人应用中就使用了ContentProvider,你在自己的应用中可以读取和修改联系人的数据,不过需要获得相应的权限。其实它也只是一个中间人,真正的数据源是文件或者SQLite等

一个应用实现ContentProvider来提供内容给别的应用来操作,通过ContentResolver来操作别的应用数据,当然在自己的应用中也可以

(2)ContentResolver:

内容解析者,用于获取内容提供者提供的数据,ContentResolver.notifyChange(uri)发出消息

(3)ContentObserver:

内容监听器,可以监听数据的改变状态

目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,相应地ContentObsever也分为表ContentObserver、行ContentObserver,当然这是与它所监听的Uri MIME Type有关的

ContentResolver.registerContentObserver()监听消息

getContentResolver->ApplicationContentResolver->ContentProviderProxy<===IBidner====>Transport->NameProvider

query -> ApplicationContentResolver.acqireProvider -> ActivityThread.ActivityMnagerNative.getDefault(0.getContentProvider()  -> ActivityMnagerService.getContendProviderImpl

(4)Contendprovider, COntentResolver, ContentObserver的关系

(5)ContentProvider的权限管理

3.3 BroadcastReceiver

(1)广播的分类和使用场景

(2)本地广播和全局广播有什么差别?

(3)BroadcastReceiver,LocalBroadcastReceiver 区别

4. Activity和Fragment的生命周期,各生命状态发生在什么情况下; Fragment和Activity的通信方式

Activity第一次启动:onCreate->onStart->onResume。

Activity切换到后台( 用户打开新的Activity或者切换到桌面) ,onPause->onStop(如果新Activity采用了透明主题,则当前Activity不会回调onstop)。

Activity从后台到前台,重新可见,onRestart->onStart->onResume。

用户退出Activity,onPause->onStop->onDestroy。

onStart开始到onStop之前,Activity可见。onResume到onPause之前,Activity可以接受用户交互。

在新Activity启动之前,栈顶的Activity需要先onPause后,新Activity才能启动。所以不能在onPause执行耗时操作。

onstop中也不可以太耗时,资源回收和释放可以放在onDestroy中。

5. Activity的四种launcherMode

Standard: 每次都会新建示例;

SingleTop: 默认和启动这一task。 如果task顶端中有该示例,则重用, 回调OnNewIntent;否则新建

以上两种,默认和启动者一个task,如果指定启动模式为NEW_TASK,则新建一个task。

SingleTask: 启动模式启动Activity时,首先会根据taskAffinity去寻找当前是否存在一个对应名字的任务栈

如果不存在,则会创建一个新的Task,并创建新的Activity实例入栈到新创建的Task中去

如果存在,则得到该任务栈,查找该任务栈中是否存在该Activity实例

        如果存在实例,则将它上面的Activity实例都出栈,然后回调启动的Activity实例的onNewIntent方法

        如果不存在该实例,则新建Activity,并入栈

此外,我们可以将两个不同App中的Activity设置为相同的taskAffinity,这样虽然在不同的应用中,但是Activity会被分配到同一个Task中去。

SingleInstance:  这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。

6. Context

深入理解 Android 中的各种 Context  https://www.jianshu.com/p/31dbe3317fe1

(1) Context是个抽象类, ContextWrapper是封装Context的代理类

(2)ContextImpl继承自Context,ContextImpl 是 Context 的主要实现类,Activity、Service 和 Application 的 Base Context 都是由它创建的

(3) ContextWrapper的子类: ContextThemeWrapper(子类:Activity), Application, Service

(4) Activity的ContextImpl是在ActivityThread的创建和attach: performLaunchActivity

 

(5)Context的作用:

四大组件的交互,包括启动 Activity、Broadcast、Service,获取 ContentResolver 等

获取系统/应用资源,包括 AssetManager、PackageManager、Resources、System Service 以及 color、string、drawable 等

文件,包括获取缓存文件夹、删除文件、SharedPreference 相关等

数据库(SQLite)相关,包括打开数据库、删除数据库、获取数据库路径等

其它辅助功能,比如设置 ComponentCallbacks,即监听配置信息改变、内存不足等事件的发生

 

7. 事件分发

(1)DispatchTouchEvent  -> OnInterceptEvent -> onTouchEvent

(2) InputManagerService -> WindowManagerServiece -> ViewRootImpl -> DecorView( mWindow.callback.disapatchTouchEvent )-> Activity -> PhoneWindow -> DecorView -> ViewGroup/View

8. 动画的几种类型: 

      (1)帧动画, 属性动画,补间动画

(2)Android动画框架实现原理

9. Android数据存储方式

10. 线程切换的方式

AsyncTask, Handler, EventBus, RxJava, IntentService

11. View刷新机制,绘制流程

12. 谈谈对多进程开发的理解以及多进程应用场景
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章