安卓四大组件总览

        在安卓中四大组件 (Component)指的是:Activity,Service,BroadcastReceiver,ContentProvider。此博客仅仅对安卓中四大组件从整体上进行简单的分析,了解他们在安卓系统框架中处的位置与作用,各组件详细介绍将单独讲解。

首先,我们来看一下这几个类之间各自的继承关系



从上述可以看出四大组件中的Activity,Service组件都继承自Context,即它们都可看做是一个Context(事实上,安卓中的Context包括三种情况,即Application,Service与Activity),而BroadcastReceiver与ContentProvider相对独立,与其它组件在继承上没太大关联。

(一)下面我们看一下安卓官方文档Context的类的描述

从文档描述我们可以知道,Context是一个抽象类,它用来访问特定的资源或者类,是安卓系统中用来管理与操作application-level operations的类。例如,启动Activity,Service组件、注册广播接收者和启动Content Provider组件,接收Intent等。也正因为如此,所以安卓中常用的一些方法都位于Context类中,分别对应对相关组件的操作,比如startActivity对应启动一个Activity,startService/stopService,bindService/unBindService对应Service组件的操作,registerReceiver/unregisterReceiver,sendBroadcast,sendOrderdBroadcast对应BroadcastReceiver的操作,obtainStyledAttributes对应对View的操作(该函数在仔定义View属性集时会用到),openFileInput,openFileOutput,openOrCreateDatabase对应文件及数据库的操作。

注意

1)Context中存在一个重要的方法abstract Context getApplicationContext(),它返回的是一个Context对象,而Context的子类Activity,Service中存在一个类似的方法final Application getApplication(),它返回的是一个Application对象,在安卓四大组件中只有Activity与Service这两大组件中存在getApplication()方法。

2)Context的子类Activity重写了Context的startActivity()方法,一般情况下我们都是在一个Activity中启动另一个Activity,即形成所谓的Activity任务栈,但是如果在Service中调用startActivity()时,因为Service没重写Context的startActivity()方法,所以本质上它调用的是Context的startActivity()方法,此时则必须添加FLAG_ACTIVITY_NEW_TASK flag即

使用intent.setFlag(FLAG_ACTIVITY_NEW_TASK );语句。

3)在使用四大组件时经常需要指定Context参数,该参数本质上是ContextImpl对象,ContextImpl类继承自Context类,它是安卓系统框架自动管理的。



(二)维系安卓四大组件的Intent

首先看一下官方文档对Intent类的描述


从上述文档中可以看出,Intent作为一个动作的抽象描述被执行,Intent是为了降低安卓系统组件交互耦合度而采取的一种通信机制,也正因为如此,所以启动安卓各组件的方法非常相似。

1)Intent用来启动Service与Activity用法一般都相同,即通过Intent intent=new Intent(Context context,Class<?>class);,startActivity(intent)/startService(intent)来启动对应的组件

2)对BroadcastReceiver的启动与上述不同,因为对于BroadcastReceiver一般事先不用指定具体的组件名(这也正是BroadcastReceiver存在的意义)而是通过
intent.setAction(String action)或Intent intent=new Intent(String action)的方式来指定启动对action“感兴趣”的广播,即

Intent intent=new Intent();

intent.setAction(Constants.ACTION_MSG);

sendBroadcast(intent);或

Intent intent=new Intent(Constants.ACTION_MSG);

sendBroadcast(intent);

3)对于上述三种组件传递数据方式都相同,一般通过intent.putExtra(String name,Serializable value);来传递对象或使用其它相应方法传递基本类型数据,

例如在启动广播时,

Intent intent=new Intent();

intent.setAction(Constants.ACTION_MSG);

intent.putExtra(Constants.MSG, msg);

 sendBroadcast(intent);

4)Intent详细介绍请参考博文http://www.cnblogs.com/engine1984/p/4146621.html


转载于:https://www.cnblogs.com/hainange/p/6334100.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为软件研发面试题2

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** from&#xff1a;http://blog.csdn.net/eddy_0825/article/details/1875582 C语言面试…

Spring学习(24)--- AOP之 Aspect instantiation models(aspect实例模式)特别说明

重要&#xff1a; schema-defined aspects只支持singleton model&#xff0c;即 基于配置文件的aspects只支持单例模式 转载于:https://www.cnblogs.com/JsonShare/p/4638475.html

unix网络编程 str_cli epoll 非阻塞版本

unix网络编程 str_cli epoll 非阻塞版本 unix网络编程str_cli使用epoll实现讲了使用epoll配合阻塞io来实现str_cli,这个版本是配合非阻塞io. 可以看到采用非阻塞io以后复杂度大大提升了. 这个版本是在原书select版本基础之上修改而来,可以看出epoll又比select版本复杂了很多,每…

java ee 指南 pdf_Java EE 7权威指南:卷1(原书第5版) 中文pdf

资源名称&#xff1a;Java EE 7权威指南&#xff1a;卷1(原书第5版) 中文pdf第一部分 引言第1章 概述 2第2章 使用教程示例 27第二部分 平台基础知识第3章 资源创建 38第4章 注入 41第5章 打包 44第三部分 Web层第6章 Web应用入门 50第7章 JSF技术 66第8章 Facelets…

中兴面试题2

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** from&#xff1a;http://blog.csdn.net/eddy_0825/article/details/1875566 现在的公司…

java 路径获取文件名称_java 根据文件获取文件名及路径的方法

filelistnew HashMap();/*** 递归方法* param path 文件路径*/public static void find(String path){File filenew File(path);File[] files file.listFiles();//如果文件数组为null则返回if (files null)return;for (int i 0; i < files.length; i) {if (files[i].isDi…

PYTHON招聘需求与技能体系

为什么80%的码农都做不了架构师&#xff1f;>>> 目前国内的招聘Python&#xff0c;基本都是偏向web后台开发&#xff0c;偶有高大上的数据挖掘&机器学习 这是之前(2012年)找工作整理的一些JD&#xff0c;在梳理几年来的笔记&#xff0c;顺带理一理 可以以此建…

C#学习笔记(十一):动态类型

C#是一门静态类型的语言&#xff0c;但是在C#4.0时微软引入了动态类型的概念。 dynamic 关键字dynamic用来定义动态对象&#xff0c;我们来看一下动态类型的一些特性。 调用不同类的相同方法 我们有两个或多个不相关的类&#xff0c;然后运行时需要可以调用到相同名称的方法&am…

c++面试试题

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** from&#xff1a;http://blog.csdn.net/eddy_0825/article/details/1875597 1 …

《FPGA全程进阶---实战演练》第二十一章 电源常用类型:LDO和 DCDC

高速电路中的电源设计 高速电路中的电源设计大概分为两种&#xff0c;一种是集总式架构&#xff0c;一种是分布式架构。集总式架构就是由一个电源输入&#xff0c;然后生成多种所需要的电压。如图1所示。这种架构会增加多个DC/DC模块&#xff0c;这样成本不可控&#xff0c;PCB…

自定义View控件(2—手写实例代码)

1、 步骤: 1.自定义一个类继承于UIView 2.在initWithFrame方法中添加子控件 3.在layoutSubviews中设置子控件的位置 4.提供一个属性保存外界传入的数据(模型对象), 重写setter方法设置子控件的数据 - 类工厂方法(便利构造器) 按照苹果的风格和规范, 一般情况一个用于创建对…

pojo java_Java——POJO总结

一&#xff1a;什么是POJO“Plain Old Java Object”“简单java对象”。POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口&#xff0c;更没有被其它框架侵入的java对象。二&#xff1a;为什么会有POJO&#xff1f;主要是Java的开发者被EJB的繁杂搞怕了&#xff0c;…

MATLAB调用C/C++函数的方法

http://item.taobao.com/item.htm?spma1z10.5-c.w4002-9510581626.24.ZO6sko&id43401674106 精通MATLAB混合编程视频讲解 MATLAB各类函数视频讲解 基于MATLAB的高等数学问题求解 MATLAB函数速查视频讲解 面向对象C视频教程 精通MATLAB混编编程demo及PDF QQ&#xff1a…

迁云架构实践

本文着笔介绍IT互联网化为传统企业带来的技术挑战&#xff0c;并对上云架构最佳实践进行了深入介绍&#xff0c;首发于阿里云&《程序员》联合出品的《凌云》杂志。 作者&#xff1a; 王宇德&#xff0c;张文生 云计算作为信息技术领域的一种创新应用模式&#xff0c;自其诞…

最短路最新心得

如果&#xff0c;上面的图&#xff0c;如果用dij算法&#xff0c;那么dist[4] 4, 是得不到正确的结果的&#xff0c; 这个因为dist[3]先被确定是最小&#xff0c;然后用来更新dist[4] 但是存在负权&#xff0c;使得dist[3]更小&#xff0c;但是我们已经把结点3标记为不可用了…

java canvas 缩放图片_java-GWT:放大和缩小画布绘图

我想应用放大和缩小,并在画布上重新绘制对象,以便在最大和最小缩放级别都能获得清晰的视图.我获得了如何执行操作的参考here,因此我已将画布传递给可缩放图像构造函数而不是图像,并按照所有步骤进行操作.我再次在“ mainDraw”方法中重画对象,但没有得到正确的结果.我知道我缺少…

MATLAB中MEX文件的编写与调试

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com http://item.taobao.com/item.htm?spma1z10.5-c.w4002-9510581626.24.ZO6sko&id43401674106 精通MATLAB混合编程视频讲解 MATLAB各类函数…

数据库设计思考

一&#xff1a;没有完美的数据库设计&#xff0c;只有符合业务的数据库设计&#xff01; 二&#xff1a;我们的数据库设计&#xff0c;在遵守标准&#xff08;三大范式&#xff09;的同时也要考虑客户的体验&#xff01; 有用户才有天下&#xff01; 三&#xff1a;数据库设计时…

performSegueWithIdentifier:sender里边的sender是啥意思

performSegueWithIdentifier:sender里边的sender是啥意思啊&#xff1f;怎样用啊&#xff1f; [self performSegueWithIdentifier:"pushSign" sender:self]; [self performSegueWithIdentifier:"pushSign" sender:sender]; [self performSegueWithIdent…

java wrapper怎么运行_如何从智能合约中生成Java Wrapper

在本文中&#xff0c;我们将了解如何直接从智能合约生成Java Wrapper类以与Java中的智能合约进行交互。从智能合约生成Java Wrapper类有不同的方法&#xff1a;1. Web3j命令行工具和solc2. Web3j命令行工具和Truffle构建生成的工件3. web3j-maven-plugin4. web3j-gradle-plugin…