一、四大组件简介
1.活动Activity
活动的生命周期
- onCreate(): 第一次创建活动,在这里完成所欲常规静态设置:包括创建试图,将数据绑定列表中
- onRestart():在活动onStop()之后调用,重新启动
- onStart(); 活动对用户变得可见的时候,如果活动进入前台,后跟onResume(), 如果变为隐藏,后面紧跟着onStop()
- onResume(): 活动开始与用户交互的时候调用,此时活动位于堆栈的顶部,并且有用户输入,后面紧跟onPause()
- onPause(): 当系统即将开始恢复到以前的活动时候调用,暂停的活动不会接收用户输入,并且不能执行任何代码,如果活动返回到前面的时候,则跟随在onResume()之后,如果用户不可见的,则跟随onStop()
- onStop(): 当活动对用户不再可见的时候调用,因为另一个活动已经恢复并且正在覆盖这个活动
- onDestroy(): 在活动被破坏之前收到的最终调用
2.Intent
- 这是Android组件之间进行通信的一种方式
- 显式意图:例如:
new Intent(this. newActivtiy.class)
- 隐式意图:例如:
new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http:www.baidu.com"));
- 显式意图:例如:
- 意图解析
- action
- data
- category
3.服务Service
- 服务是一项长期运行的任务或流程,不需要和用户交互
- 开始:通过调用startService进行启动,一旦启动,即使启动它的组件被销毁了,服务也会无限期的后台运行
- 绑定:通过bindService(), 通过IPC跨进程调用来操作。
生命周期
- onStartCommand(): 服务启动之后会调用这个函数,如果实现了这个功能,就应该通过调用stopSelf() 或者 stopService()来销毁它
- onBind(): 另一个组件想要通过调用bindService()来与服务进行绑定,如果不允许绑定就实现该方法,返回null
- onCreate(): 系统第一次创建这个服务的时候会进行调用这个方法来执行一次性的设置过程(处于onStartCommand()和onBind()之前)
- onDestroy(): 服务不再使用的时候并被销毁的时候
注意点:如果一个组件通过startService() (会有onStartCommand()方法的调用)来启动服务,则该服务将会保持运行状态,直到它停止使用stopSelf()或者另一个组件通过stopService()来停止它;如果一个组件调用bindService()来创建服务(并且不调用onStartCommand()),那么只要该组件绑定了服务,该服务就会运行起来,一旦服务从所有的客户端解除绑定,系统就会销毁它。
4.BroadcastReceiver
- 广播
- 有序广播:被广播接收器接受之后,可被终止,无法向下传递,例如:短信广播
- 普通广播:发送到每一个已经注册的的广播接收器,无法被终止,例如:开机广播,蓝牙广播
- 广播接收器
- 静态注册广播:在AndroidManifest.xml中设置,程序不用启动也可以接收
- 冬天注册广播:代码中注册广播,程序未启动的时候,无法接收广播。
5.内容提供器ContentProvider
- 跨APP,跨进程,共享数据的一款容器
6.对比
组件名 | 主要作用 | 什么时候使用 | 逻辑实现 |
---|---|---|---|
Actvitiy | 负责与用户交互的组件 | 需要编写与用户交互的逻辑代码 | 是一个window容器,内含getWindow方法 |
View | 用户所见即所得,一般绑定在Activity | 编写一个视图供给给用户操作 | 是所有UI控件,容器控件的基类 |
Service | 运行在后台的服务,不需要与用户交互,一般提供各种功能 | 功能服务,或称工具 | ContextWrapper的子类 |
BroadcastReceiver | 广播接收器 | 接受设备内的广播,对此做出相应的业务反应 | 类似于监听器 |
ContentProvider | 存储数据暴露给其他应用 | 需要存储数据的容器 | 数据库 |
ContentResolver | 读取数据 | 从数据库读取数据 | 数据库 |
Intent | Activity\Service\BroadcastReceiver三种组件之间通信靠intent | 组件间传递消息 | NA |
IntentFilter | 筛选项 | 和上面Intent隐式用法相关 | NA |
二、四大组件的启动
Activity的启动
1.startActivity
- 通常使用startActivity函数来启动一个Activity
public void startActivity(Intent intent) {
this.startActivity(intent ,null);
}
public void startActivity(Intent intent, @Nullable Bundle options) {
...
if (options != null) {
startActivityForResult(intent, -1, options);
else {
startActivityForResult(intent, -1);
}
}
pulic void startActivityForResult(Intent intent, int requestCode) {
startActivityForResult(intent, requestCode, null);
}
2.startActivityForResult
public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
if (mParent == null) { // 应用第一次创建Activity, 此时不存在父类的Activity
options = transferSpringboardActivityOptions(options);
Instrumenttation.execStartActivity(this, mMainTread.getApplicationThread(), mToken, this, intent, requestCode, options);
else {
if (options != null) {
mParents.startActivityFromChild(this, intent, requestCode, options);
} else {
mParents.startActivityFromChidl(this, intent, requestCode);
}
}