Android 篇
收集了 Android 面试相关的知识点
Android 系统架构分为四层
- 应用程序 (Applications)
- 应用程序框架 (Application Frameworks)
- 系统运行库与 Android 运行环境 (Libraris & Android Runtime)
- Linux 内核 (Linux Kernel)
Activity 四种启动模式
standard
标准模式,每次都新建一个 Activity 实例,即使栈中已经存在该 Activity 实例,只要不在栈顶也会重新创建。过于浪费,为了优化应该尽量考虑余下三种方式。
singleTop
如果在__任务栈顶__已有该 Activity 的实例则重用(会调用实例的 onNewIntent() ),否则新建并压入栈顶。
场景:新闻,阅读类 App 的内容页面。
singTask
如果在__任务栈中__已有该 Activity 的实例,将其上面的任务终止并移除,重用该实例(调用 Activity 的 onNewIntent() )。否则新建实例并压入栈顶。
场景:浏览器的主页,不管从多少个应用启动浏览器,只会启动主页面一次,其余情况都会走 onNewIntent(), 并且清空主页上面的其他页面。
singleinstance
允许不同应用,进程线程等共用一个实例,无论从何应用调用该实例,都重用(onNewIntent() )。
场景:闹铃,将闹铃提醒与闹铃设置分离。
配置方法;
1 | <activity |
Activity 生命周期
1 | onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy() |
Service 生命周期
Service 得启动方式有两种( startService() 和 bindService() ),不同的启动方式他们的生命周期是不一样的。
- startService() 生命周期:
1 | startService() -> onCreate() -> onStartCommand() -> onDestory() |
startService() 启动服务时,通过 intent 传值,在 onCommand() 方法中获取值的时候,一定要判断 intent 是否为 null。
startService() 启动服务后,再多次调用 ,startService() 和 onCreate() 方法也只会被调用一次。而 onStartCommand() 会被多次调用。stopService() 的时候,onDestory() 就会被调用,从而销毁服务。
- bindService() 生命周期:
1 | bindService() -> onCreate() -> onBind() -> onUnBind() -> onDestory() |
这种方式启动 Service 的好处是更方便在 Activity 中操作 Service , 比如 Service 中有几个方法:a,b, 如果要在 Activity 中调用,需要在 Activity 中获取 ServiceConnection 对象,通过 ServiceConnection 来获取 Service 中内部类的类对象,然后通过这个类对象就可以调用类中的方法,当然这个类需要继承 Binder 对象。
Broadcast 注册方式与区别
- 静态注册
也可以称为常驻型广播,这种广播需要在 AndroidManifest.xml 中进行注册,这种方式注册的广播,不受页面生命周期的影响,即使退出了页面,也可以接收到广播,一般用于开机启动等,由于这种事常驻行广播,所以会占用 CPU 的资源。
- 动态注册
动态注册实在代码中注册了,这种注册也叫非常驻型广播,收到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新 UI 方面。这种注册方式优先级较高。最后需要解绑,否则会内存泄漏。
广播是分为有序广播和无序广播。
View 的绘制流程
- 自定义控件:
- 组合控件。这种自定义控件不需要我们手动绘制,而是使用原生控件组合成新的控件。如标题栏。
- 继承原有控件。这种自定义控件在原生控件提供的方法外,可以自己添加一些方法。如制作圆角,圆形图片。
- 完全自定义控件。这个 View 上所展示的内容全部都是我们自己绘制出来的,比如说制作水波纹进度条。
View 的绘制流程: onMeasure() -> onLayout() -> onDraw()
- onMeasure(): 测量视图大小,从顶层父 View 到子 View 递归调用 measure 方法,measure 方法又返回 onMeasure。
- onLayout(): 确定 View 位置,进行页面布局。从顶层父 View 向子 View 的递归调用 view.layout() 方法的过程,即父 View 根据上一步 measure 子 View 所得到的布局大小和布局参数,将子 View 放在合适的位置上。
- onDraw(): 绘制视图。ViewRoot 创建一个 Canvas 对象,然后调用 onDraw() 。
六个步骤:
① 绘制视图的背景;
② 保存画布的图层(Layer);
③ 绘制 View 的内容;
④ 绘制 View 子视图,如果没有就不用;
⑤ 还原图层(Layer);
⑥ 绘制滚动条。