android开发艺术(七)之四大组件
1. 四大组件的运行状态
Activity
- 类型:展示型组件。
- 作用:展示一个界面并和用户交互。
- 使用:
- 需要在AndroidManifest中注册
- 只有一种状态
- 需要借助Intent启动,两种方式:
- 显示Intent:
Intent intent=new Intent(xxx.this,xxx.class); startActivity(intent);
- 隐式Intent:
Intent intent=new Intent(); intent.setAction(xxx); intent.addCategory(xxx); startActivity(intent);
- 显示Intent:
- 四种启动模式:
standard:标准模式
singleTop:栈顶复用模式
singleTask:栈内复用模式
singleInstance:单实例模式 - 对用户而言是可见的,通过
finish()
结束一个Activity。
Service
-
类型:计算型组件。
-
使用:
- 需要在AndroidManifest中注册。
- 需要借助Intent启动:
Intent intent = new Intent(xxx.this, xxx.class); startService(intent);
- 两种运行状态:
启动状态:通过startService()
可以进行后台计算,并且不需要和外界有直接的交互,本身在主线程,耗时操作在独立线程;
绑定状态:通过bindService()
绑定状态既可以计算,也可以和外界进行通信
-
用户无法感知,通过
unBindService()
和stopService()
完全停止一个Service。
BroadcastReceiver
- 类型:消息型组件。
- 作用:在不同的组件乃至不同的应用之间传递消息。
- 使用:
- 两种注册方式:
动态注册:通过Context.registerReceiver()
&Context.unRegisterReceiver()
,必须要应用启动才能注册并接收广播。
静态注册:在AndroidManifest文件中注册,在安装应用时就会被解析,不需要应用启动就可收到相应广播。
- 两种注册方式:
- 需要借助Intent发送广播:
Intent intent = new Intent("xxx"); sendBroadcast(intent);
- 四种广播类型:
普通广播 有序广播 本地广播 粘性广播 - 用户无法感知,没有停止概念。
ContentProvider
- 类型:数据共享型组件。
- 作用:向其他组件乃至其他应用共享数据。它的内部需要实现增删改查操作,以便维持他内部的数据集合,数据集合的具体实现可以是数据库,也可以是list或map;
- 使用:
- 需要在AndroidManifest中注册。
- 无需借助Intent启动。
- 四种操作:增删改查需要处理好线程同步,因为这几个方法是在Binder线程池被调用的
insert():添加数据 update():更新数据 delete():删除数据 query():查询数据 - 用户无法感知,无需手动停止
2. Activity的工作流程
- 最开始是Activity的startActivity,虽然有多个重载,但是最终会调用
startActivityForResult
方法 - 接着是调用的Instrumentation的
execStartActivity
,并存在checkStartActlvityResult()
检查异常 - 启动是由
ActivityManagerNative. getDefault()(AMS)
的startActivity
实现的 - AMS将活动的启动转移到
ActivityStackSupervisor
的startActivityMayWait
- RealStartActivityLocked使用app.Thread属于IApplicationThread,包含活动和服务的启动停止接口,实现了与活动和service启动停止相关的功能;
- 最终实现类ApplicationThread,它通过scheduleLaunchActivity实现活动的启动。ApplicationThread.scheduleLaunchActivity() 将启动Activity的消息发送并交由Handler H处理
- Handler 对消息的处理会调用handleLaunchActivity()->performLaunchActivity()得以最终完成Activity的创建和启动。performLaunchActivity主要实现:
-
从ActivityClientRecord中获取待启动的Activity的组件信息
-
通过Instrumentation的newActivity方法使用类加载器创建Activity对象,其中Instrumentation中的newActivity方法,就是通过反射的反射创建Activity对象
-
通过LoadedApk的makeApplication方法来尝试创建Application对象
-
创建ContextImpl对象并通过Activity的attach方法来完成一些重要的数据初始化
-
通过Instrument调用Activity的onCreate方法回调