本文开始介绍Android四大组件。
首先说明,对Android四大组件的理解并不是一蹴而就的,而是理论+实战项目。在做项目的过程中又回过来反复看理论,需要经过不断的实战的磨练,才能对它们有很好的理解。
本文也是依照这种思路,在实战中不断总结理解理论本身。
Activity 是与用户交互的入口点。它表示拥有界面的单个屏幕。
Activity 类是 Android 应用的关键组件,而 Activity 的启动和组合方式则是Android平台应用模型的基本组成部分。
简单来说,一个Activity就是一个页面。一个APP中可以有一个Activity,也可以有多个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>
当用户浏览、退出和返回您的应用时,您应用中的 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()
重启页面,重新加载内存中的页面数据。
服务是一个通用入口点,用于因各种原因使应用在后台保持运行状态。它是一种在后台运行的组件,用于执行长时间运行的操作或为远程进程执行作业。服务不提供界面。
简单地说,服务是一种即使用户未与应用交互也可在后台运行的组件,因此,只有在需要服务时才应创建服务。
1.前台:
前台服务执行一些用户能注意到的操作。例如,音频应用会使用前台服务来播放音频曲目。前台服务必须显示通知。即使用户停止与应用的交互,前台服务仍会继续运行。
2.后台:
后台服务执行用户不会直接注意到的操作。例如,对于图片的自动压缩。
3.绑定:
当应用组件通过调用 bindService() 绑定到服务时,服务即处于绑定状态。绑定服务会提供客户端-服务器接口,以便组件与服务进行交互、发送请求、接收结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。
仅当与另一个应用组件绑定时,绑定服务才会运行。多个组件可同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。
如要创建服务,您必须创建 Service的子类(或使用它的一个现有子类)。在实现中,您必须重写一些回调方法,从而处理服务生命周期的某些关键方面,并提供一种机制将组件绑定到服务(如适用)。
1.onCreate(): 创建服务。
2.onStartCommand(): 开始服务。(Android2.0后)
3.onDestory() : 销毁服务。
4.onBind() : 绑定服务。
5.onRebind() : 重新绑定。该方法只有当上次的onUnbind返回true的时候才会被调用。
6.onUnbind() : 解除绑定。返回值为true表示允许再次绑定,再绑定时调用onBind方法。若返回值为false表示只能绑定一次。默认为false。
借助广播接收器组件,系统能够在常规用户流之外向应用传递事件,从而允许应用响应系统范围内的广播通知。由于广播接收器是另一个明确定义的应用入口,因此系统甚至可以向当前未运行的应用传递广播。
广播(Broadcast)用于Android组件之间的灵活通信。
(1)Activity只能一对一通信,而Broadcast可以一对多,一人发送广播,多人接受广播。
(2)对于发送者来说,广播不需要考虑接受者有没有在工作,接收者在工作就接收广播,不在工作就丢弃广播
(3)对于接收者来说,会收到各式各样的广播,所以接收者要自行过滤符合条件的广播才能进行解包处理。
注意: 如果广播是在应用内使用,不需要跨进程,那最好使用LocalBroadcastManager下的registerRecever和unregisterReceiver方法,这样不但更有效率(不需要跨进程通信),而且安全性更高。
内容提供程序管理一组共享的应用数据,您可以将这些数据存储在文件系统、SQLite 数据库、网络中或者您的应用可访问的任何其他持久化存储位置。其他应用可通过内容提供程序查询或修改数据(如果内容提供程序允许)。
ContentProvider为APP存取内部数据提供了统一的外部接口,让不同的应用之间得以共享数据。
与SQLite操作的应用自身的内部数据库;文件上传下载操作后端服务器不同,ContentProvider操作的是本设备其他应用的内部数据,是一种中间层次的数据存储形式。
完整的内容组件由内容提供器ContentProvider,内容解析器ContentResolver,内容观察器ContentObserver,三部分组成。
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想要访问系统应用的通信数据,比如查看联系人、短信、通话记录,以及对这些通信信息进行增删改查。
Android四大组件是Android学习的基础,并且每一个组件都有相关功能的特定用途,如Activity是在开发页面活动过程中的重要组件,Service适用于音乐后台播放之类,Broadcast用于全局消息的传递,Content用于客户端与服务端数据的交互,最好的理解方式是在相关的开发项目中进行应用,不断反复巩固理解,才能对四大组件的功能和重要性有一个全面的认知。