Android四大组件分别是Activity
、Service
、Content Provider
、Broadcast Receiver
- 活动
Actity
:用于表现功能 - 服务
Service
:用于后台运行服务,不提供界面呈现。 - 广播接收器
Broadcast Receiver
:用于接收广播 - 内容提供者
Content Provider
支持多个应用中存储和读取数据,相当于数据库。
活动Activity
- 一个Activity通常就是一个单独的屏幕窗口
- Activity之间通过Intent进行通信
Intent是Android用来首相描述要执行的一个操作,可以在不同组件之间进行沟通和消息传递。
显式的Intent是已知要启动的组件名称,如某个Acitivity的包名和类名,在Intent中明确的指定了Activity,一般而言这种Activity经常用在一个应用中,因为已经明确的知道了需要启动的组件名称。
隐式的Intent是不知道要启动的组件名称,只知道一个Intent动作要执行,如拍照、录像、查看地图。一般而言这种Intent用在不同的应用之间传递消息。 - Android应用中每个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将无法识别。
活动的生命周期
在Android中会维持一个Activity Stack(活动栈),当一个新的活动创建时会被放到栈顶,这个活动就处于运行状态。当再有一个新的活动被创建后,会重新压入栈顶。而之前的活动则会在这个新的活动底下,就像枪梭压入子弹一样,之前的活动会进入后台。
一个活动本质上存在四种状态
- 运行中
Running/Active
活动位于栈顶是可见的,可以与用户交互。 - 暂停
Paused
当活动失去焦点,不能跟用户交互,但依然可见时就处于暂停状态。当一个新的全屏活动或透明的活动放置在栈顶时,活动就会处于暂停状态。此时活动的各种数据还被保持着。只有在系统内存极低的状态下,系统才会自动的销毁活动。 - 停止
Stoped
当一个活动被另一个活动完全覆盖,或点击HOME键退出了后台,此时活动就处于停止状态。此时跟暂停状态相似,此时活动的各种数据还被保持着,当系统别的地方需要使用到内容时,系统会自动的去销毁活动。 - 销毁
Destroyed
当点击返回按钮或系统在内存不足的情况下会将活动从栈中移除销毁,并被系统回收,此时活动处于销毁状态。
服务Service
- 服务通常在后台运行且无需与用户交互
- 服务用于在后台完成用户指定的操作
- 开发人员需要在应用程序配置文件中使用标签
<service></service>
声明全部的服务
服务是Android中实现程序后台运行的解决方案,非常适合去执行一些无需和用户交互而且长期运行的任务。服务运行不依赖于任何用户界面,即使程序被切换到后台,或用户打开另一个应用,服务仍然能够保持正常运行。
不过需要注意的是,服务并不运行在一个独立的进程当作,而是 依赖于创建服务时所在的应用程序进程。某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。另外,不要被服务的后台概念所迷惑,实际上服务并不会自动开启线程,所有的代码都是默认运行在主线程中的。也就是说 ,需要在服务内部手动创建子线程,并在这里执行具体的任务,否则就会出现主线程被阻塞的情况。
服务通常用作在后台处理耗时的逻辑,与活动一样存在自己的生命周期。
服务用于在后台完成与用户指定的操作,具体可分为两种启动方式。
started
启动
指当应用程序组件调用startService()
方法启动服务时,服务处于started
状态。启动它的组件和服务并没有关联,只有当服务调用stopSelf
或其他组件调用stopService
时才会终止。bound
绑定
指当应用程序组件调用bindService()
方法绑定到服务时,服务处于bound
状态。其他组件可通过回调获取服务的代理对象和服务交互,双方也进行了绑定,当启动方销毁时服务会自动进入unBind
操作,当发现所有绑定都进行了unBind
时才会销毁服务。
startService()
与bindService()
的区别
启动服务是由其他组件调用startService()
方法启动的,这导致服务的onStartCommand()
方法被调用。当服务是started
状态时,生命周期与启动它的组件无关,可在后台无限期运行,即使启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopSelf()
方法停止,或者由其他组件调用stopService()
方法停止。使用bindService()
方法启用服务,调用者和服务绑定在了一起,调用者一旦退出服务也就会终止。
服务的onCreate
回调中可以作耗时的操作吗?如果需要作耗时操作应该怎么做呢?
服务的onCreate
回调中不可以作耗时操作,因为服务的onCreate
是在主线程ActivityThread
中调用的,耗时操作会阻塞UI。如果需要作耗时操作可采用线程和Handler
的方式。
内容提供者Content Provider
- Android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序,其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。
- 只有需要在多个应用程序间共享数据时才需要内容提供者
- ContentProvider实现数据共享
ContentProvider用于保存和获取数据,并使其对所有应用程序可见,这是不同于应用程序之间共享数据的唯一方式,因为Android没有提供所有应用共同访问的公共存储区。 - 开发人员不会直接使用ContentProvider类的对象,大多通过ContentResolverr对象实现对ContentProvider来管理。
- ContentProvider使用URI来唯一标识其数据集,这里使用的URI以
content://
作为前缀表示数据由ContentProvider来管理。
广播接收器Broadcast Receiver
- 应用可以使用Broadcast Receiver对外部事件进行过滤,只对感兴趣的外部事件进行接收并做出响应。
- 广播接收器美俄有用户界面
- 广播接收者的注册有两种方式,分别是程序动态注册和AndroidManifest文件中进行静态注册
- 动态注册广播接收器的特点是当用来注册的Activity关闭后广播也会失效
- 静态注册无需担心广播接收器是否被关闭,只要设备时开启状态,广播接收器也时打开着的。
- Android有一套本地广播机制用于解决广播的安全问题
Android中广播是一种广泛应用在应用程序之间传递消息的机制,广播接收器是对发送出来的广播进行过滤接收并响应的一类组件。可以使用广播接收器让应用对一个外部事件做出响应。
例如:当电话呼入这个外部事件到达时可利用广播接收器进行处理。当下载一个程序成功完成时,可一样利用广播接收器进行处理。
广播接收器不使用NotificationManager
来通知用户这些事件发生了。广播接收器 即可以在AndroidManifest.xml中注册,也可以在运行时的代码中使用Context.registerReceive()
进行注册。主要是注册了,当事件来临时,即使程序没有启动,系统也在需要的时候启动程序。各种应用可以通过使用Context.sendBroadcast()
方法将它们自己的Intent广播给其他应用程序。