
安卓四大组件包括Activity活动、Service服务、Broadcast Receicer广播接收器、Content Provider内容提供者。四大组件是Android应用的基本构建块每个组件都有特定的职责通过Intent通信需要在AndroidManifest中声明除动态注册的 BroadcastReceiver 外。界面展示--后台干活的--传递消息--数据存储这个描述很形象一、Activity活动1、介绍Activity是一个应用程序组件提供一个屏幕负责用户界面的展示和交互是用户操作的单屏窗口可以通过setContentView(View)来显示指定控件。在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。2、四个基本状态(1) Active/Running一个新Activity启动入栈后它显示在屏幕最前端处于栈的最顶端(Activity栈顶)此时它处于可见并可和用户交互的激活状态叫做活动状态或者运行状态。(2) Paused当Activity失去焦点被一个新的非全屏的Activity或者一个透明的Activity被放置在栈顶此时的状态叫做暂停状态(Paused)。此时它依然与窗口管理器保持连接Activity依然保持活力保持所有的状态成员信息和窗口管理器保持连接但是在系统内存极端低下的时候将被强行终止掉。所以它仍然可见但已经失去了焦点故不可与用户进行交互。(3) Stopped如果一个Activity被另外的Activity完全覆盖掉叫停止状态Stopped。它依然保持所有状态和成员信息但它不再可见它的窗口被隐藏当系统内存需要被用在其他地方的时候Stopped的Activity将被强制终止。(4) Killed如果一个Activity是Paused或者Stopped状态系统可以将该Activity从内存中删除Android系统采用两种方式进行删除要么要求该Activity结束要么直接终止它的进程。当该Activity再次显示给用户时必须重新开始和重置前面的状态。3、Activity栈Android是通过一种Activity栈的方式来管理Activity的一个Activity的实例的状态决定他在栈中的位置。处于前台的Activity总是在栈的最顶端当前台的Activity因为异常或其他原因被销毁时处于栈第二层的Activity将被激活上浮到栈顶。当新的Activity启动入栈时原Activity会被压入到栈的第二层。一个Activity在栈中的位置变化反映了它在不同状态间的转换。4、启动方式通过 Intent 显式指定类名或隐式指定 Action、Category启动。5、典型用途展示界面、处理用户输入、跳转页面。二、Service服务1、介绍Service在后台执行长时间运行操作的组件不提供用户界面。它运行在主线程因此耗时操作需在子线程执行如后台执行音乐播放、文件下载。2、启动方式(1) 启动服务通过Started Service启动独立运行即使启动它的组件销毁服务仍可运行需调用stopSelf()或外部topService()停止。当Service被停止时系统会销毁它。(2) 绑定服务通过bindService()绑定提供客户端-服务器接口生命周期与绑定的组件绑定当所有绑定者解绑时销毁。Bounded Service被绑定的Service是当其他组件调用bindService()来创建的客户可以通过一个IBinder接口和Service进行通信客户可以通过unbindService()方法来关闭这种连接一个Service可以同时和多个客户绑定当多个客户都解除绑定之后系统会销毁它。3、典型用途播放音乐、文件下载、后台数据同步。三、BroadcastReceiver广播接收器1、介绍BroadcastReceiver广播接收器是用于监听/接收应用发出的广播消息并作出响应。本身不包含UI但可启动 Activity 或 Service 进行后续操作。应用场景不同组件之间通信(包括应用内/不同应用之间)与Android系统在特定情况下的通信(如当电话呼入时、网络可用时、系统刚开机等)多线程通信。Android广播分为两个角色:广播发送者、广播接收者。2、实现原理Android中的广播使用了设计模式中的观察者模式基于消息的发布/订阅事件模型。模型中有3个角色消息订阅者广播接收者/消息发布者广播发布者/消息中心AMS即Activity Manager Service--管理处理的系统广播接收者通过Binder机制在AMS注册广播发布者通过Binder机制向AMS发送广播AMS根据广播发送者要求在已注册列表中寻找合适的广播接收者寻找依据IntentFilter / PermissionAMS将广播发送到合适的广播接收者相应的消息循环队列中3、注册方式静态注册在AndroidManifest.xml里通过标签声明当应用首次启动时系统会自动实例化mBroadcastReceiver类并注册到系统中静态注册是常驻广播不受任何组件生命周期的影响。动态注册在代码中通过调用Context的registerReceiver()方法进行动态注册BroadcastReceiver注册广播后,要在相应位置记得销毁广播,即在onPause()中unregisterReceiver(mBroadcastReceiver)当此Activity实例化时会动态将MyBroadcastReceiver注册到系统中当此Activity销毁时动态注册的MyBroadcastReceiver将不再接收到相应的广播。动态广播最好在Activity的onResume()注册、onPause()注消。原因对于动态广播,有注册就必然得有注销否则会导致内存泄露。重复注册重复注销也不允许动态注册是非常驻广播灵活跟随组件的生命周期变化。广播分为有序广播和无序广播广播接收者有优先级。有序广播优先级高的可以对消息进行修改或不修改。4、生命周期只有 onReceive() 方法有效执行时间应尽量短10 秒否则会触发 ANR。如需长时间工作应启动 Service。5、典型用途监听系统事件如网络变化、跨应用通信、定时任务唤醒。四、Content Provider内容提供者1、介绍用于在不同应用程序之间共享数据为存储和读取数据提供了统一的接口。Content Provider主要功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。Android系统为一些常见的数据类型如音乐、视频、图像、手机通信录联系人信息内置了一系统的Content Provider这些都位于android.provider包下。持有特定的许可可以在自己开发的应用程序中访问这些Content Provider。使用Content Provider应用程序可以实现数据共享。让自己的数据和其他应用程序共享的方式有两种创建自己的Content Provider即继承ContentProvider的子类将自己的数据添加到已有的Content Provider中去后者需要保证现有的Content Provider和自己的数据类型相同且具有该Content Provider的写入权限。2、数据模型Content Provider将其存储的数据表以数据表的形式提供给访问者在数据表中每一行为一条记录每一列为具有特定类型和意义的数据。每一条数据记录都包括一个ID数值字段该字段唯一标识一条数据。3、访问Content Provider中的数据访问Content Provider中的数据主要通过ContentResolver对象ContentResolver可以用来对Content Provider中的数据进行查询query()、插入insert()、修改update()和删除delete()等操作以查询为例查询一个Content Provider需要拿握如下的信息唯一标识Content Provider的URI需要访问的数据字段名称该数据字段的数据类型查询Content Provider的方法有两个ContentResolver的query()和Activity对象的managedQuery()4、提供的函数query()查询insert()插入update()修改delete()删除getType()得到数据类型onCreate()创建时的回调函数5、实现过程定义一个CONNECT_URI常量定义一个类继承Content Provider实现query() 、 delete() 、 update() 、 insert() 、 onCreate() 、 getType()方法在AndroidManifest.xml中声明6、典型用途系统通讯录、媒体库、自定义应用数据共享。五、组件通信--IntentIntent 是四大组件间的信使用于启动 Activity/Service、发送广播。显式 Intent定具体组件类指名常用于应用内部。隐式 Intent指定 Action、Category、Data系统根据 IntentFilter 匹配目标组件。IntentFilter在 Manifest 中声明组件能响应的隐式 Intent 类型。