Android 应用通常由一个或多个基本组件组成,前面我们看到 Android 应用中最常用的组件就是 Activity。事实上 Android 应用还可能包括 Service、BroadcastReceiver、ContentProvider 等组件。我们先让读者对这些组件建立一个大致的认识,后面还会对这些组件做更详细的介绍。

1,Activity 和 View

Activity 是 Android 应用中负责与用户交互的组件——大致上可以把它想象成 Swing 编程中的 JFrame 控件。不过它与 JFrame 的区别在于:JFrame 本身可以设置布局管理器,不断地向 JFrame 中添加组件,但 Activity 只能通过 setContentView(View) 来显示指定组件。

View 组件是所有 UI 控件、容器控件的基类,View 组件就是 Android 应用中用户实实在在看到的部分。但 View 组件需要放到容器组件中,或者使用 Activity 将它显示出来。如果需要通过某个 Activity 把指定 View 显示出来,调用 Activity 的 setContentView() 方法即可。

setContentView() 方法可接受—个 View 对象作为参数,例如如下代码:

// 创建一个线性布局管理器
LinearLayout layout = new LinearLayout(this);
// 设置该 Activity 显示 layout
setContentView(layout);

上面的程序通过代码创建了一个 LinearLayou t对象(它是 ViewGroup 的子类,ViewGroup 又是 View 的子类).接着调用 Activity 的 setContentView(layout) 把这个布局管理器显示出来。

setContentView() 方法也可接受一个布局管理资源的 ID 作为参数,例如如下代码:

// 设置该 Activity 显示 main.xml 文件定义的 View
setContentView(R.layout.main);

从这个角度来看,大致上可以把 Activity 理解成 Swing 中的 JFrame 组件。当然,Activity 可以完成的功能比 JFrame 更多,此处只是简单地类比一下。

实际上 Activity 是 Window 的容器,Activity 包含一个 getWindow() 方法,该方法返回谊 Activity 所包含的窗口。对于 Activity 而言,开发者一般不需要关心 Window 对象。如果应用程序不调用 Activity 的 setContentView() 来设置该窗口显示的内容,那么该程序将显示一个空窗口。

Activity 为 Android 应用提供了可视化用户界面,如果该 Android 应用需要多个用户界面,那么这个 Android 应用将会包含多个Activity,多个 Activity 组成 Activity 栈,当前活动的 Activity 位于栈顶。

Activity 色含了一个 setThemeOnt(int resid) 方法束设置其宙门的风格,例如我们希望窗口不显示 ActionBar、以对话框形式显示窗口,都可通过该方法来实现。

2,Service

Service 与 Activity 的地位是并列的,它也代表一个单独的 Android 组件。Service 与 Activity 的区别在于:Service 通常位于后台运行,它一般不需要与用户变互,因此 Service 组件没有图形用户界面。

与 Activity 组件需要继承 Activity 基类相似,Service 组件需要继承 Service 基类。一个 Service 组件被运行起来之后,它将拥有自己独立的生命周期,Service 组件通常用于为其他
组件提供后台服务或监控其他组件的运行状态。

3,BroadcastReceiver

BroadcastReceiver 是 Android 应用中另一个重要的组件,顾名思义,BroadcastReceiver 代表广播消息接收器。从代码实现角度来看,BroadcastReceiver 非常类似事件编程中的监听器。与普通事件监听器不同的是:普通事件监听器脯听的事件源是程序中的对象:而 BroadcastReceiver 监听的事件源是 Android 应用中的其他组件。

使用 BroadcastReceiver 组件接收广播消息比较简单,开发者只要实现自己的 BroadcastReceiver 子类,并重写 onReceive(Context context, Intent intent) 方法即可。当其他组件通过 sendBroadcast()、sendStickyBroadcast() 或 sendOrderedBroadcast() 方法发送广播消息时,如该 BroadcastReceiver 也对该消息 “感兴趣”(通过 IntentFiIter 配置),BroadcastReceiver 的 onReceive(Context context, Intent intent) 方法将会被触发。

开发者实现了自己的 BroadcastReceiver 之后,通常有两种方式来注册这个系统级的 “事件监听器”。

在 Java 代码中通过 Context.registReceiver() 方法注册 BroadcastReceiver。

在 AndroidManifest.xml 文件中使用< raceiver.../> 元素完成注册。

读者此处只要对 BroadcastReceiver 有个大致的印象即可,本书后面的章节还会详细介绍如何开发、使用 BroadcastReceiver 组件。

4,ContentProvider

对于 Android 应用而言,它们必须相互独立,各自运行在自己的 Dalvik 虚拟机实例中,如果这些 Android 应用之间需要实现实时的数据变换。例如我们开发了个发送短信的程序,当发送短信时需要从联系人管理应用中读取指定联系人的数据——这就需要多个应用程序之间进行数据交换。

Android 系统为这种跨应用的数据变换提供了个标准:ContentProvider。当用户实现自己的 ContentProvider 时,需要实现如下抽象方法。

insert(Uri, ContentValues):向 ContentProvider 插入数据。

delete(Uri, ContentValues):删除 ContentProvider 中指定数据。

update(Uri, ContentValues, String, String[]):更新 ContentProvider 中指定数据。

query(Uri,String[], String, String[], String):从 ContentProvider 查询数据。

通常与 ContentProvider 结合使用的是 ContentResolver,一个应用程序使用 ContentProvider 暴露自己的数据,而另一个应用程序则通过 ContentResolver 来访问数据。

5,Intent 和 IntentFilter

严格地说,Intent 并不是 Android 应用的组件,但它对于 Android 应用的作用非常大——它是 Android 应用内不同组件之间通信的载体。当 Android 运行时需要连接不同的组件时,通常就需要借助于 Intent 来实现。Intent 可以启动应用中另一个 Activity,也可以启动一个 Service 组件,还可以发送一条广播消息来触发系统中的 BroadcastReceiver。也就是说, Activity、Service、BroadcastReceiver 三种组件之间的通信都以 Intent 作为载体,只是不同组件使用 Intent 的机制略有区别而己。

当需耍启动一个 Activity 时,可调用 Context 的 startActivity(Intent intent) 或 startActivityForResult(Intent intent, int requestCode) 方法,这两个方法中的 Intent 参数封装了需要启动的目标 Activity 的信息。

当需要启动一个 Service 时,可调用Context 的startService(Intent intent) 方法或 bindService(Intent service, ServiceConnection conn, int ftags) 方法,这两个方法中

更多资源请访问稀酷客(www.ckook.com)的intent参数封装了需要启动的目标Service的信息。

当需要触发一个 BroadcastReceiver 时,可调用 Context 的sendBroadcast(lntent intent)、sandStickyBroadcast(Intent intent) 或 sendOrderedBroadcast(Intent intent, String receiverPermission) 方法来发送广播消息,这三个方法中的 Intent 参数封装了需要触发的目标 BroadcastReceiver 的信息。

通过上面的介绍不难看出.Intent 封装了当前组件需要启动或触发的目标组件的信息,因此有些书上把 Intent 翻译为 “意图”。实际上 Intent 对象里封装了大量关于目标组件的信息,我们后面还会更详细地介绍 Intent 所封装的数据,此处不再深入讲解。

当一个组件通过 Intent 表示了启动或触发另一个组件的 “意图” 之后,这个意图可分为两类。

显式 Intent:显式 Intent 明确指定需要启动或者触发的组件的类名。

隐式 Intent:隐式 Intent 只足指定需要启动或者触发的组件应满足怎样的条件。

对于隐式 Intent 而言,Android 系统无须对该 Intent 做任何解析,系统直接找到指定的目标组件,启动或触发它即可。

对于隐式 Intent 而言,Android 系统需要对该 Intent 进行解析,解析出它的条件,然后再去系统中查找与之匹配的目标组件。如果找到符合条件的组件,就启动或触发它们。

那么 Android 系统如何判断被调用组件是否符合隐式 Intent 呢?这就需要靠 IntentFilter 来实现了,被调用组件可通过 IntentFilter 来声明自己所满足的条件——也就是声明自己到底能处理哪些隐式 Intent。关于 Intent 和 IntentFilter 本书后面还会有进一步阐述,此处不再深入讲解。

Android 学习之路 之 Android应用的基本组件介绍(六)相关推荐

  1. android学习之路(九)---- android相册Gallery2

    android 原生应用 Gallery2编译 下载地址 开发步骤 第一步.编译so文件,在命令行界面,进入Gallery2,执行命令ndk-build,编译源文件 第二步.将生成的libs文件夹下面 ...

  2. android学习之路1:前车之鉴之开发环境搭建

    写程序两年有余了,朝九晚五的拼命工作着,却忘记了我们自己最初的梦想,忘却了最开始站在起跑线时的英姿勃发,渐渐的变成了coder,继续coding中. Android学习之路刚刚开始,目前大米属于小白阶 ...

  3. Android学习之路-----倒计时欢迎界面(更有条理)

    2019独角兽企业重金招聘Python工程师标准>>> Android学习之路-----倒计时欢迎界面(更有条理) 转载于:https://my.oschina.net/symahl ...

  4. 【Android学习之路】之从零开始做一个小项目(一)

    最近在学Android(初学者吖),写下这个[Android学习之路]系列记录一下自己学习的过程,欢迎阅读~

  5. 【Monica的android学习之路】四大组件的生命周期

    [Monica的android学习之路]四大组件的生命周期 1. Service 1.1 启动service 1.1.1 startService 1.1.2 bindService 1.2 死亡回调 ...

  6. Android学习之路4——音乐播放器后台播放

    Android学习之路4--音乐播放器后台播放 一.实验题目 简单音乐播放器 二.实现内容 实现一个简单的播放器,要求功能有: 播放.暂停.停止.退出功能,按停止键会重置封面转角,进度条和播放按钮:按 ...

  7. 【Android学习之路】新手入门Kotlin语言

    入门Kotlin编程语言 Kotlin简介 Kotlin是一种在Java虚拟机上运行的静态类编程语言, 有Android世界的Swift之称,是由JetBrains公司设计开发并且开源的编程语言.早在 ...

  8. Android学习笔记07---查看Android虚拟机输出的错误信息与如何部署应用到自己的真实手机

    Android学习笔记07---查看Android虚拟机输出的错误信息

  9. Android学习笔记----解决“com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536”问题

    Android学习笔记----解决"com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 6553 ...

最新文章

  1. LeetCode简单题之两句话中的不常见单词
  2. CMakeLists.txt从入门到精通
  3. How to open robotium-solo-1.4.0 javadoc.jar to get the information of robotium.
  4. 确认访问用户身份的认证
  5. Python应用实战案例-Python实现K线图绘制
  6. 使用github上已有的开源项目
  7. 数据与知识管理属于计算机科学研究方向中的,知识管理技术与应用
  8. 【STM32】STM32F4时钟系统
  9. 跳一跳python刷分_【Python跳一跳刷分辅助】iPhone版_Python跳一跳刷分辅助Ios最新版下载_Python跳一跳刷分辅助v1.0.1苹果版免费下载 - 九酷苹果网...
  10. 利用Packer自定义镜像创建容器集群
  11. Etherchannel 备忘
  12. Elasticsearch OOM(内存溢出)
  13. 电脑开机一会就蓝屏怎么回事_电脑使用过程中会蓝屏,老板三分钟做系统:硬盘坏了,四百换好!...
  14. 电信测试网速测试在线软件,宽带测速在线测网速(中国电信宽带测速官网)
  15. 读懂了鱼玄机,就读懂了爱情
  16. 计算机网络原理_第8章 局域网技术 之二 令牌环
  17. 银行卡quickpass闪付芯片通过EVM/PBOC读取信息
  18. android 动画 translate,Android动画之TranslateAnimation使用
  19. Sublime 如何替换换行符
  20. 直播、网红和社交网络的Social Media化

热门文章

  1. H.264编码下直播视频添加水印的优化
  2. iOS Firebase关闭控制台日志打印
  3. 为什么手机换张卡就有就显示无服务器,手机卡为何一直显示无服务,但是在自家城市就会有信号。换了个城市就无服务了。...
  4. 基于vue2+element+springboot+mybatis+jpa+mysql的小区物业管理系统
  5. python里的df_python – 从pandas df中删除行
  6. 智能系列 - Js动态拾取图片均色,取得相反的色彩。
  7. 荒野行动 android 鼠标,荒野行动pc版鼠标一直移出去怎么办 荒野行动鼠标出界分析...
  8. 推荐系统里的那些算法——CF
  9. ShareTechnote系列LTE(14):上行链路信号解码
  10. 离职入职过渡期,你的社保谁负责?