初识Android应用程序的五大基本组件
5 Basic Components
1. Activity
2. Service
3. Broadcast Receiver
4. Content Provider
5. Intent
Activity —— 应用表示层( 基类 Activity )
应用程序中的每个屏幕都是通过继承和扩展基类 Activity 来实现的。
同一应用中的每个 Activity 是相互独立的。程序启动后显示的第一幅画面是应用程序的第一个 Activity (默认窗口),而后可以根据需要从这个 Activity 启动另一个新的 Activity 。
Activity 利用 View 来实现应用中的 GUI (用户直接通过 GUI 和应用程序做交互)。 Activity 窗口内的可见内容通过基类 View 提供。使用 Activity.setContentView() 方法设置当前 Activity 中的 View 对象。
l 每个 View 对象控制着窗口内的一个矩形空间;
l View 是一种层次化结构, Parent View 中的布局属性会被子 View 继承;
l 位于 View 层次关系最底层的子 View 对象所代表的矩形空间就是跟用户进行交互的地方
Activity 状态回调:
l onCreate
l onStart
l onRestart
l onResume
l onPause
l onStop
l onDestroy
Service —— 没有可见的用户界面,但能够长时间运行于后台( 基类 Service )
运行于应用程序进程的主线程中,因此 Service 不会阻塞其他组件和用户界面。
Service 是不能自己启动的,必须通过 Context 对象(如一个 Activity )调用 startService 或 bindService 方法来启动(用这两种方法启动的 Service 的生命周期不同)。
1. 调用 startService 方法
a) 若 Service 没有启动,则首先会调用该 Service 的 onCreate 方法,然后再调用 onStart 方法。
b) 若 Service 已经启动,则会直接调用 onStart 方法
c) 该方法启动的 Service ,可以通过 Context 对象调用 stopService 来关闭,也可以通过 Service 自身调用 stopSelf() 或 stopSelfResult() 来关闭,关闭之前调用 onDestory 方法。
2. 调用 bindService 方法,使当前 Context 对象通过一个 ServiceConnection 的对象绑定到所指定的 Service
a) 若 Service 没有启动,则首先会调用该 Service 的 onCreate 方法初始化启动,然后调用 Service 的 onBind 方法初始化绑定。
b) 如果绑定 Service 的 Context 对象被销毁时,被绑定的 Service 也会调用 onUnbind 和 onDestroy 方法停止运行
c) 注意: BroadcastReceiver 是不能绑定服务的。
d) 一个绑定 Service 的 Context 对象还可以通过 unbindService() 来取消对服务的绑定。
e) 取消时, Service 会调用 unbind 方法,若 Service 是通过 bindService 来启动的,还会调用 onDestroy 方法来停止服务。
Service 状态回调:
l onCreate
l onStart
l onBind
l onRebind
l onUnbind
l onDestroy
Broadcast Receiver —— 用户接收广播通知的组件( 基类 BroadcastReceiver )
Android 中的广播要么来自于系统,要么来自普通应用程序。
很多事件都可能导致系统广播,如手机所在时区发生变化,电池电量低,用户改变系统语言设置等。
来自普通应用程序,如一个应用程序通知其他应用程序某些数据已经下载完毕。
为了响应不同的事件通知,应用程序可以注册不同的 Broadcast Receiver 。所有的 Broadcast Receiver 都继承自基类 BroadcastReceiver 。
BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个通知后, BroadcastReceiver 可以启动 Activity 作为响应,或者通过 NotificationMananger 提醒用户。
BroadcastReceiver 是对发送出来的 Broadcast 进行过滤接收并响应的一类组件。
发送 Broadcast 信息
1. 把要发送的信息和用于过滤得信息 ( 如 Action 、 Category) 装入一个 Intent 对象
2. 调用 Context. sendBroadcast() 、 sendOrderBroadcast() 、 sendStickyBroadcast() 方法,广播该 Intent 对象
1. 继承 BroadcastReceiver 类,并实现 onReceive 方法
Content Provider —— 为解决应用程序间数据通信、共享的问题( 基类 ContentProvider )
Content Provider 可以将应用程序特定的数据提供给另一个应用程序使用。其数据存储方式可以是 Android 文件系统、 SQLite 数据库或者其他合理的方式。
要为当前应用程序的私有数据定义 URI ,就需要专门定义一个继承自 ContentProvider 的类,然后根据不同的操作调用的方法去实现这些方法的功能。
Intent 在不同的组件之间传递消息,将一个组件的请求意图传给另一个组件。因此, Intent 是包含具体请求信息的对象。
针对不同的组件, Intent 所包含的消息内容有所不同,且不同组件的激活方式也不同, 且不同类型组件有传递 Intent 的不同方式。
2. Activity.startActivityForResult()
l 启动一个新的服务,或者向一个已有的服务传递新的指令,可以调用如下两种方法:
l 发送广播 Intent( 所有已注册的拥有与之相匹配 IntenFilter 的 BroadcastReceiv 就会被激活 ) ,可以调用如下三种方法:
2. Context.sendOrderBroadcast()
3. Context.sendStickBroadcast()
Intent 对象抽象地描述了执行操作, Intent 的主要组成部分;
a) 组件名称是一个 ComponentName 对象,是目标组件类名和目标组件所在应用程序包的组合
b) 组件中的包名不一定要和 manifes 文件中包名完全匹配
c) 如果 Intent 消息中指明了目标组件的名称,这就是一个显示消息, Intent 会传递给指明的组件。
d) 如果目标组件名称并没有指定, Android 则通过 Intent 内的其他信息和已注册的 IntentFilter 的比较来选择合适的目标组件
b) 理论上 Action 可以为任何字符串,而与 Android 系统应用有关的 Action 字符串以静态字符串常量的形式定义在了 Intent 类中。
a) 描述 Intent 要操作的的数据的 URI 和数据类型。
b) 正确设置 Intent 的数据对于 Android 寻找系统中匹配 Intent 请求的组件很重要。
b) Android 也在 Intent 类中定义了一组静态字符串常量表示 Intent 不同的类别。
a) 当我们使用 Intent 连接不同组件时,有时需要在 Intent 中附加额外的信息,以便将数据传递给目标 Activity 。
b) Extra 用键值对结构保存在 Intent 对象当中, Intent 对象通过调用方法 putExtras() 和 getExtras() 来存储和获取 Extra
c) Extra 是以 Bundle 对象的形式来保存的, Bundle 对象提供了一系列 put 和 get 方法来设置、提取相应键值信息。
d) 在 Intent 类中同样为 Android 系统应用的一些 Extra 的键值定义了静态字符串常量。
n 在显式 Intent 消息中,决定目标组件的唯一要素就是组件名称(不用再定义其他 Intent 内容)
n 而隐式 Intent 消息中,由于没有目标组件名称,所以必须由 Android 系统帮助应用程序寻找与 Intent 请求意图最匹配的组件。
应用程序的组件为了告诉 Android 自己能响应、处理哪些隐式 Intent 请求,可以声明一个甚至多个 IntentFilter 。
每个 IntentFilter 描述该组件所能响应 Intent 请求的能力 —— 组件希望接收什么类型的请求行为,什么类型的请求数据。
隐式 Intent 和 IntentFilter 进行比较时的三要素: Action 、 Data 、 Category 。
一个隐式 Intent 请求要能够传递给目标组件,必需通过以上三个方面的检查。如果任何一方面不匹配, Android 都不会将该隐式 Intent 传递给目标组件。
<data android:type=”” android:scheme=”” android:authority=”” android:path=””/>
a) 一条 <intent-filter> 中至少应该包含一个 <action>, 否则任何 Intent 请求都不能和该 <intent-filter> 匹配。
b) 如果 IntentFilter 中没有包含任何 Actino 类型,那么无论什么 Intent 请求都无法和这条 IntentFilter 匹配。
c) 如果 Intent 请求中没有设定 Action 类型,那么只要 IntentFilter 中包含有 Action 类型,这个 Intent 请求将顺利通过 IntentFilter 的测试。
b) 一个没有指定任何类别的 IntentFilter 仅仅只会匹配没有设置类别的 Intent 请求。
a) <data> 元素指定了希望接受的 Intent 请求的数据 URI 和数据类型: URI 被分成三部分类进行匹配, scheme 、 authority 和 path.
b) 使用 setData 设定的 Intent 请求的 URI 数据类型和 scheme ,必须与 IntentFilter 中指定的一致
若 IntentFilter 中还指定了 authority 或 path ,他们也需要相匹配才会通过测试。
初识Android应用程序的五大基本组件相关推荐
- Android应用程序的五大基本组件
一.Activity -- 应用表示层( 基类 Activity ) 一个活动表示一个可视化的用户界面,关注一个用户从事的事件.例如,一个活动可能表示一个用户可选择的菜单项列表,或者可能显示照片连同它 ...
- android 布局分析,关于Android应用程序界面五大布局的图文分析教程
对于安卓系统应用开发中界面的布局有五大类,分别是LinearLayout(线性布局).FrameLayout(单帧布局).AbsoluteLayout(绝对布局).TablelLayout(表格布局) ...
- Android应用程序组件Content Provider简要介绍和学习计划
在Android系统中,Content Provider作为应用程序四大组件之一,它起到在应用程序之间共享数据的作用,同时,它还是标准的数据访问接口.前面的一系列文章已经分析过Android应用程序的 ...
- Android应用程序进程启动过程的源代码分析(1)
Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持Binder进程间通信机制:这两个特点都是在进程的初始化过程中实 ...
- Android应用程序组件Content Provider的启动过程源代码分析(6)
Step 17. ActivityThread.installProvider 这个函数定义在frameworks/base/core/java/android/app/Act ...
- Android应用程序组件Content Provider的共享数据更新通知机制分析(3)
3. 数据更新通知的发送过程 在前面这篇文章Android应用程序组件Content Provider应用实例介绍的应用程序Acticle中,当调用ArticlesAda ...
- 使用组件构建Android应用程序
原文链接:http://android.eoe.cn/topic/android_sdk 应用程序组件 Android's application framework lets you create ...
- Android应用程序组件Content Provider的启动过程源代码分析(1)
通过前面的学习,我们知道在Android系统中,Content Provider可以为不同的应用程序访问相同的数据提供统一的入口.Content Provider一般是运行在独立的进 ...
- 初识Android四大组件之一Activity(活动)
首先,这是自己学习Android开发1年以来第一次写博客,之前看了很多大佬的技术文章,发现他们也都是从基础开始总结学习的,能及时总结所学知识是一个很好的习惯.温故而知新,可以为师矣.所以,我也寻思着能 ...
最新文章
- 【modbus】libmodbus库的移植与使用
- Solaris下ftp配置(初稿-待补充)
- golang 发送get和post示例
- ZNZD平台vue项目
- STM32 软硬件调试
- windows 使用 tricks
- sqlserver自动备份脚本
- 大一c语言大作业实验报告,大一c语言实验报告
- 演唱会网上订票系统(SSM,JSP,MYSQL)
- 工业树莓派在激光雕刻中的应用
- 工业机器人的构成和分类
- 打印没反应/打印耗时长/not accessible
- Hadoop访问不了9870、8088
- 图书馆座位预约系统管理/基于微信小程序的图书馆座位预约系统
- CF869E The Untended Antiquity 解题报告
- CSS单位之vw、vh、vmin、vmax、%
- 基于CAN的网络管理NM(network management)
- 由浅入深学习Flash制作高射炮游戏(2)
- JSP+servlet+mysql个人博客系统
- Ubuntu 小企鹅输入法fcitx 支持 五笔拼音
热门文章
- [游泳] Sun Yang 1500 Swimming Stroke Analysis London 2012
- Refactor?or Patching?
- Spring源码:IOC容器
- JavaEE的13种核心技术规范
- 用innerHTML给textarea的value赋值,IE下丢失换行
- mysql 密码1045_mysql登录1045错误时 修改登录密码
- Android 指纹调试流程(高通、MTK均适用)
- string会传null吗_JVM 解剖公园(10): String.intern()
- 深度学习之卷积神经网络(4)LeNet-5实战
- ddr读时序波形_测试新体验|如何解决DDR内存系统测试难题?