前言
这是我在读《Android开发进阶 从小工到专家》所摘抄的笔记。需知更多详情,请阅读原著。
Android四大组件:Activity,Service,ContentProvider和Broadcast。
Activity负责UI元素的加载与页面之间的跳转,代表了一个页面单元。Service负责与UI元素无关的工作,如在后台执行耗时的操作等。ContentProvider负责存储、共享数据,使得数据可以在多个应用之间共享。Broadcast则是在各个组件、页面之间进行通信,简化了Android开发中的通信问题。
Activity
Activity的生命周期:
onCreate():会在Activity第一次创建时被调用,通常会在这个函数中完成Activity的初始化操作,如设置布局,初始化视图,绑定事件等。
onStart():在onCreate()函数调用之后被调用,此时的Activity还处在不可见的状态,他的下一个状态就是Activity变得可见的时候,也就是这个函数在Activity在可见之前被调用。
onResume():在Activity变得可见的时候调用,此时的Activity一定位于返回栈的栈顶位置,并处于运行状态。
onPause():在系统准备去启动或者恢复另一个Activity的时候调用,也就是在Activity即将从可见状态变为不可见时,通常会在这个函数中将一些消耗CPU的资源释放掉,以及保存一些关键数据。
onStop():在Activity完全不可见时调用,它和onPause()函数的主要区别在于,如果新启动的Activity是一个对话框式的Activity,那么onPause()函数就会得到执行,而onStop()函数并不会执行。
onDestroy():在Activity被销毁之前调用。
onRestart():在Activity由停止状态重新变为运行状态之前调用,也就是Activity被重新启动。
Activity的结构
Activity -> PhoneWindow -> DecorView -> DefaultLayout -> mContentParent(用户自己的xml布局)
Activity的4种启动模式
standard(标准启动模式)在这种模式下启动的Activity可以被多次实例化,即在同一个任务栈中可以存在多个Activity实例。
* singleTop* 如果Activity的实例已经在任务栈的栈顶,那么再启动这个Activity的时候,不会再创建新的实例,而是重用位于栈顶的那个实例。
singleTask 在一个任务栈中只能有一个该Activity的实例,如果已经存在Activity,系统会销毁处在改Activity之上的所有Activity,最终让改Activity实例处于栈顶。
singleInstance 设置了改模式的Activity会在一个独立的任务中开启,并且这个新的任务中有且只有这一个实例,也就是说改实例启动的其他Activity会自动运行在另一个任务中。当再次启动该Activity实例时,会重用已存在的任务和实例。
Service与AIDL
service默认并不会在子线程中运行,也不会运行在一个独立的进程中,同在执行在UI线程中,因此不要在Service中执行耗时的操作。
- 普通Service
Service的生命周期: onCreate()、onStartCommand()、onDestory()
- IntentService
IntentService将用户的请求执行在一个子线程中,用户只需要覆写onHanddleIntent函数,并且在该函数中完成自己的耗时操作即可。需要注意的是,在任务执行完毕之后IntentService会调用stopSelf自我销毁,因此,它适用于一些短期的耗时操作。
- AIDL
AIDL(Android接口描述语言)是一个接口描述语言,通常用于进程之间的通信。
Broadcast
广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接到方如何处理数据,通过这样的形式达到接收方和发送方之间的完全解耦。
- 普通广播
普通广播完全是异步的,通过context的sendBroadcast()函数发送。效率高,但顺序不确定。缺点:接收者不能处理结果传递到下一个接收者,并且无法终止广播,直到没有与之匹配的广播接收器为止。
- 有序广播
有序广播通过context.sendOrderedBroadcast()来发送的。按照广播接收器的优先级依次执行。
- 本地广播
LocalBroadcastManager.getInstance(context).XXX();
- sticky广播
ContentProvider
书中作者用一个案例去对其讲解,代码篇幅较长,有兴趣可以自行阅读原著。