Android 基础知识点记录

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
2
3
4
5
<activity
android:name=".SingleTopActivity"
android:label="@string/singletop"
android:launchMode="singleTop" >
</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 的绘制流程

  • 自定义控件:
  1. 组合控件。这种自定义控件不需要我们手动绘制,而是使用原生控件组合成新的控件。如标题栏。
  2. 继承原有控件。这种自定义控件在原生控件提供的方法外,可以自己添加一些方法。如制作圆角,圆形图片。
  3. 完全自定义控件。这个 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);

    ⑥ 绘制滚动条。

-------------------本文结束 感谢您的阅读-------------------