Android四大组件详解

Posted 是阿超

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android四大组件详解相关的知识,希望对你有一定的参考价值。

android四大组件详解

简单介绍:Android四大核心组件指的是 Activity、Service、Content Provider、BroadCast Receiver,核心组件都是由 Android系统进行管理和维护的,一般都要在清单文件中进行注册或者在代码中动态注册。

活动(activity):用于表现功能;
服务(service):后台运行服务,不提供界面呈现;
内容提供者(Content Provider):支持多个应用中存储和读取数据;
广播接受者(Broadcast Receive):用于接收广播。

Activity(活动)

概念

概念:在android中,Activity相当于一个页面,可以在 Activity中添加 Button、CheckBox 等控件,一个android程序有多个Activity组成。
// Activity 之间通过 Intent 进行通信;直接通过 Bundle 对象来传递

  • 一个 Activity 通常就是一个单独的屏幕(窗口)
  • Activity 之间通过 Intent 进行通信。
  • Android 应用中每一个 Activity 都必须要在 AndroidManifest.xml 配置文件中声明,否则系统将不识别也不执行该Activity。在 android stdio会自动生成,但 eclipse 需要自己手动添加
    定义与作用: Activity 的中文意思是 活动,代表手机屏幕的一屏,或是平板电脑中的一个窗口,提供了和用户交互的可视化界面。一个活动开始,代表 Activity 组件启动,活动 结束,代表一个 Activity 的生命周期结束。一个 Android 应用必须通过 Activity 来 运行 和 启动,Activity 的生命周期交给系统统一管理。Activity 是用于处理 UI 相关业务的,比如加载界面、监听用户操作事件。

Service(服务)

概念

概念:Service(服务)是安卓中的四大组件之一,它通常用作在后台处理耗时的逻辑,与 Activity 一样,它存在自己的生命周期,也需要在 AndroidManifest.xml 配置相关信息。开发人员需要在应用程序配置文件中声明全部的 service,使用 < service>< /service> 标签。
Service 通常位于后台运行,它一般不需要与用户交互,因此 Service 组件没有图形用户界面。Service 组件需要继承Service 基类。Service 组件通常用于为其他组件提供后台服务或监控其他组件的运行状态。

定义与作用

定义与作用:Service(服务)是一个没有用户界面的专门在后台处理耗时任务的 Android 组件,它没有UI。它有两种启动方式,startService和bindService。其他应用组件能够启动 Service,并且当用户切换到另外的应用场景,Service将持续在后台运行。另外,一个组件能够绑定到一个service与之交互(IPC机制),例如,一个service可能会处理网络操作,播放音乐,操作文件I/O或者与内容提供者(content provider)交互,所有这些活动都是在后台进行。
Service 还有一个作用就是提升进程(每个应用都是一个进程)的优先级,进程的优先级指的是在 Android 系统中,会把正在运行的应用确定一个优先级,当内存空间不足时,系统会根据进程的优先级清理掉一部分进程占用的内存空间,以获得足够的内存空间以供新启用的应用运行。
详细的进程优先级划分如下:

  • 前台进程:应用程序存在Activity正位于前台,可见并可控
  • 可见进程:应用程序存在Activity处于局部可见状态,即局部可见却不可控
  • 服务进程:应用程序存在正在运行的Service
  • 后台进程:应用程序的所有Activity均被置于后台,没有任何Activity可见
  • 空进程:已经退出的应用程序

Content Provider(内容提供器)

介绍

介绍:Content Provider是 android 四大组件之一的内容提供器,它主要的作用就是将程序的内部的数据和外部进行共享,为数据提供外部访问接口,被访问的数据主要以数据库的形式存在,而且还可以选择共享哪一部分的数据。这样一来,对于程序当中的隐私数据可以不共享,从而更加安全。Content Provider 是 android中 一种跨程序共享数据的重要组件

  • android 平台提供了 ContentProvider 把一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过ContentResolver类 从该内容提供者中获取或存入数据。
  • 只有需要在多个应用程序间共享数据是才需要 内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。
  • ContentProvider 实现数据共享。ContentProvider 用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为 android 没有提供所有应用共同访问的公共存储区。
  • 开发人员不会直接使用 ContentProvider 类的对象,大多数是通过 ContentResolver 对象实现对 Content Provider 的操作。
  • Content Provider 使用 URI 来唯一标识其数据集,这里的 URI 以 content:// 作为前缀,表示该数据由 Content Provider来管理。

四大基本组件都需要注册才能使用,每个 Activity、service、Content Provider 都需要在 AndroidManifest 文件中进行配置。AndroidManifest 文件中未进行声明的 activity、服务 以及 内容提供者 将不为系统所见,从而也就不可用。而 broadcast receiver 广播接收者的注册分静态注册(在AndroidManifest文件中进行配置)和通过代码动态创建并以调用Context.registerReceiver()的方式注册至系统。需要注意的是在AndroidManifest文件中进行配置的广播接收者会随系统的启动而一直处于活跃状态,只要接收到感兴趣的广播就会触发(即使程序未运行)。

作用

作用:Content Provider中文意思是内容提供者,Content Provider可以将应用程序自身的数据对外(对其它应用程序)共享,使得其它应用可以对自身的数据进行增、删、改、查操作。

系统的Content Provider

// 使用系统的 Content Provider:
Android 系统使用了许多 Content Provider,将系统中的绝大部分常规数据进行对外共享,系统的 ContentProvider 有很多,例如:通讯录、通话记录、短信、相册、歌曲、视频、日历等等,一般这些数据都存放于一个个的数据库中。同时这些数据一般都需要和第三方的 app 进行共享数据。既然是使用系统的,那么 Content Provider的具体实现就不需要我们担心了,使用内容提供者的步骤如下:
1、获取 Content Resolver 实例
2、确定 Uri 的内容,并解析为具体的 Uri 实例
3、通过 Content Resolver 实例来调用相应的方法,传递相应的参数,但是第一个参数总是 Uri,它制定了我们要操作的数据的具体地址

自定义Content Provider

// 自定义 ContentProvider:
系统的 Content Provider在与我们交互的时候,只接受了一个 Uri 的参数,然后根据我们的操作返回给我们结果。系统到底是如何根据一个 Uri 就能够提供给我们准确的结果呢?只有自己亲自实现一个看看了。
和之前提到的一样,想重新自定义自己程序中的四大组件,就必须重新实现一个类,重写这个类中的抽象方法,在清单文件中注册,最后才能够正常使用。

Broadcast Receiver广播

概述

概述:
Broadcast Receiver( 广播接收者 )顾名思义就是用来接收来自系统和应用中的广播 的 系统组件。广播是一种一对多的通信方式,即存在1个发送方,若干个接收方。在 Android 系统中,广播体现在方方面面,例如:当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。把这种数据的传递方式的机制称之为 “广播” 。Android 系统会在特定的情景下发出各种广播,例如开机、锁屏了、电量不足了、正在充电了、呼出电话了、被呼叫了……
// android广播分为两个角色:发送者和接收者

广播的作用

  • 用于不同组件间的通信(含:应用内/不同应用之间)
  • 用于多线程通信
  • 与 android 系统的通信

广播接收者的创建

  1. 构建 Intent,使用 sendBroadcast 方法发出广播。
  2. 自定义一个类,该 类 继承 BroadcastReceive 基类
  3. 重写抽象方法 onReceive() 方法
  4. 注册该广播接收者,我们可以在代码中注册,也可以在 manifest.xml 中注册。

广播接收者的类型

  • Normal broadcasts:默认广播。发送一个默认广播使用 Content.sendBroadcast() 方法,普通广播对于接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。
  • Ordered broadcasts:有序广播。发送一个有序广播使用 Content.sendOrderedBroadcast() 方法,有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接收者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播
  • Sticky Broadcast:粘性广播。当处理完之后的 Intent,依然存在,直到你把它去掉。

注册广播的两种方式

广播接收者的注册有两种方法,分别是AndroidManifest文件中进行静态注册和程序动态注册。

  1. 第一种是静态注册,也可成为常驻型广播,这种广播需要在Androidmanifest.xml中进行注册,这中方式注册的广播,不受页面生命周期的影响,即使退出了页面,也可以收到广播这种广播一般用于想开机自启动啊等等,由于这种注册的方式的广播是常驻型广播,所以会占用CPU的资源。
  2. 第二种是动态注册,而动态注册的话,是在代码中注册的,这种注册方式也叫非常驻型广播,收到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新UI方面。这种注册方式优先级较高。最后需要解绑,否会会内存泄露。

静态注册和动态注册的区别

  • 动态注册广播接收者特点是当用来注册的 Activity 关掉后,广播也就失效了。( 动态注册广播不是常驻型广播,也就是说广播跟随 activity 的生命周期。注意:在 activity 结束前,移除广播接收器。 )
  • 静态注册时无需担忧广播接收者是否被关闭,只要设备是开启状态,广播接收者也是打开着的。也就是说哪怕 app 本身未启动,该 app 订阅的广播在触发时也会对它起作用。( 静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。 )

有序广播和无序广播的区别

  • 普通广播: 即为 无序广播,谁都可以接收,并不会相互打扰。普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高,但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播 Intent 的传播;
  • 有序广播:调用 sendOrderedBroadcast(Intent, String permission)方法发送的广播,各广播接收者在接收广播时,会存在一定的先后顺序,即某接收者会先收到广播,其他接收者后收到广播,广播会在各接收者之间按照一定的先后顺序进行传递。在广播的传递过程中,先接收到广播的接收者可以对广播进行拦截或篡改。( 有序广播是按照接收者声明的优先级别(声明在 intent-filter 元素的 android:priority 属性中,数越大优先级别越高,取值范围:-1000 到 1000。也可以调用IntentFilter 对象的 setPriority() 进行设置),被接收者依次接收广播。如:A 的级别高于 B,B 的级别高于 C,那么,广播先传给A,再传给B,最后传给C。A 得到广播后,可以往广播里存入数据,当广播传给 B 时,B可以从广播中得到 A 存入的数据

总结:

  • 当广播为有序广播时:
    1. 优先级高的先接收
    2. 同优先级的广播接收器,动态优先于静态
    3. 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。
  • 当广播为普通广播时:
    1. 无视优先级,动态广播接收器优先于静态广播接收器
    2. 同优先级的同类广播接收器,静态:先扫描的优先于后扫描的,动态:先注册的优先于后注册的。

有序广播接收者们的优先级

有序广播的接收者们的优先级用于确定接收的先后顺序,优先级越高的接收者,将更优先接收到广播,反之,则更靠后接收到广播。

  1. 注册广播时,在广播对应的 IntentFilter 中的 priority 属性直接决定优先级,该属性值为 int 类型的数值,取值越大,则优先级越高!
  2. 如果存在多个广播接收者配置的 priority 属性值相同,则动态注册的广播接收者的优先级高于静态注册的广播接收者。
  3. 如果根据以上两条规则都无法确定优先级,则根据注册的先后顺序确定各接收者们的优先级。

有序广播的拦截和篡改

  • 拦截:在广播接收者中,使用abortBroadcast()方法,可以终止有序广播向后继续传递,即后续的接收者们将无法接收到该广播。注意:该方法只能在接收有序广播时调用!
  • 篡改:在广播接收者中,调用setResult()方法,可以向广播中添加数据,并在后续的接收者中,可以通过getResult()获取这些数据,同时,后续的接收者也可以再次调用setResult()方法重新向广播中写入数据,即覆盖原有的数据,以实现篡改。

一天就学会Android开发四大组件

这个文章主要是讲Android开发的四大组件,本文主要分为

一、Activity详解
二、Service详解
三、Broadcast Receiver详解
四、Content Provider详解
外加一个重要组件 intent的详解。



一、Activity详解
Activty的生命周期的也就是它所在进程的生命周期。