Android 是一个开源的,基于 Linux 的移动设备操作系统。Android 编程是基于 Java 的,因此理解 Java 将利于更好得进行 Android 应用程序开发。

1 四大组件

1.1 Activity

  • 启动模式
    • 标准模式(standard):可以有多个相同的实例,也允许多个相同 Activity 叠加。
    • 栈顶复用模式(singleTop):可以有多个实例,但是不允许多个相同 Activity 叠加。如果 Activity 在栈顶,启动相同的 Activity,不会创建新的实例,而会调用其 onNewIntent 方法。
    • 栈内复用模式(singleTask):只有一个实例。在同一个应用程序中启动 Activity,若 Activity 不存在则会在当前 task 创建一个新的实例,若存在则会把 task 中在其之上的其它 Activity destory 掉并调用它的 onNewIntent 方法。
    • 单例模式(singleInstance):只有一个实例,并且这个实例独立运行在一个 task 中,不允许有别的 Activity 存在。
  • 生命周期
    • 完整生命周期:完整生命周期始于 onCreate() 方法回调,止于 onDestroy() 方法回调
      • onCreate() 生命周期的第一个方法,表示 Activity 正在创建/启动
      • onDestroy() 生命周期的最后一个方法,表示 Activity 即将被销毁
    • 可见周期:可见周期始于 onStart() 方法回调,止于 onStop() 方法回调
      • onStart() Activity 可见时调用,此时 Activity 尚未处于前台
      • onStop() Activity 由可见到不可见时回调此方法
      • onRestart() 该方法触发的前提是 onStop 方法被调用
    • 前台周期:前台周期始于 onResume() 方法回调,止于 onPause() 方法回调
      • onResume() 该方法的回调标识 Activity 处于前台
      • onPause() Activity 即将进入后台时回调此方法

1.2 Service

服务是Android中实现程序后台运行的解决方案,服务依赖于创建服务时所在的应用程序进程。分为本地服务和远程服务。

生命周期:服务的整个生命周期从调用 onCreate() 开始起,到 onDestroy() 返回时结束。

  • 绑定模式:从调用 bindService() 开始,执行的方法依次为 onCreate()、onBind(),解除绑定的时候依次执行 onUnbind()、onDestory()。
  • 非绑定模式:从调用 startService() 开始,执行的方法依次为 onCreate()、onStartCommand(),Service 关闭的时候调用 onDestory()。

1.3 BroadcastReciver

主要用于对广播消息(Intent)的过滤并响应的控件。可以理解为全局的监听器。

生命周期:广播接收者的生命周期非常短暂的,在接收到广播的时候创建,onReceive() 方法结束之后销毁。

类型

  • 有序广播:按照被接收者的优先级顺序,在被接收者中依次传播,每个对象有权终止广播。
  • 无序广播:完全异步,逻辑上可以被任何广播接收者接收到。优点是效率较高。缺点是一个接收者不能将处理结果传递给下一个接收者,并无法终止广播 intent 的传播。(标准广播)

注册方式

  • 静态广播:不管应用程序是否处于活动状态,都会进行监听。每次触发都会建立新的 Receiver 对象。
  • 动态广播:代码中进行注册,然后添加不同的 Action。动态注册的广播一定要取消注册,在 onDestroy() 方法中调用 unregisterReceiver()。

发送广播: 发送广播前,要先定义一个接收器,先确定目标,然后再发送。

1.4 ContentProvider

ContentProvider 是应用程序之间共享数据的接口,进程间进行数据交互和共享,即跨进程通信。ContentProvider 的底层是采用 Android 中的 Binder 机制。

  • 统一资源标识符(URI)
  • MIME 数据类型:多功能 Internet 邮件扩充服务

使用的时候首先自定义一个类继承 ContentProvider,然后覆写 query()、insert()、update()、delete()、onCreate()、getType() 方法。

2 UI控件

2.1 View

View 是用户接口的基础构件,Android 应用的所有 UI 组件都是继承了 View 类。表示屏幕上的一块矩形区域,负责绘制这个区域和事件处理。View 默认为可见的,不是默认值时先调用 onVisibilityChanged()。

分类

  • View
    • 继承 View 重写 onDraw()
    • 继承特定的 View:TextView、Button、EditText、Progressbar、ImageView
  • ViewGroup
    • 继承 ViewGroup 派生特殊的 Layout
    • 继承特定的 ViewGroup:LinearLayout、RelativeLayout、ConstraintLayout 等

View 生命周期

  1. Creation(创建):onFinishInflate()
  2. Layout(布局)
    • onMeasure(int, int)
    • onLayout(boolean, int, int, int, int)
    • onSizeChanged(int, int, int, int)
  3. Drawing(绘制)
    • onDraw(android.graphics.Canvas)
  4. Event processing(事件处理)
  5. Focus(聚焦)
  6. Attaching(附用)
    • onAttachedToWindow()
    • onDetachedFromWindow()

主要组件

  • MotionEvent:当手指触摸屏幕时,将产生 Touch 事件。Touch 事件的相关细节被封装成 MotionEvent 对象。
  • TouchSlop:系统所能识别出的被认为是滑动的最小距离
  • VelocityTracker:速度追踪,用于追踪手指在滑动中的速度
  • GestureDetector:手势检测,用于辅助检测用的单击,滑动,长按,双击等行为

View 的滑动

  1. scrollTo 与 scrollBy
  2. 改变布局参数 LayoutParams:重写 onTouchEvent()
  3. Scroller 类实现平滑滑动,本身并不能实现滑动,需要配合 View 的 computeScroll() 方法,不断的让 View 重绘
    • startScroll() 开启平滑移动过程
    • computeScrollOffset() 判断是否完成了滑动
    • getCurrX() 和getCurrY() 获取当前滑动坐标
  • 继承已有的 View
    1. 重写 onMeasure()
    2. 用 getMeasuredWidth() 和 getMearsureHeight() 获取测量到的尺寸
    3. 计算出最终要的尺寸
    4. setMeasuredDimension(w, h) 保存结果
  • 完全自定义 View
    1. 重写 onMeasure()
    2. 计算出自己的尺寸 MeasureSpec.getSize(widthMeasureSpec); MeasureSpec.getSize(heightMeasureSpec);
    3. 用 resolveSize() 或 resolvesizeAndState() 修正结果
    4. setMeasuredDimension(w, h) 保存结果
  • 自定义 Layout:重写 onMeasure()、onLayout()

RecyclerView 是 Google 推出用来代替 ListView 组件的。RecyclerView 强制使用了 ViewHolder,直接把 viewholder 的实现封装起来,用户只要实现自己的 viewholder 就可以了,该组件会自动帮你回收复用每一个 item。

2.2 Menu

分类

  • 选项菜单 OptionMenu
  • 上下文菜单 ContextMenu

使用

  1. 在xml文件中定义布局文件
  2. 重写 onCreateOptionsMenu() 或 onCreateContextMenu(),创建目录
  3. 重写 onOptionsItemSelected() 或 onContextItemSelected(),响应目录的点击事件

3 Adapter

使用 ListView 需要三个元素:

  1. ListView 控件:展示每条数据的框架;
  2. Adapter 适配器:连接数据与展示 ListView 的中介,通知 View 绘制多少 View,每条 View 怎么绘制,View 内部事件如何响应;
  3. 数据:具体被映射的字符串、图片、状态等信息,有特定的格式要求,具体视 Adapter 实现而定;

Adapter 接口

  • ListAdapter 接口:连接 ListView 和数据
  • SpinnerAdapter 接口
  • BaseAdapter 抽象类,实现自 ListAdapter 接口和 SpinnerAdapter 接口
    • ArrayAdapter<T>:用于显示一行文字
    • SimpleAdapter:可以展现很多种数据,默认只允许显示 Checkable、TextView、ImageView 的数据
    • CursorAdapter
    • 自定义 Adapter

4 安卓通信机制

进程通信方式

  • Bundle - 四大组件间的进程间通信
  • 文件共享 - 交换简单的数据,对实时性要求不高
  • ContentProvider - 一对多的进程间数据共享
  • BroadcastReceiver - 一对多的低频率单向通信
  • Socket - 网络间的数据交换
    • 标准 Java 接口(java.NET)
    • Apache 接口(org.apache.http)
    • Android.net 网络接口
⤧  Next post 【Wiki】Engineering Wiki ⤧  Previous post 【DSA】数据结构与算法 10 快速幂