Android开发系列——基础篇3:Android四大组件

目录

  • 一、Android四大组件概述
  • 二、Activity
    • 1.简介
    • 2.Activity的配置
    • 3.Activity的生命周期
  • 三、Service
    • 1.简介
    • 2.服务的三种类型
    • 3.服务的生命周期
  • 四、BroadCast Receiver
    • 1.简介
    • 2.Broadcast与Activity的区别
    • 3.Broadcast相关方法
  • 五、Content Provider
    • 1.简介
    • 2.内容组件的组成
    • 3.内容组件的相关方法
  • 总结

本文开始介绍Android四大组件。
首先说明,对Android四大组件的理解并不是一蹴而就的,而是理论+实战项目。在做项目的过程中又回过来反复看理论,需要经过不断的实战的磨练,才能对它们有很好的理解。
本文也是依照这种思路,在实战中不断总结理解理论本身。

一、Android四大组件概述

  • Activity(活动)
  • Service(服务)
  • BroadCast Receiver(广播接受者)
  • Content Provider(内容提供者)

二、Activity

1.简介

Activity 是与用户交互的入口点。它表示拥有界面的单个屏幕。

Activity 类是 Android 应用的关键组件,而 Activity 的启动和组合方式则是Android平台应用模型的基本组成部分。
简单来说,一个Activity就是一个页面。一个APP中可以有一个Activity,也可以有多个Activity。

2.Activity的配置

(1)声明Activity
第一步是在清单文件中(也就是AndroidMainfest.xml)添加元素作为元素的子元素元素。

      <application ... >
          <activity android:name=".ExampleActivity" />
          ...
      </application ... >

此元素唯一的必要属性是 android:name,该属性用于指定 Activity 的类名称。也可以添加用于定义标签、图标或界面主题等 Activity 特征的属性。

(2)声明Intent过滤器
Intent 过滤器是 Android 平台的一项非常强大的功能。通过它,不仅可以根据显式请求启动Activity,也可以根据隐式请求启动Activity。
例如:系统中有两个应用具有相同的功能,当在第三方应用中进行该功能的请求时会有弹窗进行选择。平时弹出的“用以下哪种方式打开文件”就是Intent过滤器在发挥作用。

在清单文件中进行配置:
要使用此功能,您需要在 元素中声明 属性。此元素的定义包括元素,以及可选的元素和/或元素。这些元素组合在一起,可以指定 Activity 能够响应的 intent 类型。

    <activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
        </intent-filter>
    </activity>

(3)声明权限
使用清单的标记来控制哪些应用可以启动某个 Activity。父 Activity 和子 Activity 必须在其清单中具有相同的权限,前者才能启动后者。如果您为父 Activity 声明了元素,则每个子 Activity 都必须具有匹配的元素。

例如你的应用想要使用一个叫socialapp的应用发布文章,则socailapp需要声明调用它本身所需要的权限,你的应用需要在清单文件中声明与它一样的权限。

socailapp清单文件中声明的权限:

   <manifest>
    <activity android:name="...."
       android:permission=”com.google.socialapp.permission.SHARE_POST”

    />

你的应用的清单文件中需要声明的权限:

 <manifest>
       <uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
    </manifest>

3.Activity的生命周期

当用户浏览、退出和返回您的应用时,您应用中的 Activity 实例会在其生命周期的不同状态间转换。Activity 类会提供许多回调,这些回调会让 Activity 知晓某个状态已经更改:系统正在创建、停止或恢复某个 Activity,或者正在销毁该 Activity 所在的进程。

一个 Activity 在其生命周期中会经历多种状态。
可以通过使用一系列回调来处理状态之间的转换。

良好的生命周期回调实现有助于确保你的应用避免:

  • 当用户在使用应用时接听来电,或切换至另一应用时崩溃。
  • 当用户未积极使用它时,消耗宝贵的系统资源。
  • 当用户离开应用并在稍后返回时,丢失用户的进度。
  • 当屏幕在横向和纵向之间旋转时,崩溃或丢失用户的进度。

为了在 Activity 生命周期的各个阶段之间导航转换,Activity 类提供六个核心回调:onCreate()、onStart()、onResume()、onPause()、onStop() 和 onDestroy()。当 Activity 进入新状态时,系统会调用每个回调。

1.onCreate()

是必须实现的回调,在系统创建Activity的时候触发。

创建界面。把页面上的各个元素加载到内存之中。

2.onStart()

onCreate() 退出后,Activity 将进入“已启动”状态,并对用户可见。

开始页面。把页面显示在屏幕上。

3.onResume()

恢复页面。让页面在屏幕上活动起来,例如开启动画、开始任务等。

4.onPause()

暂停页面。让页面在屏幕上的活动停下来。

5.onStop()

停止页面。把页面从屏幕上撤下来。

6.onDestroy()

销毁页面。把页面从内存中清除掉。

7.onRestart()

重启页面,重新加载内存中的页面数据。

三、Service

1.简介

服务是一个通用入口点,用于因各种原因使应用在后台保持运行状态。它是一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业。服务不提供界面。

简单地说,服务是一种即使用户未与应用交互也可在后台运行的组件,因此,只有在需要服务时才应创建服务。

2.服务的三种类型

1.前台:
前台服务执行一些用户能注意到的操作。例如,音频应用会使用前台服务来播放音频曲目。前台服务必须显示通知。即使用户停止与应用的交互,前台服务仍会继续运行。

2.后台:
后台服务执行用户不会直接注意到的操作。例如,对于图片的自动压缩。

3.绑定:
当应用组件通过调用 bindService() 绑定到服务时,服务即处于绑定状态。绑定服务会提供客户端-服务器接口,以便组件与服务进行交互、发送请求、接收结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。
仅当与另一个应用组件绑定时,绑定服务才会运行。多个组件可同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。

3.服务的生命周期

如要创建服务,您必须创建 Service的子类(或使用它的一个现有子类)。在实现中,您必须重写一些回调方法,从而处理服务生命周期的某些关键方面,并提供一种机制将组件绑定到服务(如适用)。

1.onCreate(): 创建服务。

2.onStartCommand(): 开始服务。(Android2.0后)

3.onDestory() : 销毁服务。

4.onBind() : 绑定服务。

5.onRebind() : 重新绑定。该方法只有当上次的onUnbind返回true的时候才会被调用。

6.onUnbind() : 解除绑定。返回值为true表示允许再次绑定,再绑定时调用onBind方法。若返回值为false表示只能绑定一次。默认为false。

四、BroadCast Receiver

1.简介

借助广播接收器组件,系统能够在常规用户流之外向应用传递事件,从而允许应用响应系统范围内的广播通知。由于广播接收器是另一个明确定义的应用入口,因此系统甚至可以向当前未运行的应用传递广播。

广播(Broadcast)用于Android组件之间的灵活通信。

2.Broadcast与Activity的区别

(1)Activity只能一对一通信,而Broadcast可以一对多,一人发送广播,多人接受广播。

(2)对于发送者来说,广播不需要考虑接受者有没有在工作,接收者在工作就接收广播,不在工作就丢弃广播

(3)对于接收者来说,会收到各式各样的广播,所以接收者要自行过滤符合条件的广播才能进行解包处理。

3.Broadcast相关方法

  • sendBroadcast:发送广播。
  • registerReceiver:注册接收器。一般在onStart或onResume方法中注册。
  • unregisterReceiver:注销接收器。一般在onStop或onPause方法中注销。

注意: 如果广播是在应用内使用,不需要跨进程,那最好使用LocalBroadcastManager下的registerRecever和unregisterReceiver方法,这样不但更有效率(不需要跨进程通信),而且安全性更高。

五、Content Provider

1.简介

内容提供程序管理一组共享的应用数据,您可以将这些数据存储在文件系统、SQLite 数据库、网络中或者您的应用可访问的任何其他持久化存储位置。其他应用可通过内容提供程序查询或修改数据(如果内容提供程序允许)。

ContentProvider为APP存取内部数据提供了统一的外部接口,让不同的应用之间得以共享数据。
与SQLite操作的应用自身的内部数据库;文件上传下载操作后端服务器不同,ContentProvider操作的是本设备其他应用的内部数据,是一种中间层次的数据存储形式。

2.内容组件的组成

完整的内容组件由内容提供器ContentProvider内容解析器ContentResolver内容观察器ContentObserver,三部分组成。

3.内容组件的相关方法

  • ContentProvider
    实际编码中,ContentProvider只是一个服务端的数据存取接口,开发者需要在其基础上实现一个具体类,并重写以下相关数据库管理方法:
    (1)onCreate:创建数据库并获得数据库连接。
    (2)query:查询数据。
    (3)insert:插入数据。
    (4)updata:更新数据。
    (5)delete:删除数据。
    (6)getType:获取数据类型。

  • ContentResolver
    内容解析器是客户端APP操作服务端数据的工具,相对应的内容提供器是服务端的数据接口。要获取ContentProvider对象,在Activity代码中调用getContentResolver方法即可。
    ContentResolver提供的方法与ContentProvider是一一对应的。比如query、insert、update、delete、getType等方法。
    其中最常用的query函数,query方法的具体参数说明:
    (1)uri:Uri类型,可以理解为操作的数据表路径。
    (2)projection:字符串数组类型,指定将要查询的字段名称列表。
    (3)selection:字符串类型,指定查询条件。
    (4)selectionArgs:字符串数组类型,指定查询条件中的参数取值列表。
    (5)sortOrder:字符串类型,指定排序条件。

注意:实际开发中,普通APP很少会开放数据接口给其他应用访问,作为服务端接口的ContentProvider基本用不到。内容组件能够派上用场的情况往往是APP想要访问系统应用的通信数据,比如查看联系人、短信、通话记录,以及对这些通信信息进行增删改查。

  • ContentObserver
    通过给目标注册一个观察器,这样能随时观察到相应的事件并做出反应,比如观察到用户收到了短信验证码,就自动把该验证码填入输入框。
    内容观察器的用法与内容提供器类似,也要从ContentProvider派生出一个观察器类,然后通过ContentResolver对象调用相应的方法注册或注销观察器。
    ContnetResolver与观察器有关的方法说明:
  • registerContentObserver:注册内容观察器。
  • unregisterContentObserver:注销内容观察器。
  • notifyChange:通知内容观察器发生了数据变化。

总结

Android四大组件是Android学习的基础,并且每一个组件都有相关功能的特定用途,如Activity是在开发页面活动过程中的重要组件,Service适用于音乐后台播放之类,Broadcast用于全局消息的传递,Content用于客户端与服务端数据的交互,最好的理解方式是在相关的开发项目中进行应用,不断反复巩固理解,才能对四大组件的功能和重要性有一个全面的认知。

你可能感兴趣的:(Android开发系列)