Android四大组件
四大组件:Activity,Service,Broadcast,ContentProvider
只有BroadcastReceiver可以在AndroidManifest或代码中册,其他都必须在AndroidManifest文件中注册
只有ContentProvider的调用不需要借助Intent,其他三个组件都需要借助Intent
- Activity是一种展示型组件,户展示界面并和用户交互
- 对用户来说Activity就是一个Android应用的全部,其他三大组件对用户都是不可感知的
- 可由显式(package name + class name)或者隐式Intent(action)来启动
- 只有一种运行模式:启动状态
- 可以通过finish方法结束(最上面的Activity移出了栈)
- Service是一种计算型组件,用于在后台执行计算任务
- 有两种运行模式:启动状态和绑定状态
- 启动状态:Service内部可以做一些后台计算,并且不需要和外界有直接的交互
- 绑定状态:Service内部可以做一些后台计算的同时,外界可以很方便地和Service组件进行通信
- Service的onBinde只会执行一次除非Service被终止了,其他会调用onRebind
- 特别注意service本身是运行在主线程中的,因此耗时任务需要在单独的线程中去完成。
- 超过20 seconds会提示ANR,建议使用线程池
- 停止需要灵活采用stopService和unBindService两个方法
- 有两种运行模式:启动状态和绑定状态
- BroadcastReceiver广播是一种消息型组件,用于在不同的组件乃至不同的应用之间传递消息
- 广播有两种注册方式:静态注册和动态注册
- 静态注册是在AndroidManifest中注册,在应用安装的时候会被系统解析,不需要应用启动就可以收到相应的广播。
- 动态注册需要通过Context.registerReceiver()来注册,需要应用启动才能注册并接收广播
- 通过Context的一系列send发送广播,发送和接收过程匹配都是通过广播接收者额来描述
- 低耦合的观察者模式
- 不适合执行耗时操作,10 seconds就会ANR
- BroadcastReceiver组件一般来说不需要停止,它也没有停止的概念
- 默认广播不会发给已停止的应用(好像是Android 3.1开始)
- ContentProvider是一种数据共享型组件,用于向其他组件乃至其他应用共享数据。
- 内部需要实现增删改查四种操作
- 一版来说ContentProvider都应该是单例的(默认android:mulitprocess 为false)
- 内部维持一份数据集合可以通过数据库实现,也可以采用其他任何类型(比如List,Map等)。对数据集没有任何要求
- 需要注意ContentProvider中的insert、delete、update、query方法需要处理好线程同步,因为这几个方法是在Binder线程池中被调用
- ContentProvider组件也不需要手动停止
- ContentProvider的OnCreate会先于Application的OnCreate执行
总结:
- Activity, Service, BroadcastReceiver, ContentProvider的工作流程都离不开AMS,ApplicationThread,ActivityThread
- ApplicationThread(Binder类型)是ActivityThread的内部类,ActivityThread持有ApplicationThread的实例
- AMS也持有ApplicationThread实例(ActivityThread main方法调用attach传给AMS)
- ApplicationThread是实现AMS和ActivityThread间的通信,实质上Binder机制通讯